私が達成しようとしていることはそれほど複雑ではありませんが、AJAX に精通していないため、少し苦労しています。
実装すると、非同期サーブレットを呼び出すボタンを持つ JSP が作成されます。サーブレットは長時間実行されるタスクを実行し、タスクの一部が完了するとテーブルに行を追加してユーザーに動的なフィードバックを提供します。
最終バージョンを作成する前に、これがどのように機能するかを理解するために概念実証を行っています。しかし、私は思わぬ障害に遭遇しています。ボタンをクリックして AJAX 呼び出しを使用すると、呼び出しが通常の同期サーブレットに対するものである場合、関数は期待どおりに動作します。ただし、サーブレットを非同期にするとすぐに、更新が表示されません。
何がうまくいかないのかについての洞察を提供できる人はいますか?
私の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>
私の非同期サーブレット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 呼び出しは、メインのサーブレット スレッドからの応答のみを受け入れるようです。おそらく、非同期write()
呼び出しから JavaScript 関数を呼び出す必要がありますか? これを行う方法、またはこれが正しい実行方法であるかどうかはわかりません。