我試圖完成的並不是太複雜,但由於我對AJAX不熟悉,所以遇到了一些麻煩。從AJAX調用異步Servlet
當它被實現時,我將擁有一個具有調用異步Servlet的按鈕的JSP。該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();
}
});
有什麼想法?看起來像我單擊按鈕時發生的AJAX調用只接受來自主servlet線程的響應。也許我需要調用異步調用write()
的JavaScript函數?我只是不確定如何做到這一點,或者如果這將是正確的執行方法。
那麼究竟是什麼問題呢?它是這樣一行:request.setAttribute(「org.apache.catalina.ASYNC_SUPPORTED」,true); 如果服務器不支持異步,它應該拋出異常。 – dragon66
當我從本地運行NetBeans時,NetBeans使用的篩選器存在問題。我必須設置這個標誌來使它工作。雖然現場直播,但它沒有這個標誌。 – Zach