【问题标题】:Efficient Way to Handle POST Request Data处理 POST 请求数据的有效方法
【发布时间】:2014-08-30 19:42:21
【问题描述】:

目前我的 Servlet 通过 POST 请求从网页上的表单接收数据。

我需要对收到的数据执行各种操作,但客户端不需要等待此处理完成。我不会寄回任何东西。

它现在的工作方式是客户端不断等待,直到发送 HTTP 响应,但直到 doPost() 完成后才会发生这种情况。但是我使用 doPost() 来存储数据并在该数据上触发操作。

我可以简单地使用 doPost() 存储数据,但是如何在 doPost() 之外触发对该数据的操作?

【问题讨论】:

  • 您想将客户端发送到下一页并让处理发生在后台吗?没错,您的客户可能会因为您的线程正在等待完成处理而被卡住。
  • 我正在使用 jQuery 进行调用,在这种情况下我不需要重定向到任何地方。只是保持在同一页面上。当我构建这个网络应用程序时,我可能会在其他情况下重定向到另一个页面。
  • 当您的表单将数据提交给 servlet 时,dopost 中的处理发生在后台,所以如果您想让客户端保持在同一页面上,他将在同一页面上,直到 dopost 中的处理完成。我不明白你到底想要什么?
  • 取决于客户端,它可能会超时。例如,Java 客户端应用程序通过 URL 向 servlet 发出 POST 请求。如果在某个阈值内未发送响应,则会由于超时而发送错误消息。
  • 我想将参数值保存在变量中,发送响应,然后对这些变量进行处理。我需要进行各种 API 调用并将这些值作为参数等传递。

标签: java post


【解决方案1】:

一个简单的答案是Threads。这个post 很有帮助。

将参数值保存为 doPost() 方法中的变量。然后将所有长时间运行的操作放入一个新线程中。 doPost() 方法将完成并发送 HTTP 响应,而第二个线程需要花费很长时间才能完成。

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*/
}

}

【讨论】:

    【解决方案2】:

    你可以使用

    request.getRequestDispatcher("./xy.jsp/html").forward(request, response);
    

    来电者将离开,您可以长时间运行doPost()

    编辑: 对不起,是的,我忘记了即使 requestDispatcher 也只会在完成后触发。 唯一的其他方法是启动一个新的任务/可调用/可运行/线程并委托工作,以便服务小程序可以返回。

    【讨论】:

    • 我尝试了您的建议,但在 doPost() 完成之前仍未发送响应。
    • 没问题@Florian。无论如何感谢您的建议。
    【解决方案3】:

    据我在 cmets 中的讨论了解,您希望将值保存在变量中并希望稍后处理它们。因此,出于同样的目的,我们使用会话变量。所以您可以做的是当您的 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

    【讨论】:

    • 但是我如何在 doPost() 之后触发处理?我不一定需要会话。我只需要在 doPost() 之后触发一个方法,以便及时将响应发送回客户端,并在发送响应后开始处理。
    【解决方案4】:

    您是否需要尝试从 Servlet 执行所有操作?

    您可以在 JMS 队列上发布传入数据,并在完成后将控制权返回给调用者。

    然后您可以让不同的类从 JMS 队列中读取数据并异步处理它。

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多