有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是处理请求后数据的有效方法

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

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

它现在的工作方式是客户端持续等待,直到发送HTTP响应,但直到doPost()完成后才会发生。但是我使用doPost()来存储数据&;触发对该数据的操作

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


共 (4) 个答案

  1. # 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. # 2 楼答案

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

    稍后,当您想要使用这个变量时,您可以通过获取session来获取它,然后通过将其密钥传递给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. # 3 楼答案

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

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

    然后,您可以让另一个类从JMS队列读取数据并异步处理它

  4. # 4 楼答案

    你可以用

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

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

    编辑: 很抱歉,没错,我忘记了即使是requestDispatcher也只有在完成后才会被激发。 唯一的其他方法是启动一个新任务/callable/runable/thread并委托工作,以便servlet可以返回