我想要完成的事情并不太复杂,但是由于我不精通 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 线程的响应。也许我需要从异步write()
调用中调用 JavaScript 函数?我只是不确定如何执行此操作,或者这是否是正确的执行方法。