詳細解析JSP編程中進度條的設計執行個體(1)
來源:互聯網
上載者:User
許多Web應用、公司專屬應用程式涉及到長時間的操作,例如複雜的資料庫查詢或繁重的XML處理等,雖然這些任務主要由資料庫系統或中介軟體完成,但任務執行的結果仍舊要藉助JSP才能發送給使用者。本文介紹了一種通過改進前端表現層來改善使用者感覺、減輕伺服器負載的辦法。
當JSP調用一個必須長時間啟動並執行操作,且該操作的結果不能(在伺服器端)緩衝,使用者每次請求該頁面時都必須長時間等待。很多時候,使用者會失去耐心,接著嘗試驗擊瀏覽器的重新整理按鈕,最終失望地離開。
本文介紹的技術是把繁重的計算任務分離開來,由一個獨立的線程運行,從而解決上述問題。當使用者調用JSP頁面時,JSP頁面會立即返回,並提示使用者任務已經啟動且正在執行;JSP頁面自動重新整理自己,報告在獨立線程中啟動並執行繁重計算任務的當前進度,直至任務完成。
一、類比任務
首先我們設計一個TaskBean類,它實現java.lang.Runnable介面,其run()方法在一個由JSP頁面(start.jsp)啟動的獨立線程中運行。終止run()方法執行由另一個JSP頁面stop.jsp負責。TaskBean類還實現了java.io.Serializable介面,這樣JSP頁面就可以將它作為JavaBean調用:
package test.barBean;
import java.io.Serializable;
public class TaskBean implements Runnable,
Serializable
{
private int counter;
private int sum;
private boolean started;
private boolean running;
private int sleep;
public TaskBean()
{
counter = 0;
sum = 0;
started = false;
running = false;
sleep = 100;
}
}
TaskBean包含的“繁重任務”是計算1+2+3…+100的值,不過它不通過100*(100+1)/2=5050公式計算,而是由run()方法調用work()方法100次完成計算。work()方法的代碼如下所示,其中調用Thread.sleep()是為了確保任務總耗時約10秒。
protected void work()
{
try
{
Thread.sleep(sleep);
counter++;
sum += counter;
} catch (InterruptedException e)
{
setRunning(false);
}
}
status.jsp頁面通過調用下面的getPercent()方法獲得任務的完成狀況:
public synchronized int getPercent()
{
return counter;
}
如果任務已經啟動,isStarted()方法將返回true:
public synchronized boolean isStarted()