UML软件工程组织

Ajax基础教程 - 4.5 显示进度条
作者:(美)阿斯利森 舒塔   出处:csdn

4.5 显示进度条

无一例外地,几乎每个应用都会时不时地调用一个长时间运行的事务。如果你关心系统的可用性,就要确保用户能很容易地看到系统的状态。如果是一个胖客户应用,对于长时间运行事务的问题,解决办法很简单:只需显示一个进度条,以便用户知道目前所处状况。不过,在Ajax之前,要在Web应用中做到这一点很不容易。本节将使你了解如何使用Ajax为Web应用建立进度条。

在代码清单4-9所示的例子中,再次在pollCallback()方法中使用了setTimeout(),从而每隔2秒调用一次服务器。在processResult()方法中,只是从服务器查找已完成比例(百分数)的第一位数字,从而得出要将进度条中的哪些进度块着色(灰色)。

代码清单4-9 progressBar.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

 

<html>

  <head>

    <title>Ajax Progress Bar</title>

    <script type="text/javascript">

        var xmlHttp;

        var key;

        var bar_color = 'gray';

        var span_id = "block";

        var clear = "&nbsp;&nbsp;&nbsp;"

 

        function createXMLHttpRequest() {

            if (window.ActiveXObject) {

                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

            }

            else if (window.XMLHttpRequest) {

                xmlHttp = new XMLHttpRequest();

            }

        }

 

        function go() {

            createXMLHttpRequest();

            checkDiv();

            var url = "ProgressBarServlet?task=create";

            var button = document.getElementById("go");

            button.disabled = true;

            xmlHttp.open("GET", url, true);

            xmlHttp.onreadystatechange = goCallback;

            xmlHttp.send(null);

        }

 

        function goCallback() {

            if (xmlHttp.readyState == 4) {

                if (xmlHttp.status == 200) {

                    setTimeout("pollServer()", 2000);

                }

            }

        }

 

        function pollServer() {

            createXMLHttpRequest();

            var url = "ProgressBarServlet?task=poll&key=" + key;

            xmlHttp.open("GET", url, true);

            xmlHttp.onreadystatechange = pollCallback;

            xmlHttp.send(null);

        }

 

        function pollCallback() {

            if (xmlHttp.readyState == 4) {

                if (xmlHttp.status == 200) {

                    var percent_complete =

                           xmlHttp.responseXML

                               .getElementsByTagName("percent")[0].firstChild.data;

 

                    var index = processResult(percent_complete);

                    for (var i = 1; i <= index; i++) {

                        var elem = document.getElementById("block" + i);

                        elem.innerHTML = clear;

 

                        elem.style.backgroundColor = bar_color;

                        var next_cell = i + 1;

                        if (next_cell > index && next_cell <= 9) {

                            document.getElementById("block" + next_cell)

                                  .innerHTML =

                                        percent_complete + "%";

                        }

                    }

                    if (index < 9) {

                        setTimeout("pollServer()", 2000);

                    } else {

                        document.getElementById("complete").innerHTML = "Complete!";

                        document.getElementById("go").disabled = false;

                    }

                }

            }

        }

 

        function processResult(percent_complete) {

            var ind;

            if (percent_complete.length == 1) {

                ind = 1;

            } else if (percent_complete.length == 2) {

                ind = percent_complete.substring(0, 1);

            } else {

                ind = 9;

            }

            return ind;

        }

 

        function checkDiv() {

            var progress_bar = document.getElementById("progressBar");

            if (progress_bar.style.visibility == "visible") {

                clearBar();

                document.getElementById("complete").innerHTML = "";

            } else {

                progress_bar.style.visibility = "visible"

            }

        }

 

        function clearBar() {

            for (var i = 1; i < 10; i++) {

                var elem = document.getElementById("block" + i);

                elem.innerHTML = clear;

                elem.style.backgroundColor = "white";

            }

        }

 

    </script>

  </head>

  <body>

    <h1>Ajax Progress Bar Example</h1>

    Launch long-running process:

           <input type="button" value="Launch" id="go" onclick="go();"/>

    <p>

    <table align="center">

        <tbody>

            <tr><td>

                <div id="progressBar"

                    style="padding:2px;border:solid black 2px;visibility:hidden">

                    <span id="block1">&nbsp;&nbsp;&nbsp;</span>

                    <span id="block2">&nbsp;&nbsp;&nbsp;</span>

                    <span id="block3">&nbsp;&nbsp;&nbsp;</span>

                    <span id="block4">&nbsp;&nbsp;&nbsp;</span>

                    <span id="block5">&nbsp;&nbsp;&nbsp;</span>

                    <span id="block6">&nbsp;&nbsp;&nbsp;</span>

                    <span id="block7">&nbsp;&nbsp;&nbsp;</span>

                    <span id="block8">&nbsp;&nbsp;&nbsp;</span>

                    <span id="block9">&nbsp;&nbsp;&nbsp;</span>

                </div>

            </td></tr>

            <tr><td align="center" id="complete"></td></tr>

        </tbody>

    </table>

  </body>

</html>

这个例子的服务器代码“模拟”了一个长时间运行的事务(见代码清单4-10)。在真实环境中,这期间可能还要同时创建多个新实例并注册,之前还需要客户发出请求。为简单起见,我们忽略了这点,也没有编写线程代码。

代码清单4-10 ProgressBarServlet.java

 

package ajaxbook.chap4;

 

import java.io.*;

 

import javax.servlet.*;

import javax.servlet.http.*;

 

public class ProgressBarServlet extends HttpServlet {

    private int counter = 1;

 

    /** Handles the HTTP <code>GET</code> method.

     * @param request servlet request

     * @param response servlet response

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

        String task = request.getParameter("task");

        String res = "";

 

        if (task.equals("create")) {

            res = "<key>1</key>";

            counter = 1;

        }

        else {

            String percent = "";

            switch (counter) {

                case 1: percent = "10"; break;

                case 2: percent = "23"; break;

                case 3: percent = "35"; break;

                case 4: percent = "51"; break;

                case 5: percent = "64"; break;

                case 6: percent = "73"; break;

                case 7: percent = "89"; break;

                case 8: percent = "100"; break;

            }

            counter++;

 

            res = "<percent>" + percent + "</percent>";

        }

        PrintWriter out = response.getWriter();

        response.setContentType("text/xml");

        response.setHeader("Cache-Control", "no-cache");

        out.println("<response>");

        out.println(res);

        out.println("</response>");

        out.close();

    }

}

图4-10显示了实际工作中的进度条,图4-11显示了完成时的情况。

图4-10 进度条示例

图4-11 进度条完成

 

上一页     首页    下一页

 

版权所有:UML软件工程组织