歡迎頁面welcome.jsp
當使用者輸入正確的密碼後,switch.jsp控制JSP頁面導向welcome.jsp歡迎頁面,在這節裡,我們來開發這個welcome.jsp頁面。因為welcome.jsp需要使用到一個第三方的標籤庫,所以在開發welcome.jsp之前需要在JBuilder中作一些配置引入這個標籤庫。
將第三方標籤庫配置到JBuilder中
Apache開源組織提供了許多有用標籤庫,歡迎頁面welcome.jsp需要使用一個來自Apache的datetime標籤庫,可以用這個標籤庫在JSP中提供各種時間的顯示,下載的地址是:/u/info_img /2009-07/02/jakarta-taglibs-datetime-1.0.1.zip。
標籤庫一般包括兩個文件,其一是類別包JAR文件,其二是以.tld為擴展名的標籤符描述文件。從下載的壓縮文件中解壓縮後,我們將taglibs-datetime.jar和taglibs-datetime.tld檔案放到<工程目錄>/datetimeTag目錄下。
要在工程中使用第三方的標籤庫,必須事先在JBuilder中配置這個標籤庫,並在工程中引用它。配置標籤庫和配置類別庫相似,也是透過Configure Libraries對話框來完成。 JBuilder類別庫及標籤庫都列在Configure Libraries對話框中左邊的樹中,類別庫顯示為圖標,而標籤庫顯示為圖示.下面我們來將datetime標籤庫配置到JBuilder中。
1. Tools->Configure->Libraries->Configure Libraries對話框。
點選Configure Libraries對話框的左下角的Add...按鈕,跳出New Library Wizard對話框,如下圖:
圖17新庫嚮導對話框 |
在Name中給這個函式庫取一個名字:datetimeTag,按OK回傳Configure Libraries對話框。
2.指定標籤庫檔案。
在返回Configure Libraries對話框後,datetimeTag節點出現在左邊的樹中,因為還沒有為其指定類別庫文件,有別於其他節點顯示為顯目的紅色,點選datetimeTag並將Library Settings設定頁切換到Framework標籤頁中,如下圖所示:
圖18 切換到Framework中 |
在Framework下拉框中選擇User-Defined JSP Tag Library選項,點選標籤頁右下方的Add...按鈕,彈出Define New Tag Library對話框,如下圖所示:
圖19 指定標籤庫的描述文件 |
在Define New Tag Library對話框中,點選TLD file後的…按鈕,導覽至<工程目錄>/datetimeTag/taglibs-datetime.tld檔案中,確認後JBuilder自動填入其餘的設定項,一般不需要更改JBuilder這些自動補充的設定。其中Prefix為這個標籤庫指定了一個引用前綴。點選OK按鈕返回Configure Libraries對話框,datetimeTag節點顯示為正常的顏色如下圖所示:
圖20 正確配置標籤庫後的效果 |
點選Configure Libraries對話框的OK按鈕完成datetime標籤庫的設定。
3.在目前工程中引用這個新配置的標籤庫。
Project->Project Properties...->Paths->切換到Required Libraries標籤頁中->點選Add...按鈕從JBuilder類別庫中選擇datetimeTag。配置成功後,Project Properties對話框如下所示:
圖21 工程引用庫 |
建立歡迎JSP頁面
1. File->New…->Web->雙擊JSP圖標,啟動建立JSP精靈,指定JSP檔案名稱為welcome,點選Next到下一步。
2.在welcome.jsp頁面中引用datetimeTag標籤庫。
在精靈的步驟2中允許你選擇JBuilder中的各種標籤庫,我們在上一節中配置的datetimeTag標籤庫也出現在Tag Libraries清單中,如下圖所示:
圖22 引用標籤庫 |
展開datetime Tag並勾選taglibs-datetime,按Next到步驟。
3.引用在switch.jsp中放入session域的userBean物件。
圖23 引用switch.jsp中放入session的userBean |
點選Add Bean...選擇bookstore.User類,在ID欄中指定Bean的名字為ses_userBean,Scope欄中選擇session作用域。 ses_userBean即是在switch.jsp為userBean所指定的名字,Web容器將根據這個名字到session中查找對象,如果找不到才創建bookstore.User對象,因為welcome.jsp在switch.jsp之後才被調用,所以除非session對期,否則都可以找到userBean物件。
直接點擊Finish建立welcome.jsp文件,其程式碼如下所示:
代碼清單15 welcome.jsp歡迎頁面
1. <%@ page contentType="text/html; charset=GBK" %> 2. <%@ taglib uri="http://jakarta.apache.org/taglibs/datetime-1.0" prefix="dt" %> 3. <html> 4. <head> 5. <title> 6. welcome 7. </title> 8. </head> 9. <jsp:useBean id="ses_userBean" scope="session" class="bookstore.User" /> 10. <jsp:setProperty name="ses_userBean" property="*" /> 11. <body bgcolor="#ffffff"> 12. <h1> 13. JBuilder Generated JSP 14. </h1> 15. </body> 16. </html> |
在精靈第2步驟所引用的標籤庫設定對應第2行的引用標籤庫聲明程式碼。而在步驟3設定的Bean對應第9~10行程式碼,因為在welcome.jsp中無需填入Bean的值,所以應該要手動移除第10行的程式碼。
下面我們在welcome.jsp檔案中引用datetime標籤庫,用它來產生一個目前時間格式化字串。開啟welcone.jsp檔案並切換到Source視圖頁。首先清除<body></body>中JBuilder所產生的程式碼,在<body></body>中輸入"<dt:",JBuilder將使用TagInsight功能顯示出這個標籤庫中所有可用的標籤項,如下圖所示:
圖24 利用TagInsight錄入標籤庫
使用TagInsight可以非常方便地輸入標籤庫中的可用標籤,大幅加速標籤庫的程式碼輸入並保證正確性。在welcome.jsp中我們使用標籤庫來獲得一個目前的格式化時間字串,此外我們也透過ses_userBean來取得使用者的名字。 welcome.jsp的最終程式碼如下所示:
程式碼清單16 welcome.jsp 引用標籤庫和Session對象
1. <%@page contentType="text/html; charset=GBK" errorPage="error.jsp" %> 2. <%@taglib uri="http://jakarta.apache.org/taglibs/datetime-1.0" prefix="dt"%> 3. <html> 4. <head> 5. <title>welcome</title> 6. </head> 7. <jsp:useBean id="ses_userBean" scope="session" class="bookstore.User"/> 8. <body bgcolor="#ffffff">你是 9. <%=ses_userBean.getUserName()%>,歡迎登入。 <br> 10. 現在的時間是<dt:表單at pattern="MM/dd/yyyy hh:mm"><dt:currentTime/></dt:表單at> 11. <br>點選<a href="quit.jsp">這兒</a>退出系統 12. </body> 13. </html> |
此外,JBuilder將datetime標籤庫描述檔taglibs-datetime.tld拷貝到WEB-INF下,並對web.xml文件動了手腳,聲明taglibs-datetime.tld所在的位址:
程式碼清單17 web.xml中聲明標籤描述文件
1. <?xml version="1.0" encoding="UTF-8"?> 2. … 3. <web-app> 4. <taglib> 5. <taglib-uri>http://jakarta.apache.org/taglibs/datetime-1.0</taglib-uri> 6. <taglib-location>/WEB-INF/taglibs-datetime.tld</taglib-location> 7. </taglib> 8. </web-app> |
如上所示,web.xml的第4~7行,JBuilder自動加入了datetime標籤庫的描述文件,以便Web容器正確找到所需的資訊。
在編譯工程產生Web目錄時,JBuilder會將datetime標籤庫的JAR檔taglibs-datetime.jar拷貝到WEB-INF/lib目錄下。
當使用者登入成功後,將轉向welcome.jsp頁面,其頁面效果如下圖所示:
圖25 welcome.jsp效果頁面 |
當使用者點擊"這兒"的連結時,將連結到quit.jsp,quit.jsp頁面負責清除session,清除session後,將引用session中的物件解綁並釋放資源。
quit.jsp退出處理頁面
由於HTTP協定以請求/回應的方式運作,所以客戶端退出系統時需要主動往Web伺服器發送一個請求,通知Web伺服器及時銷毀會話,否則Web伺服器只會等到會話過期時才會銷毀它。
我們用一個quit.jsp來處理使用者退出系統的操作,quit.jsp負責註銷session,及時釋放資源。
·註銷session。
·關閉瀏覽器視窗。
其程式碼如下所示:
1. <%@ page contentType="text/html; charset=GBK" %> 2. <% 3. session.invalidate(); 4. %> 5. <script language="javaScript" > 6. window.opener = null; 7. window.close(); 8. </script> |
其中第3行負責註銷session,原先放入session的物件將解綁定,等待垃圾回收以釋放資源。對於本例而言,session中有一個名為ses_userBean的userBean物件(它是放入switch.jsp中放入session的),呼叫session.invalidate()後,userBean從session中解綁定,它的valueUnbound( )方法會被觸發調用,然後再等待垃圾回收。
第5~8行是一段JavaScript腳本程序,負責關閉窗口,如果網頁不是透過腳本程序打開的(window.open()),調用window.close()腳本關閉窗口前,必須先將window.opener對象置為null,如第6行所示,否則瀏覽器會彈出一個確定關閉的對話框,筆者發現這個問題困擾了不少的Web程式設計師,故特別指出。
實戰經驗:
當使用者退出系統時,需要登出session,否則只有等到session在伺服器中過期後,session物件才會被清除。假設一個session的不活動最大時間為30分鐘(預設的時間),如果不手動清除session對象,則當一個用戶退出系統後再過30分鐘,這些對象所佔用的系統資源才會被釋放。 |