如何从同一个servlet递归调用servlet

时间:2010-11-22 15:15:11

标签: java servlets

我想从自己递归调用一个servlet直到我的操作完成。我需要这样做的原因是因为我的托管服务有一个必须满足所有RPC调用的硬截止日期。因此,我需要在可管理的块中拆分操作,并为每个块递归调用servlet,直到操作完成。

我觉得下面的代码应该可以工作,但是在打开并连接HttpURLConnection时它不会调用servlet。也没有错误。任何帮助将不胜感激。

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class ServletExample extends HttpServlet {

HttpServletRequest request;

public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    request = req;

    String strRequestIndex = request.getParameter("requestIndex");
    int intRequestIndex = 0;

    if (strRequestIndex != null) {
        intRequestIndex = Integer.parseInt(strRequestIndex);
    }

    if (intRequestIndex < 10) {
        try {
            callSameServlet(intRequestIndex);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

private void callSameServlet(int requestIndex) throws Exception {

    URL recursiveUrl = new URL(request.getRequestURL().toString()
            + "?requestIndex=" + (requestIndex + 1));

    HttpURLConnection connection = (HttpURLConnection) recursiveUrl
            .openConnection();

    connection.setRequestMethod("POST");
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);
    connection.connect();

    DataOutputStream dos = new DataOutputStream(
            connection.getOutputStream());

    dos.flush();
    dos.close();

}

}

1 个答案:

答案 0 :(得分:2)

关于你问题中暴露的技术问题:URLConnection被懒惰地执行了。代码中的URLConnection#getOutputStream()仅返回写入请求正文的句柄。您需要使用URLConnection#getInputStream() 实际触发HTTP请求并获取响应正文。

另见:


您的代码中存在更多问题:

你正在发出一个POST请求,但是你的servlet中没有一个doPost()方法被定义。您需要触发正常的GET或实现doPost()。但是,通过调查上面链接中描述的获得的错误响应,这将是显而易见的。

此外,您的servlet不是线程安全的。您永远不应该声明/分配请求/会话作用域数据作为servlet的实例变量。阅读this answer了解详情。

最后,您是否考虑过使用RequestDispatcher#include()?这将在内部处理,并节省您触发HTTP请求的成本/开销。

request.getRequestDispatcher("servleturl").include(request, response);

然后,您可以使用请求属性而不是请求参数。顺便说一下,整个功能要求没有多大意义。我只是在你想要递归执行的代码上使用forwhile循环。但这是一个不同的问题。