设置AJAX进度条

时间:2010-09-30 10:28:14

标签: java javascript ajax servlets progress-bar

好的我是AJAX新手。有点了解请求的生命周期,IE使用像这样的ActiveXObject。

然而现在我面临着一个现实世界的问题。我有一个在后台运行的servlet执行许多任务,我想显示一个进度条来显示进程的位置,并显示实际发生的事情。

到目前为止,在服务器端,我可以计算在开始之前将要发生的进程数,并且在每个进程完成后很容易添加一个计数器来增加 - 从而使我能够找到我希望显示的百分比。 / p>

就我应该输出从递增等收集的数据而言,我目前还不确定它在处理java类中是2个整数。

非常感谢任何帮助。

到目前为止,我已经看了this,我想这就是我的目标。

干杯。

1 个答案:

答案 0 :(得分:5)

基本上,您希望存储对任务的引用,以及它在HTTP会话中的进度(如果它涉及应用程序范围的任务,则存储在Servlet上下文中)。这样,您必须能够在每个HTTP请求上检索有关它的信息。

在JavaScript中,您可以使用setTimeout()setInterval()在特定超时后或以特定间隔执行某个功能。您可以使用它来重复触发Ajax请求以请求进度的当前状态。一旦检索到状态,例如在最大值为100(百分比)的整数的味道中,只需在HTML DOM树中相应地更新表示进度条和/或文本百分比的div。

jQuery非常有助于触发ajaxical请求并遍历/操作HTML DOM树。它最大限度地减少了代码冗长和交叉浏览器兼容性问题。

想象一下,servlet的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.
        }
    });
}