Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/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
如何集成AJAX和JavaEEServlet3异步响应_Java_Ajax_Servlet 3.0 - Fatal编程技术网

如何集成AJAX和JavaEEServlet3异步响应

如何集成AJAX和JavaEEServlet3异步响应,java,ajax,servlet-3.0,Java,Ajax,Servlet 3.0,我正在考虑如何使AJAX利用Servlet3异步响应。在请求-响应同步处理模型中,当响应返回时,XmlHttpRequest的回调可以得到响应文本;但是,如果响应在另一个线程中处理,并返回一些消息,那么当请求结束时,XHR将得到什么呢?它还能得到响应体吗?我尝试了一个简单的代码来测试它,似乎没有得到响应 我可以理解这一点,当AJAX请求返回时,响应中没有任何内容,它将在另一个服务器线程中延迟,因此回调将一无所获 但是我想知道有没有办法让AJAX得到正确的响应?恐怕我以前犯了一个错误,在异步处理完

我正在考虑如何使AJAX利用Servlet3异步响应。在请求-响应同步处理模型中,当响应返回时,XmlHttpRequest的回调可以得到响应文本;但是,如果响应在另一个线程中处理,并返回一些消息,那么当请求结束时,XHR将得到什么呢?它还能得到响应体吗?我尝试了一个简单的代码来测试它,似乎没有得到响应

我可以理解这一点,当AJAX请求返回时,响应中没有任何内容,它将在另一个服务器线程中延迟,因此回调将一无所获


但是我想知道有没有办法让AJAX得到正确的响应?

恐怕我以前犯了一个错误,在异步处理完成后,我忘记调用asycontext.complete()。调用complete()后,ajax将获得响应。但是,如果处理持续时间超过超时设置,则会出现异常,表明asynccontext的状态非法,客户端将一无所获:

    final AsyncContext ac = request.startAsync();


   ac.setTimeout(1000);


    Executors.newSingleThreadExecutor().execute(new Runnable(){

        @Override
        public void run() {
            PrintWriter pw;
            try {
                Thread.sleep(2000);
                pw = ac.getResponse().getWriter();
                pw.write("Hello, World!");
                ac.complete();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    });

所以我猜这里的关键是:1。处理完成后呼叫完成;2.设置适当的超时时间

请看这里了解更多信息。我通读了这篇文章,它似乎与我的问题无关。实际上,我想在客户端使用AJAX,而在服务器端使用Servlet3异步处理。但是,在处理完成后,如何从服务器获取响应呢?有可能吗?这篇文章确实谈到了这一点。关键是持久的http连接。这里有一个关于它的教程,谢谢,这是我想要的。然而,读完这篇文章后,我觉得Servlet3异步处理使AJAX处理更加复杂。但它确实有效。我不确定它是否比现在更复杂。显然,这不是解决所有问题的办法。如果我知道AJAX调用需要一段时间才能响应(长时间运行的存储过程或类似的东西),我会使用它。这样,我就不会锁定该线程,而是使用持久HTTP连接返回响应。