日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSP进度条制作

發(fā)布時間:2024/1/23 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSP进度条制作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先我們設(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;
}

  如果任務(wù)已經(jīng)啟動,isStarted()方法將返回true:

public synchronized boolean isStarted() {
return started;
}

  如果任務(wù)已經(jīng)完成,isCompleted()方法將返回true:

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

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

public synchronized boolean isRunning() {
return running;
}

  SetRunning()方法由start.jsp或stop.jsp調(diào)用,當(dāng)running參數(shù)是true時。SetRunning()方法還要將任務(wù)標(biāo)記為“已經(jīng)啟動”。調(diào)用setRunning(false)表示要求run()方法停止執(zhí)行。

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

  任務(wù)執(zhí)行完畢后,調(diào)用getResult()方法返回計算結(jié)果;如果任務(wù)尚未執(zhí)行完畢,它返回null:

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

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

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

  start.jsp是web.xml部署描述符中聲明的歡迎頁面,web.xml的內(nèi)容是:

<?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啟>動一個專用的線程來運行“繁重的任務(wù)”,然后把HTTP請求傳遞給status.jsp。
  start.jsp頁面利用<jsp:useBean>標(biāo)記創(chuàng)建一個TaskBean的實例,將scope屬性定義為session使得對于來自同一瀏覽器的HTTP請求,其他頁面也能提取到同一個Bean對象。start.jsp通過調(diào)用session.removeAttribute("task")確保<jsp:useBean>創(chuàng)建了一個新的Bean對象,而不是提取一個舊對象(例如,同一個用戶會話中更早的JSP頁面所創(chuàng)建的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創(chuàng)建并設(shè)置好TaskBean對象之后,接著創(chuàng)建一個Thread,并將Bean對象作為一個Runnable實例傳入。調(diào)用start()方法時新創(chuàng)建的線程將執(zhí)行TaskBean對象的run()方法。
  現(xiàn)在有兩個線程在并發(fā)執(zhí)行:執(zhí)行JSP頁面的線程(稱之為“JSP線程”),由JSP頁面創(chuàng)建的線程(稱之為“任務(wù)線程”)。接下來,start.jsp利用調(diào)用status.jsp,status.jsp顯示出進(jìn)度條以及任務(wù)的執(zhí)行情況。注意status.jsp和start.jsp在同一個JSP線程中運行。
  start.jsp在創(chuàng)建線程之前就把TaskBean的running標(biāo)記設(shè)置成了true,這樣,即使當(dāng)JSP線程已開始執(zhí)行status.jsp而任務(wù)線程的run()方法尚未啟動,也能夠確保用戶會得到“任務(wù)已開始運行”的狀態(tài)報告。
  將running標(biāo)記設(shè)置成true、啟動任務(wù)線程這兩行代碼可以移入TaskBean構(gòu)成一個新的方法,然后由JSP頁面調(diào)用這個新方法。一般而言,JSP頁面應(yīng)當(dāng)盡量少用Java代碼,即我們應(yīng)當(dāng)盡可能地把Java代碼放入Java類。不過本例中我們不遵從這一規(guī)則,把new Thread(task).start()直接放入start.jsp突出表明JSP線程創(chuàng)建并啟動了任務(wù)線程。
  在JSP頁面中操作多線程必須謹(jǐn)慎,注意JSP線程和其它線程實際上是并發(fā)執(zhí)行的,就象在桌面應(yīng)用程序中,我們用一個線程來處理GUI事件,另外再用一個或多個線程來處理后臺任務(wù)。不過在JSP環(huán)境中,考慮到多個用戶同時請求某一個頁面的情況,同一個JSP頁面可能會在多個線程中同時運行;另外,有時同一個用戶可能會向同一個頁面發(fā)出多個請求,雖然這些請求來自同一個用戶,它們也會導(dǎo)致服務(wù)器同時運行一個JSP頁面的多個線程。

  status.jsp頁面利用一個HTML進(jìn)度條向用戶顯示任務(wù)的執(zhí)行情況。首先,status.jsp利用<jsp:useBean>標(biāo)記獲得start.jsp頁面創(chuàng)建的Bean對象:
<jsp:useBean id="task" scope="session"
class="test.barBean.TaskBean"/>
  為了及時反映任務(wù)執(zhí)行進(jìn)度,status.jsp會自動刷新。JavaScript代碼setTimeout("location='status.jsp'", 1000)將每隔1000毫秒刷新頁面,重新請求status.jsp,不需要用戶干預(yù)。
<HTML>
<HEAD>
<TITLE>JSP進(jìn)度條</TITLE>
<% if (task.isRunning()) { %>
<SCRIPT LANGUAGE="JavaScript">
setTimeout("location='status.jsp'", 1000);
</SCRIPT>
<% } %>
</HEAD>
<ODY>

  進(jìn)度條實際上是一個HTML表格,包含10個單元——即每個單元代表任務(wù)總體的10%進(jìn)度。
<H1 ALIGN="CENTER">JSP進(jìn)度條</H1>
<H2 ALIGN="CENTER">
結(jié)果:

<%= task.getResult(<) %><BR>
% int percent = task.getPercent(); %>
<%= percent %>%
</H2>
<TABLE WIDTH="60%" ALIGN="CENTER"
BORDER=1 CELLPADDING=0 CELLSPACING=2>
<TR>
<% for (int i = 10; i <= percent; i += 10) { %>
<TD WIDTH="10%" BGCOLOR="#000080"> </TD>
<% } %>
<% for (int i = 100; i > percent; i -= 10) { %>
<TD WIDTH="10%"> </TD>
<% } %>
</TR>
</TABLE>

 任務(wù)執(zhí)行情況分下面幾種狀態(tài):正在執(zhí)行,已完成,尚未開始,已停止:


<TABLE WIDTH="100%" BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR>
<TD ALIGN="CENTER">
<% if (task.isRunning()) { %>
正在執(zhí)行
<% } else { %>
<% if (task.isCompleted()) { %>
完成
<% } else if (!task.isStarted()) { %>
尚未開始
<% } else { %>
已停止
<% } %>
<% } %>
</TD>
</TR>

頁面底部提供了一個按鈕,用戶可以用它來停止或重新啟動任務(wù):


<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>

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

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

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

總結(jié)

以上是生活随笔為你收集整理的JSP进度条制作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天摸天天舔 | 国产一区精品无码 | 性毛片| 色人阁网站| 黄瓜视频成人 | 97香蕉久久超级碰碰高清版 | 日本成人精品在线 | 青青草成人免费在线视频 | 超清av在线 | 8x8ⅹ国产精品一区二区二区 | 无码少妇一区二区三区芒果 | 国产香蕉97碰碰碰视频在线观看 | 韩国三级在线视频 | 好色艳妇小说 | 日韩人妻一区二区三区蜜桃视频 | 欧美涩色 | www..com色 | 69xxxx日本 | 麻豆福利影院 | 男生捅女生肌肌 | 男人的天堂一区二区 | 涩涩涩涩涩涩涩涩涩 | 公侵犯人妻一区二区 | 蜜桃久久精品 | 日韩a√ | 91久久精品夜夜躁日日躁欧美 | 免费看污片的网站 | 怡红院成人网 | 久久久久久a | 中文字幕 成人 | 亚洲热影院 | 午夜在线国产 | 黑人干亚洲人 | 亚洲第二色| 欧美日本高清视频 | 香港一级淫片免费放 | 亚洲free性xxxx护士白浆 | 又黄又爽网站 | 成人av网站免费 | 91免费小视频 | 国产做爰全过程免费视频 | 欧美精品二区三区四区免费看视频 | 做暧暧视频在线观看 | 国产精品午夜视频 | 无遮挡裸光屁屁打屁股男男 | 久久avav| 日p免费视频 | 欧美不卡在线观看 | 九九色网| 网红av在线 | 亚洲精品高潮久久久久久久 | 熟女一区二区三区视频 | 深夜精品福利 | 男女一区 | www.555国产精品免费 | 可以免费看污视频的网站 | 欧美123| 激情久久中文字幕 | 琪琪色影音先锋 | 中国色老太hd | 国精产品一区一区三区免费视频 | 亚洲清纯唯美 | 欧洲一级视频 | 久久国产成人精品 | 精品久久久久久 | 波多野结衣在线观看一区二区三区 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 中文字幕日韩人妻在线视频 | 亚洲影院一区二区三区 | 精品伦理一区二区 | 精品一区二区在线播放 | 欧美三个黑人玩3p | 开心激情深爱 | 精品乱码久久久久久中文字幕 | 亚洲精品国产精 | 66亚洲一卡2卡新区成片发布 | 色撸撸av | 视频在线观看免费大片 | 少妇与公做了夜伦理 | 久久影院午夜 | 少妇被躁爽到高潮无码人狍大战 | 丰满熟妇被猛烈进入高清片 | 亚洲伦理天堂 | xxxx18日本 | 青青操原| 玖玖精品在线视频 | 国产女人18毛片水真多 | 久操社区 | 久久精精品久久久久噜噜 | 91视频在线| 99激情视频 | 欧美大片一区二区三区 | 天堂伊人网 | 婷婷午夜精品久久久久久性色av | 六月丁香啪啪 | 日日操夜夜 | 日本亚洲欧美在线 | 三级视频黄色 | 久久99精品久久久久久园产越南 |