以异步方式将数据从Servlet打印到浏览器

时间:2013-05-23 13:00:50

标签: java servlets asynchronous println

我正在尝试按顺序将数据发送到网页,我确实知道HTML是如何工作的,并且最可能的答案是ajax,但要求是这只能使用java和html。页面通常在其容器中编译,然后将输出作为响应发送到浏览器,我想在不使用AJAX的情况下执行以下操作。

这必须发送日期并将其打印回浏览器而不加载所有5个日期...例如,新的日期必须每5秒出现在网页上,而不是全部在25秒内出现。

有什么想法吗?

        for (int i = 1; i <= 5; i++) {
        out.println("<p>#" + i + " " + new Date() + "</p>");
        out.flush();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
    }

1 个答案:

答案 0 :(得分:0)

解决方案:

OutputStream直接打印到浏览器中,但由于我在工作时有代理,因此代理在打印时会缓存数据,绕过代理解决了这个问题。然后,输出流与浏览器之间没有缓存,允许它直接打印到浏览器的输出中。

通过这个例子,您可以看到数据逐行打印到浏览器窗口中,在显示数据之前不会等待整整25秒。

public void doGet(HttpServletRequest请求,                   HttpServletResponse响应)抛出ServletException,                                                        IOException {     response.setContentType(CONTENT_TYPE);     response.setHeader(“CacheControl”,“no-cache”);     // PrintWriter out = response.getWriter();

OutputStreamWriter osr = new OutputStreamWriter(response.getOutputStream());
BufferedWriter br = new BufferedWriter(osr);

br.append("<html>");
br.append("<head><title>Load</title></head>");
br.append("<body>");
for (int i = 1; i <= 5; i++) {
    br.append("<div>#" + i + " " + new Date() + "</div>");
    br.flush();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        System.out.println("Cannot sleep");
    }
}
br.append("</body></html>");

br.close();

}