|
復制代碼 代碼如下:
String userId = request.getParameter("userId");
String password = request.getParameter("password");
試想如果login.jsp的表單有10個以上的數(shù)據(jù)組件,則在switch.jsp中必須通過相應數(shù)目的request.getParameter()方法獲取其值。此外,如果這些數(shù)據(jù)不是字段串類型,而是整數(shù)或浮點數(shù),由于request.getParameter()方法返回的值都是String,還必須進行類型的轉換,這種工作不但單調(diào)乏味,還容易出錯。
JSP允許你通過Bean以映射的方式接收網(wǎng)頁表單的數(shù)據(jù),Bean以這個規(guī)則映射表單的數(shù)據(jù):Bean屬性名=表單數(shù)據(jù)組件名,也即所有和Bean屬性名相同的表單數(shù)據(jù)域被自動填充到Bean中,并且完成數(shù)據(jù)類型的轉換。如login.jsp的表單中有兩個數(shù)據(jù)組件,一個名為userId,另一個是password,定義一個擁有相同名的userId和password屬性的User.Java Bean,這個Bean將可以自動接收表單中的兩個數(shù)據(jù)組件值。
編寫User.Java
我們先來編寫這個User.Java的Bean,在工程中創(chuàng)建User.Java,其代碼如下所示:
代碼清單 7 User.Java
復制代碼 代碼如下:
package bookstore;
public class User
{
private String userId;//用戶Id
private String password;//密碼
private String userName;//用戶名
public String getPassword() {
return password;
}
public String getUserId() {
return userId;
}
public String getUserName() {
return userName;
}
public void setPassword(String password) {
this.password = password;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
除userId和password兩屬性名,還有一個用戶名屬性userName,這個屬性的值不是從login.jsp的表單接收的,當用戶名密碼驗證正確后,從數(shù)據(jù)表T_USER表中獲取用戶名保存在這個屬性中,以便其他地方引用,保存并編譯這個類。
提示:
你可以通過JBuilder的Bean Express工具快速創(chuàng)建User.Java的代碼,在一般情況下,你應該通過Bean Express來創(chuàng)建Bean的屬性,這樣不但自動產(chǎn)生get/set的屬性訪問方法,還保證了Bean命名規(guī)范。
編寫頁面程序
在創(chuàng)建User.Java 的Bean后,我們著手創(chuàng)建switch.jsp,在switch.jsp中引用這個Bean。
通過File->New..->W(wǎng)eb->雙擊JSP圖標啟動創(chuàng)建JSP向導。
1.指定swith.jsp名字
圖 10 指定switch.jsp的名字
一直按Next到向導的第3步。
2.引用User.Java Bean
圖 11 指定JSP中引用Bean
點擊Add Bean...按鈕,彈出Select a Class對話框,在對話框中選擇bookstore.User類,如下圖所示:
圖 12 選擇類作為Bean
按OK后,返回到向導第3步的對話框,此時對話框的Bean列表中多了一行記錄,可以在ID欄中為Bean指定一個名字,在Scope中指定Bean的作用域,如下圖所示:
圖 13 引用一個Bean
我們?yōu)閁ser的Bean取名為userBean,將其作用域設置為page域。page域即為頁面作用域,在當前頁面范圍作用域內(nèi)可用,當JSP返回響應,或請求轉到其他的JSP頁面中時,都不可用了,其他3個作用域說明如下:
?request作用域:當一個請求產(chǎn)生直到返回響應的范圍內(nèi)都是有效的,如a.jsp中聲明為request作用域的Bean,當a.jsp通過<jsp:forward>轉移請求到b .jsp頁面中時還是可用的。
?session作用域:在用戶會話的周期內(nèi)都是可用的,會話周期為用戶登錄系統(tǒng)直到其退出系統(tǒng)為此。
?application作用域:這個作用域最長,表示W(wǎng)eb容器啟動直到關閉都是有效的。
按Next到下一步。
3.設置運行配置項
在向導的最后一步,你可以為創(chuàng)建的JSP產(chǎn)生一個運行配置項,雖然向導將創(chuàng)建一個運行配置項設置為默認選項,但筆者認為這并不是一個合理的默認值,建議取消create a runtime configuration設置項,不要創(chuàng)建JSP的運行配置項,如下圖所示:
按Finish按鈕創(chuàng)建switch.jsp文件,其代碼如下所示:
代碼清單 8 向導創(chuàng)建的switch.jsp
復制代碼 代碼如下:
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
switch
</title>
</head>
<jsp:useBean id="userBean" scope="page" class="bookstore.User" />
<jsp:setProperty name="userBean" property="*" />
<body bgcolor="#ffffff">
<h1>
JBuilder Generated JSP
</h1>
</body>
</html>
第8行是引用Bean的JSP標簽,第9行用表單的數(shù)據(jù)填充Bean的屬性值,即以名字匹配的方式將request的參數(shù)填充到Bean的屬性中,同時完成類型轉換(只有基本數(shù)據(jù)類型或構造函數(shù)支持的才可以完成轉換)。在執(zhí)行完第9行后,userBean中的userId和password屬性將被設置為login.jsp頁面中所發(fā)送過來的用戶名和密碼的值。
因為switch.jsp只是用于控制,并不需要顯示內(nèi)容到客戶端,所以我們?nèi)コ齭witch.jsp中的HTML代碼,將switch.jsp調(diào)整為:
代碼清單 9 去除靜態(tài)HTML代碼后的switch.jsp
復制代碼 代碼如下:
<%@ page contentType="text/html; charset=GBK" %>
<jsp:useBean id="userBean" scope="page" class="bookstore.User" />
<jsp:setProperty name="userBean" property="*" />
在switch.jsp中提供一段Scriptlet,將userId和password發(fā)送到數(shù)據(jù)庫和T_USER表中的用戶比較看是否是合法的用戶,根據(jù)驗證的結果轉向不同的頁面。switch.jsp的最終代碼如下所示:
代碼清單 10 最終的switch.jsp
復制代碼 代碼如下:
<%@page contentType="text/html; charset=GBK"%>
<%@page import="bookstore.*"%>
<%@page import="Java.sql.*"%>
<jsp:useBean id="userBean" scope="session" class="bookstore.User"/>
<jsp:setProperty name="userBean" property="*"/>
<%
Connection conn = null;
try {
conn = DBConnection.getConnection();
PreparedStatement pStat = conn.prepareStatement(
"select USER_NAME from T_USER where USER_ID=? and password = ?");
pStat.setString(1, userBean.getUserId());
pStat.setString(2, userBean.getPassword());
ResultSet rs = pStat.executeQuery();
if (rs.next()) { //密碼正確
userBean.setUserName(rs.getString(1));//設置用戶名
session.setAttribute("ses_userBean", userBean);//將userBean放入Session對象中
%><jsp:forward page=" welcome.jsp "></jsp:forward>
<%} else { //密碼錯誤%>
<jsp:forward page="fail.jsp"></jsp:forward>
<%
}} finally {
if(conn != null) conn.close();
}
%>
?在第2~3行中引入Scriptlet代碼中需要的類。
?第7~14行代碼向數(shù)據(jù)庫發(fā)送查詢SQL語句并返回結果。
?第15行通過檢查結果集的記錄數(shù)間接判斷用戶密碼是否正確。
?第16~18行是用戶密碼正確的響應代碼,首先用結果集的USER_NAME屬性填充userBean的userName屬性值,然后將userBean對象放入Session中,最后轉向welcome.jsp頁面。
?當用戶輸入密碼不正確時,結果集中將沒有記錄,此時rs.next()返回false,程序轉向第20行,第20行的代碼將頁面轉向到密碼輸入錯誤的處理頁面fail.jsp。
?第22~24行的代碼用于關閉數(shù)據(jù)庫的連接。
也許大家已經(jīng)發(fā)現(xiàn)雖然第9~21行會拋出SQLException異常,但我們并沒有相應的異常捕獲塊,在標準的Java程序中將導致一個編譯期的錯誤,但在JSP中卻可以順序通過編譯,這是因為JSP頁面本身會捕獲頁面中拋出的所有異常。
假設第11行的SQL查詢語句發(fā)生有錯誤,如將用戶表名誤寫為User(正確為T_USER),當switch.jsp被調(diào)用后,第14行將拋出SQLException異常,此時switch.jsp將顯示出異常堆棧跡的跟蹤信息頁面,如下圖如示:
圖 14 可怕的錯誤處理頁面
上圖所示的錯誤處理頁面可謂青面獠牙,面目猙獰,非常不友好,對于開發(fā)人員來說這種報錯頁面也許是適合的,因為它提供了許多錯誤跟蹤信息,但最終用戶是不可能接受這種粗野的出錯頁面的。JSP允許你通過<%@ page errorPage%>為頁面指定一個專門處理錯誤的JSP頁面,以便用一種友好、直觀的形式展現(xiàn)錯誤。在下一節(jié)里,我們將創(chuàng)建一個用于處理錯誤的JSP頁面,在創(chuàng)建之后,我們再來為switch.jsp指定錯誤處理JSP頁面。
jsp技術:JBuilder2005實戰(zhàn)JSP之切換控制 圖文步驟,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。