JSP編程進(jìn)度條設(shè)計案例(1)
發(fā)表時間:2024-02-03 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]許多Web應(yīng)用、企業(yè)應(yīng)用涉及到長時間的操作,例如復(fù)雜的數(shù)據(jù)庫查詢或繁重的XML處理等,雖然這些任務(wù)主要由數(shù)據(jù)庫系統(tǒng)或中間件完成,但任務(wù)執(zhí)行的結(jié)果仍舊要借助JSP才能發(fā)送給用戶。本文介紹了一種通過改進(jìn)前端表現(xiàn)層來改善用戶感覺、減輕服務(wù)器負(fù)載的辦法。 當(dāng)JSP調(diào)用一個必須長時間運行的操作,且該操作...
許多Web應(yīng)用、企業(yè)應(yīng)用涉及到長時間的操作,例如復(fù)雜的數(shù)據(jù)庫查詢或繁重的XML處理等,雖然這些任務(wù)主要由數(shù)據(jù)庫系統(tǒng)或中間件完成,但任務(wù)執(zhí)行的結(jié)果仍舊要借助JSP才能發(fā)送給用戶。本文介紹了一種通過改進(jìn)前端表現(xiàn)層來改善用戶感覺、減輕服務(wù)器負(fù)載的辦法。
當(dāng)JSP調(diào)用一個必須長時間運行的操作,且該操作的結(jié)果不能(在服務(wù)器端)緩沖,用戶每次請求該頁面時都必須長時間等待。很多時候,用戶會失去耐心,接著嘗試點擊瀏覽器的刷新按鈕,最終失望地離開。
本文介紹的技術(shù)是把繁重的計算任務(wù)分離開來,由一個獨立的線程運行,從而解決上述問題。當(dāng)用戶調(diào)用JSP頁面時,JSP頁面會立即返回,并提示用戶任務(wù)已經(jīng)啟動且正在執(zhí)行;JSP頁面自動刷新自己,報告在獨立線程中運行的繁重計算任務(wù)的當(dāng)前進(jìn)度,直至任務(wù)完成。
一、模擬任務(wù)
首先我們設(shè)計一個TaskBean類,它實現(xiàn)java.lang.Runnable接口,其run()方法在一個由JSP頁面(start.jsp)啟動的獨立線程中運行。終止run()方法執(zhí)行由另一個JSP頁面stop.jsp負(fù)責(zé)。TaskBean類還實現(xiàn)了java.io.Serializable接口,這樣JSP頁面就可以將它作為JavaBean調(diào)用:
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包含的“繁重任務(wù)”是計算1+2+3…+100的值,不過它不通過100*(100+1)/2=5050公式計算,而是由run()方法調(diào)用work()方法100次完成計算。work()方法的代碼如下所示,其中調(diào)用Thread.sleep()是為了確保任務(wù)總耗時約10秒。
protected void work() {
try {
Thread.sleep(sleep);
counter++;
sum += counter;
} catch (InterruptedException e) {
setRunning(false);
}
}
status.jsp頁面通過調(diào)用下面的getPercent()方法獲得任務(wù)的完成狀況:
public synchronized int getPercent() {
return counter;
}