我想要完成的事情并不太复杂,但由于我不太熟悉 AJAX,所以遇到了一些麻烦。
实现后,我将拥有一个 JSP,其中有一个调用异步 Servlet 的按钮。 servlet 将运行一个长时间运行的任务,并在部分任务完成时通过向表中添加行来向用户提供动态反馈。
在尝试编写最终版本之前,我正在进行概念验证,以了解其工作原理。然而,我遇到了障碍。当我在单击按钮时使用 AJAX 调用时,当调用的是常规同步 servlet 时,该函数将按预期工作。但是,一旦我使 servlet 异步,更新就不会显示。
有人能够提供一些关于出了什么问题的见解吗?
我的 JSP 看起来像这样:
<html>
<body>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
$('#mybutton').click(function() {
$.get('someservlet', function(responseJson) {
$.each(responseJson, function(index, item) {
$('<ul>').appendTo('#somediv');
$('<li>').text(item.row1).appendTo('#somediv');
$('<li>').text(item.row2).appendTo('#somediv');
$('<li>').text(item.row3).appendTo('#somediv');
$('<li>').text(item.row4).appendTo('#somediv');
});
});
});
});
</script>
<p><button id="mybutton">Click to add things</button></p>
<div id="somediv"></div>
</body>
</html>
我的异步 ServletdoGet()
方法如下所示:
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
final AsyncContext asyncContext = request.startAsync();
final PrintWriter writer = response.getWriter();
asyncContext.setTimeout(10000);
asyncContext.start(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
List<Row> rows = new ArrayList<Row>();
rows.add(new Row(i, i + 1, i + 2, i + 3));
String json = new Gson().toJson(rows);
writer.write(json);
writer.flush();
log.info("Wrote to JSON: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
}
asyncContext.complete();
}
});
有什么想法吗?当我单击按钮时发生的 AJAX 调用似乎只接受来自主 servlet 线程的响应。也许我需要从异步调用 JavaScript 函数write()
打电话?我只是不确定如何执行此操作,或者这是否是正确的执行方法。