歡迎頁面welcome.jsp
當用戶錄入正確的密碼后,switch.jsp控制JSP頁面導向welcome.jsp歡迎頁面,在這節里,我們來開發這個welcome.jsp頁面。因為welcome.jsp需要使用到一個第三方的標簽庫,所以在開發welcome.jsp之前需要在JBuilder中作一些配置引入這個標簽庫。
將第三方標簽庫配置到JBuilder中
Apache開源組織提供了許多有用標簽庫,歡迎頁面welcome.jsp需要使用一個來源于Apache的datetime標簽庫,可以用這個標簽庫在JSP中提供各種時間的顯示,下載的地址是:http://apache.justdn.org/jakarta/taglibs/datetime/binaries/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分鐘,這些對象所占用的系統資源才會被釋放。 |







