我想要实现的事情并不太复杂,但由于我不熟悉AJAX,所以有些困难。
在实现时,我会有一个JSP页面,其中包含一个按钮,点击按钮后会调用异步Servlet。该Servlet会执行一个长时间运行的任务,并通过在任务完成部分时向表格添加行来向用户提供动态反馈。
在尝试编写最终版之前,我正在进行概念验证,以了解它的工作原理。但是,我遇到了一些问题。当我使用AJAX调用来点击按钮时,如果该调用指向常规同步Servlet,则函数按预期工作。但是,一旦我将servlet设置为异步,更新就不会显示。
是否有人能为我提供一些出了什么问题的见解?
我的JSP页面如下:
我的异步Servlet的
在实现时,我会有一个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>
我的异步Servlet的
doGet()
方法如下所示: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();
}
});
有什么想法吗?当我点击按钮时,似乎只能接受来自主 servlet 线程的 AJAX 响应。也许我需要从异步write()
调用中调用 JavaScript 函数?我不确定如何做这件事或者是否这样执行是正确的。