То, что я пытаюсь выполнить, не слишком сложное, но у меня проблемы, поскольку я не очень разбираюсь в AJAX.Вызов асинхронного сервлета от AJAX
Когда он будет реализован, у меня будет JSP, у которого есть кнопка, которая вызывает асинхронный сервлет. Сервлет выполнит долговременную задачу и предоставит динамическую обратную связь пользователю, добавив строки в таблицу, когда части задачи будут завершены.
Прежде чем я попытаюсь написать окончательную версию, я делаю доказательство концепции, чтобы понять, как это будет работать. Однако я сталкиваюсь с проблемой. Когда я использую вызов AJAX при нажатии кнопки, функция работает так, как ожидалось, когда вызов выполняется для обычного синхронного сервлета. Однако, как только я делаю сервлет асинхронным, обновления не отображаются.
Может ли кто-нибудь дать представление о том, что происходит не так?
My 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, который возникает, когда я нажимаю кнопку, принимает только ответ из основного потока сервлета. Возможно, мне нужно вызвать функцию JavaScript из асинхронных вызовов write()
? Я просто не знаю, как это сделать или если это будет правильный метод исполнения.
Так где же проблема? Это строка: request.setAttribute ("org.apache.catalina.ASYNC_SUPPORTED", true); Если сервер не поддерживает async, он должен был исключить исключение. – dragon66
Когда я запускаюсь из NetBeans локально, есть проблемы с фильтрами, которые использует NetBeans. Я должен установить этот флаг, чтобы он работал. Однако при развертывании он работает без этого флага. – Zach