目前,我的Servlet通过POST请求从网页上的表单接收数据。
我需要对收到的数据执行各种操作,但客户端无需等待此处理完成。我没有发回任何东西。
它现在的工作方式是客户端不断等待,直到发送HTTP响应,但直到doPost()完成才会发生。但我使用doPost()来存储数据&触发对该数据的操作。
我可以使用doPost()简单地存储数据,但是如何在doPost()之外触发对该数据的操作?
答案 0 :(得分:1)
将参数值保存为doPost()方法中的变量。然后将所有长时间运行的操作放在一个新的Thread中。 doPost()方法将完成并发送HTTP响应,而第二个Thread需要很长时间才能完成。
的doPost():
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String x = request.getParameter("x");
String y = request.getParameter("y");
PostProcessing pp = new PostProcessing(x, y);
Thread t = new Thread(pp);
t.start();
}
新主题:
public class PostProcessing implements Runnable{
private String x;
private String y;
public PostProcessing(String x, String y) {
this.x = x;
this.y = y;
}
@Override
public void run() {
x.doSomething();
y.doSomethingelse();
/*LONG RUNNING OPERATIONS GO HERE*/
}
}
答案 1 :(得分:0)
您可以使用
request.getRequestDispatcher("./xy.jsp/html").forward(request, response);
来电者将离开,您可以长时间免费doPost()
编辑: 对不起,没错,我忘记了即使是requestDispatcher也只会在completition之后解雇。 比唯一的其他方法是启动一个新任务/可调用/可运行/线程并委托工作,以便servlet可以返回。
答案 2 :(得分:0)
据我在评论中的讨论所理解,您希望将值保存在变量中,并希望稍后处理它们。因此,出于同样的目的,我们使用会话变量。您可以做的是当您的servlet重新获取这些参数时。然后在会话中使用:
HttpSession session = request.getSession(). //gives you a session object
String uname=request.getparameter("uname); //uname is value you want to save for processing later.
session.setAttribute("username",name); //So sets this variable to session
以后当你想要使用这个变量时你可以通过获取会话然后获取它来将它传递给会话对象。
HttpSession session = request.getSession().
String username = (String)session.getAttribute("uname"); //your name variable was saved with key name uname, session.getattribute will return object, so We are converting it back to String
现在无论你想对uname变量做什么进程,都可以使用你的会话来获取它,并且可以对它进行处理。
有关会话以及如何使用它的更深入的澄清,您可以按照这篇简单的文章:Using Session
答案 3 :(得分:0)
你需要尝试从Servlet做一切吗?
您可以在JMS队列上发布传入数据,并在完成后将控制权返回给调用者。
然后您可以让另一个类从JMS队列中读取数据并异步处理它。