Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从同一个servlet递归调用servlet_Java_Servlets - Fatal编程技术网

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

Java 如何从同一个servlet递归调用servlet,java,servlets,Java,Servlets,我希望递归地从servlet本身调用servlet,直到操作完成。我之所以需要这样做,是因为我的托管服务有一个硬性的期限,所有RPC调用都必须满足这个期限。因此,我需要将操作分解为可管理的块,并为每个块递归调用servlet,直到操作完成 我觉得下面的代码应该可以工作,但在打开并连接HttpURLConnection时,它并没有调用servlet。也没有抛出任何错误。任何帮助都将不胜感激 import java.io.DataOutputStream; import java.io.IOExce

我希望递归地从servlet本身调用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();

}

}
import java.io.DataOutputStream;
导入java.io.IOException;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
@抑制警告(“串行”)
公共类ServletExample扩展了HttpServlet{
HttpServletRequest请求;
公共无效数据集(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
请求=请求;
字符串strRequestIndex=request.getParameter(“requestIndex”);
int-intRequestIndex=0;
if(strRequestIndex!=null){
intRequestIndex=Integer.parseInt(strRequestIndex);
}
if(intRequestIndex<10){
试一试{
callSameServlet(intRequestIndex);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
私有void callSameServlet(int requestIndex)引发异常{
URL recursiveUrl=新URL(request.getRequestURL().toString())
+“?requestIndex=“+(requestIndex+1));
HttpURLConnection连接=(HttpURLConnection)递归URL
.openConnection();
connection.setRequestMethod(“POST”);
connection.setDoInput(true);
connection.setDoOutput(真);
connection.setUseCaches(false);
connection.connect();
DataOutputStream dos=新的DataOutputStream(
connection.getOutputStream());
dos.flush();
dos.close();
}
}

至于您的问题中暴露的技术问题:
URLConnection
是延迟执行的。代码中的只返回一个句柄来写入请求正文。您需要使用来实际触发HTTP请求并获得响应正文

另见:

但是,您的代码中还有更多问题:

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

此外,您的servlet不是线程安全的。决不能将请求/会话范围的数据声明/分配为servlet的实例变量。阅读了解更多

最后,你考虑用代替了吗?这将在内部处理,并为您节省触发HTTP请求的成本/开销

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

然后可以使用请求属性而不是请求参数。顺便说一下,整个功能需求没有什么意义。我只想对或
使用
,而
循环您希望递归执行的代码。但这是另一个问题。

在callSameServlet中,您可以使用POST请求,但会覆盖HttpServlet.doGet()。对吗?如果调用1执行调用2,调用1不需要等待调用2完成吗?除非我遗漏了什么,否则你的策略是有缺陷的。你回答的第二部分与我的想法非常相似。谢谢你的帮助。我确实尝试使用RequestDispatcher,但收到一个InvalidState错误。似乎响应已经提交,因此我无法执行任何操作,例如转发或重定向响应。那么代码中的内容比您在问题中所显示的要多。您不应该在最后一次迭代之前提交响应。