По сути, вы хотели бы сохранить ссылку на задачу и, по сути, также ее ход в сеансе HTTP (или в контексте сервлета, если это касается задачи всего приложения). Таким образом, вы должны иметь возможность получать информацию о нем по каждому HTTP-запросу.
В JavaScript вы можете использовать setTimeout()
или setInterval()
для выполнения функции после определенного времени ожидания или через определенные интервалы. Вы можете использовать это для многократного запуска запросов Ajax для запроса текущего статуса процесса. Как только статус получен, например, в виде целого числа с максимальным значением 100 (процент), просто обновите некоторый div, представляющий индикатор выполнения и / или текст процентного соответственного значения в дереве HTML DOM.
jQuery очень полезен для запуска аяксических запросов и обхода / манипулирования деревом HTML DOM. Это минимизирует детализацию кода и проблемы совместимости между браузерами.
Представьте себе, что doGet()
сервлета выглядит так:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String processId = "longProcess_" + request.getParameter("processId");
LongProcess longProcess = (LongProcess) request.getSession().getAttribute(processId);
int progress = longProcess.getProgress();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(String.valueOf(progress));
}
Тогда вы можете использовать его следующим образом:
function checkProgress() {
$.getJSON('progressServlet?processId=someid', function(progress) {
$('#progress').text(progress + "%");
$('#progress .bar').width(progress);
if (parseInt(progress) < 100) {
setTimeout(checkProgress, 1000); // Checks again after one second.
}
});
}