javascript - Servlet/Javascript 分块

标签 javascript servlets

我正在尝试从头开始设计一个系统,我想在其中通过 servlet 加载文本行。生产线的生产需要一些时间。因此,我希望能够在它们到达时在我的浏览器中逐步显示它们,一次显示几个。我想从 javascript 向我的 servlet 发送一个请求。

我一直在研究这个问题,但找不到解决方案。我需要在我的 servlet 中做什么才能一次刷新几行?我需要在我的 javascript 中做什么来检索这些刷新的行直到流结束?是否可能,或者我是否需要对我的 servlet 的多个请求进行分页?

谢谢

最佳答案

在服务器端,您可以组合使用请求的Reader,以及响应的WriterflushBuffer 方法的组合。

这个想法是从传入流中读取一大块数据,例如使用 getLine,然后在服务器上以某种方式处理该行,然后使用 getWriter.write 将一些信息 block 写入响应,然后是 flushBuffer.

例如:

override def service(req: HttpServletRequest, res: HttpServletResponse) {

  val r = req.getReader

  def echoLines: Unit =
    Option(r.readLine) foreach { line => // read a chunk from the request

      // simulate slow server-side processing
      Thread.sleep(1000)

      // write a chunk to the response
      res.getWriter.write("read line: " + line + "\n")

      // force the response buffer to be written to the client
      res.flushBuffer

      // repeat until the request is completely processed
      echoLines
    }

  echoLines
}

您可以使用 curl 进行测试(确保使用 -N 选项):

curl -N -X POST --data-binary @test.txt localhost:8080

在客户端,当 XHR readyState3(处理请求)时,您可以让您的代码使用react:

<html>
  <head>
    <script>
      function go() {
        var xhr;
        if (window.XMLHttpRequest) {
          // IE7+, Firefox, Chrome, Opera, Safari
          xhr = new XMLHttpRequest();
        } else {
          // code for IE6, IE5
          xhr = new ActiveXObject('Microsoft.XMLHTTP');
        }
        xhr.onreadystatechange=function() {
          if (xhr.readyState == 3 && xhr.status == 200) {
            var out = document.getElementById('out');
            out.innerHTML = xhr.responseText;
          }
        }
        xhr.open('POST', '/echo', true);
        xhr.send('hello\nworld\n\n1\n2\n3\n4\n5');
      }
    </script>
  </head>
  <body onload="go()">
    <pre id="out"></pre>
  </body>
</head>

关于javascript - Servlet/Javascript 分块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23095434/

相关文章:

javascript - Phonegap 3.0 和 android 后退按钮

javascript - 使用 ReactJS 和 Map 函数映射 ListItem

java - JSP Maven 项目不会在 Eclipse 中包含 src 文件夹

java - 如何在速度工具中获取 HttpServletRequest?

javascript - jQuery 可排序发布数据,但没有数据

javascript - 如何将 javascript postData 转换为 Python 列表?

forms - Spring MVC 表单操作 POST 方法不重定向

java - JAX-RS/Jersey 异步响应处理

java - Struts JSON 插件总是设置 null 值

javascript - 将带有句号的单词拆分为单独的字符范围,包括句号