阅读分块响应

时间:2014-09-24 05:29:50

标签: java jsp http servlets transfer-encoding


我正在尝试在servlet中读取一个文件并将其作为chunked消息发送(响应)到jsp,在那里我可以在浏览器中看到它作为纯文本。
这是我尝试过的:
的Servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/plain");
    response.setHeader("Transfer-Encoding", "chunked");
    response.setHeader("Connection", "keep-alive");
    //response.flushBuffer();
    try (PrintWriter writer = response.getWriter();BufferedReader br = new BufferedReader(new FileReader("/some/file/path.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                writer.println(line);
                try{Thread.sleep(500);}
                catch(InterruptedException e){}
            }
    }
}

JSP:

<head>
<meta charset="UTF-8">
<title>example</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
    $(document).ready(function() {                                   
      $.get('/project/trial', function(responseText) {
        $('#message').text(responseText);                  
      });
  });
</script>
</head>
<body>
<div id="message"></div>
</body>

我需要每隔500毫秒用新行更新页面而不刷新页面,而是在读完整个文件后我一次得到整个文件。
难道我做错了什么?我错过了什么吗? 我的jsp是否正确?
我在网上尝试了很多资源但却找不到我所遗漏的内容 有没有任何例子可以让我获得有关阅读和写作的分块响应的支持?

提前致谢。

1 个答案:

答案 0 :(得分:2)

我认为您实际上想要做的是实施Comet版本,也称为server pushing。这可以通过Ajax完成,但需要仔细准备。

执行此操作的一种方法是利用multipart/x-mixed-replace MIME类型向客户端发送更新的内容。可以找到here的一个示例(请注意,该示例中使用的边界不符合MIME,恕我直言。部件之间的边界应该看起来像{$bondary}--,而最后一个应该是{$boundary}<CR><LF>)。然而,这是以MSIE功能受损为代价的。

可以在ajaxpatterns.org找到一些替代方案中的可比实施列表。无论如何,你应该确保在写出一行后你的输出编写器实际上被刷新了。