Servlet 3.0中的AsyncContext无限浏览器加载

时间:2012-05-07 17:19:49

标签: java html servlets

我要制作流式传输。我有.jsp文件,在.jsp文件的末尾我使用以下代码包含我的Async Servlet:

<jsp:include page = '/simple' flush = 'true' />

所以我希望在加载整个页面时打开一个无限的异步请求,它将处理异步响应。

这是我的Servlet代码:

public class SimpleAsyncServlet extends HttpServlet {
    public static AsyncContext ctx;
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
        ctx = req.startAsync();
        ctx.setTimeout(0);
    }
}

从其他java类我使用静态SimpleAsyncServlet.ctx.getResponse.getWriter()将一些javascript代码打印到当前页面。它没有任何问题,但浏览器继续显示它正在加载。根据异步的想法页面应该被加载,这个异步请求应该在后台保持活着...就是这样,但没有....浏览器一直加载页面直到永远(超时是0,我希望有无限的开放请求)

我错在哪里,如果没有加载浏览器,如何才能发出此永久请求?

P.S。我试图直接从url(localhost ... / simple)访问我的servlet,然后我看不到页面上打印的内容。它一直装载到永远。

1 个答案:

答案 0 :(得分:1)

你正试图实现不可能的事。

浏览器将显示页面正在加载,直到它知道它已通过以下方法之一收到完整请求:

  • 它已收到Content-Length标题中所述的数字字节
  • 连接已关闭
  • 在使用分块编码时收到了一个结束块

由于您需要“无限”响应,因此上述三个选项都不会发生。