亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP編程實現進度條的方法

2024-09-05 00:08:43
字體:
來源:轉載
供稿:網友

許多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() {
return started;
}

  如果任務已經完成,isCompleted()方法將返回true:

public synchronized boolean isCompleted() {
return counter == 100;
}

  如果任務正在運行,isRunning()方法將返回true:

public synchronized boolean isRunning() {
return running;
}

  SetRunning()方法由start.jsp或stop.jsp調用,當running參數是true時。SetRunning()方法還要將任務標記為“已經啟動”。調用setRunning(false)表示要求run()方法停止執行。

public synchronized void setRunning(boolean running) {
this.running = running;
if (running)
started = true;
}

  任務執行完畢后,調用getResult()方法返回計算結果;如果任務尚未執行完畢,它返回null:

public synchronized Object getResult() {
if (isCompleted())
return new Integer(sum);
else
return null;
}

  當running標記為true、completed標記為false時,run()方法調用work()。在實際應用中,run()方法也許要執行復雜的SQL查詢、解析大型XML文檔,或者調用消耗大量CPU時間的EJB方法。注意“繁重的任務”可能要在遠程服務器上執行。報告結果的JSP頁面有兩種選擇:或者等待任務結束,或者使用一個進度條。

public void run() {
try {
setRunning(true);
while (isRunning() && !isCompleted())
work();
} finally {
setRunning(false);
}
}

  二、啟動任務
  start.jsp是web.xml部署描述符中聲明的歡迎頁面,web.xml的內容是:
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<welcome-file-list>
<welcome-file>start.jsp</welcome-file>
</welcome-file-list>
</web-app>

  start.jsp啟>動一個專用的線程來運行“繁重的任務”,然后把HTTP請求傳遞給status.jsp。
  start.jsp頁面利用<jsp:useBean>標記創建一個TaskBean的實例,將scope屬性定義為session使得對于來自同一瀏覽器的HTTP請求,其他頁面也能提取到同一個Bean對象。start.jsp通過調用session.removeAttribute("task")確保<jsp:useBean>創建了一個新的Bean對象,而不是提取一個舊對象(例如,同一個用戶會話中更早的JSP頁面所創建的Bean對象)。
  下面是start.jsp頁面的代碼清單:

<% session.removeAttribute("task"); %>
<jsp:useBean id="task" scope="session"
class="test.barBean.TaskBean"/>
<% task.setRunning(true); %>
<% new Thread(task).start(); %>
<jsp:forward page="status.jsp"/>
  start.jsp創建并設置好TaskBean對象之后,接著創建一個Thread,并將Bean對象作為一個Runnable實例傳入。調用start()方法時新創建的線程將執行TaskBean對象的run()方法。
  現在有兩個線程在并發執行:執行JSP頁面的線程(稱之為“JSP線程”),由JSP頁面創建的線程(稱之為“任務線程”)。接下來,start.jsp利用調用status.jsp,status.jsp顯示出進度條以及任務的執行情況。注意status.jsp和start.jsp在同一個JSP線程中運行。
  start.jsp在創建線程之前就把TaskBean的running標記設置成了true,這樣,即使當JSP線程已開始執行status.jsp而任務線程的run()方法尚未啟動,也能夠確保用戶會得到“任務已開始運行”的狀態報告。
  將running標記設置成true、啟動任務線程這兩行代碼可以移入TaskBean構成一個新的方法,然后由JSP頁面調用這個新方法。一般而言,JSP頁面應當盡量少用Java代碼,即我們應當盡可能地把Java代碼放入Java類。不過本例中我們不遵從這一規則,把new Thread(task).start()直接放入start.jsp突出表明JSP線程創建并啟動了任務線程。
  在JSP頁面中操作多線程必須謹慎,注意JSP線程和其它線程實際上是并發執行的,就象在桌面應用程序中,我們用一個線程來處理GUI事件,另外再用一個或多個線程來處理后臺任務。不過在JSP環境中,考慮到多個用戶同時請求某一個頁面的情況,同一個JSP頁面可能會在多個線程中同時運行;另外,有時同一個用戶可能會向同一個頁面發出多個請求,雖然這些請求來自同一個用戶,它們也會導致服務器同時運行一個JSP頁面的多個線程。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
4k岛国日韩精品**专区| 欧美日韩不卡合集视频| 韩国福利视频一区| 国产精品香蕉国产| 国产精品国产三级国产aⅴ浪潮| 都市激情亚洲色图| 国产91ⅴ在线精品免费观看| 欧美精品videos| 久久精品国产精品亚洲| 欧美性生交xxxxxdddd| 日韩中文字在线| 国自产精品手机在线观看视频| 久久亚洲国产成人| 欧美成人免费va影院高清| 欧美激情啊啊啊| 欧美精品在线观看91| 国产免费一区视频观看免费| 亚洲精品美女在线观看播放| 日本亚洲欧洲色| 日韩国产精品一区| 欧美二区乱c黑人| 国产99久久精品一区二区永久免费| 亚洲欧美日韩第一区| 国产一区二区三区日韩欧美| 国产成人在线亚洲欧美| 亚洲激情视频网| 狠狠躁夜夜躁人人爽超碰91| 欧美激情国产日韩精品一区18| 成人久久久久爱| 欧美日韩裸体免费视频| 欧美电影院免费观看| 欧美黑人xxxx| 好吊成人免视频| 国产91久久婷婷一区二区| 欧美在线视频导航| 亚洲黄色免费三级| 欧美日韩国产综合视频在线观看中文| 91久久中文字幕| 国产亚洲欧美日韩精品| 国产成人一区三区| 日韩中文字幕在线看| 国产精品午夜国产小视频| 亚洲欧洲国产精品| 国产精品嫩草影院一区二区| 久久人人爽人人爽人人片亚洲| 国产精品女人网站| 久久影院模特热| 91麻豆国产精品| 国产精品第二页| 亚洲欧美精品在线| 亚洲天堂精品在线| 国产精品久久久久久久久久免费| 欧美性开放视频| 青青久久aⅴ北条麻妃| 欧美影院久久久| 欧美激情久久久久| 最近2019中文字幕大全第二页| 日本精品视频在线| 国产精品扒开腿做爽爽爽视频| 最近中文字幕日韩精品| yellow中文字幕久久| 国产精欧美一区二区三区| **欧美日韩vr在线| 日韩精品久久久久| 亚洲第一免费播放区| 色小说视频一区| 中文亚洲视频在线| 国产自摸综合网| 久久成年人免费电影| 亚洲欧美日韩中文视频| 精品成人69xx.xyz| 欧美激情性做爰免费视频| 久久精品免费播放| 欧美日本中文字幕| 日韩大陆欧美高清视频区| 国产丝袜一区二区三区免费视频| 日韩免费在线免费观看| 97在线视频一区| 国产精品99久久99久久久二8| 久久久精品亚洲| 国产日韩欧美中文在线播放| 韩国v欧美v日本v亚洲| 538国产精品视频一区二区| 欧美精品激情blacked18| 97人人爽人人喊人人模波多| 亚洲成人在线网| 欧美电影院免费观看| 日韩中文字幕久久| 在线精品高清中文字幕| 成人中文字幕+乱码+中文字幕| 国产精品丝袜久久久久久高清| 国产视频精品免费播放| 亚洲国产天堂久久综合网| 在线播放日韩精品| 久久久精品一区二区| 久久久久久久久电影| 国产精品国产福利国产秒拍| 亚洲视频在线观看免费| 97国产在线观看| 久久99久国产精品黄毛片入口| 91久久综合亚洲鲁鲁五月天| 日韩中文字在线| 亚洲精品成a人在线观看| 欧美体内谢she精2性欧美| 亚洲欧美国产精品专区久久| 国产精品美女在线| 国产69久久精品成人看| 国产一区二区日韩| 亚洲大尺度美女在线| 国产99久久精品一区二区| 精品国内自产拍在线观看| 中文字幕日韩高清| 久久久久久91| 日本高清不卡在线| 欧洲一区二区视频| 欧美第一黄网免费网站| 国产精品自拍偷拍视频| 久久成人国产精品| 欧美疯狂性受xxxxx另类| 久久久精品国产亚洲| 国产一区深夜福利| 色www亚洲国产张柏芝| 国产亚洲成av人片在线观看桃| 国产成人午夜视频网址| 日韩欧美在线播放| 久久精品亚洲精品| 国产欧美精品xxxx另类| 亚洲国产成人久久综合一区| 中文字幕亚洲国产| 91精品视频大全| 亚洲国产91精品在线观看| 国产这里只有精品| 国内精品伊人久久| 欧美激情一区二区三区在线视频观看| 中文国产成人精品| 国产精品亚洲视频在线观看| 久久精品国产亚洲一区二区| 亚洲热线99精品视频| 成人免费大片黄在线播放| 亚洲精品美女久久久久| 久久91精品国产| 自拍亚洲一区欧美另类| 国产精品入口日韩视频大尺度| 国产一区二区三区中文| 91极品女神在线| 久久免费国产精品1| 亚洲人在线视频| 亚洲色无码播放| 亚洲视频第一页| 国产成人精彩在线视频九色| www国产亚洲精品久久网站| 亚洲午夜精品久久久久久久久久久久| 91老司机精品视频| 97超级碰在线看视频免费在线看| 国产suv精品一区二区| 国模视频一区二区| 久久夜色精品国产| 色先锋资源久久综合5566| 一区二区av在线| 欧美成人网在线| 亚洲欧美中文字幕| 欧美电影电视剧在线观看| 亚洲区免费影片| 91精品国产网站|