我正在尝试从头开始设计一个系统,我想在其中通过 servlet 加载文本行。生产线的生产需要一些时间。因此,我希望能够在它们到达时在我的浏览器中逐步显示它们,一次显示几个。我想从 javascript 向我的 servlet 发送一个请求。
我一直在研究这个问题,但找不到解决方案。我需要在我的 servlet 中做什么才能一次刷新几行?我需要在我的 javascript 中做什么来检索这些刷新的行直到流结束?是否可能,或者我是否需要对我的 servlet 的多个请求进行分页?
谢谢
最佳答案
在服务器端,您可以组合使用请求的Reader
,以及响应的Writer
和flushBuffer
方法的组合。
这个想法是从传入流中读取一大块数据,例如使用 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 readyState
为 3
(处理请求)时,您可以让您的代码使用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/