程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> JSP編程進度條設計實例(3)

JSP編程進度條設計實例(3)

編輯:關於JSP

二、啟動任務


  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頁面的多個線程。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved