明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

JSP編程進度條設(shè)計案例(5)

[摘要]頁面底部提供了一個按鈕,用戶可以用它來停止或重新啟動任務: <TR> <TD ALIGN="CENTER"> <BR> <% if (task.isRun...
頁面底部提供了一個按鈕,用戶可以用它來停止或重新啟動任務:


<TR>
            <TD ALIGN="CENTER">
                <BR>
                <% if (task.isRunning()) { %>
                    <FORM METHOD="GET" ACTION="stop.jsp">
                        <INPUT TYPE="SUBMIT" VALUE="停止">
                    </FORM>
                <% } else { %>
                    <FORM METHOD="GET" ACTION="start.jsp">
                        <INPUT TYPE="SUBMIT" VALUE="開始">
                    </FORM>
                <% } %>
            </TD>
        </TR>
    </TABLE>
</BODY></HTML>


  只要不停止任務,約10秒后瀏覽器將顯示出計算結(jié)果5050:


  四、停止任務


  stop.jsp頁面把running標記設(shè)置成false,從而停止當前的計算任務:


<jsp:useBean id="task" scope="session"
    class="test.barBean.TaskBean"/>


<% task.setRunning(false); %>
<jsp:forward page="status.jsp"/>
 
  注意最早的Java版本提供了Thread.stop方法,但JDK從1.2版開始已經(jīng)不贊成使用Thread.stop方法,所以我們不能直接調(diào)用Thread.stop()。


  第一次運行本文程序的時候,你會看到任務的啟動有點延遲;同樣地,第一次點擊“停止”按鈕時也可以看到任務并沒有立即停止運行(特別是如果機器配置較低的話,延遲的感覺更加明顯),這些延遲都是由于編譯JSP頁面導致的。編譯好JSP頁面之后,應答速度就要快多了。


  五、實際應用


  進度條不僅使得用戶界面更加友好,而且對服務器的性能也有好處,因為進度條會不斷地告訴用戶當前的執(zhí)行進度,用戶不會再頻繁地停止并重新啟動(刷新)當前的任務。另一方面,創(chuàng)建單獨的線程來執(zhí)行后臺任務也會消耗不少資源,必要時可考慮通過一個線程池來實現(xiàn)Thread對象的重用。另外,頻繁地刷新進度頁面也增加了網(wǎng)絡(luò)通信開銷,所以務必保持進度頁面簡潔短小。


  在實際應用中,后臺執(zhí)行的繁重任務可能不允許停止,或者它不能提供詳細的執(zhí)行進度數(shù)據(jù)。例如,查找或更新關(guān)系數(shù)據(jù)庫時,SQL命令執(zhí)行期間不允許中途停止——不過如果用戶表示他想要停止或中止任務,程序可以在SQL命令執(zhí)行完畢后回退事務。


  解析XML文檔的時候,我們沒有辦法獲知已解析內(nèi)容精確的百分比。如果用DOM解析XML文檔,直到解析完成后才得到整個文檔樹;如果用SAX,雖然可以知道當前解析的內(nèi)容,但通常不能確定還有多少內(nèi)容需要解析。在這些場合,任務的執(zhí)行進度只能靠估計得到。


  估計一個任務需要多少執(zhí)行時間通常是很困難的,因為它涉及到許多因素,即使用實際測試的辦法也無法得到可靠的結(jié)論,因為服務器的負載隨時都在變化之中。一種簡單的辦法是測量任務每次執(zhí)行所需時間,然后根據(jù)最后幾次執(zhí)行的平均時間估算。如果要提高估計時間的精確度,應當考慮實現(xiàn)一種針對應用特點的算法,綜合考慮多種因素,例如要執(zhí)行的SQL語句類型、要解析的XML模式的復雜程度,等等。


  結(jié)束語:本文例子顯示出用JSP、Java、HTML和JavaScript構(gòu)造進度條是相當容易的,真正困難的是如何將它用到實際應用之中,特別是獲得后臺任務的進度信息,但這個問題沒有通用的答案,每一種后臺執(zhí)行的任務都有它自己的特點,必須按照具體情況具體分析。