官术网_书友最值得收藏!

3.4 JSP動作元素

JSP動作元素(Action Element)和JSP指令元素不同,它是在客戶端請求時動態執行的,是通過XML語法格式的標記來實現控制Servlet引擎行為的。JSP動作元素是一種特殊標簽,并且以前綴jsp和其他的HTML標簽相區別,利用JSP動作元素可以實現很多功能,包括動態地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼等。JSP定義了幾個預設的Action Element標簽,如表3-1所示。

表3-1 JSP預設Action Element標簽

表3-1中第一部分的操作元素是在JSP網頁中使用JavaBean及屬性值存取的元素,這一部分在第6章中會有詳細的說明。第三部分是JSP 2.0規格里新增的與XML有關的元素,本章接下來的部分將針對一般性的Action Element的使用方式進行說明。

3.4.1 <jsp:include>

<jsp:include>動作元素可以用來包含其他靜態和動態頁面。JSP有兩種不同的包含方式:編譯時包含和運行時包含。編譯時包含只是將靜態文件內容加到JSP頁面中,其優點是速度快,如前面提到的<%@ include file="" %>指令。運行時包含指被包含的文件在運行時被JSP容器編譯執行,<jsp:include>的包含就是運行時包含,同時支持編譯時包含。

<jsp:include>有帶參數和不帶參數兩種語法格式,分別如下:

     <jsp:include page="relative URL" flush="true|false"/>

     <jsp:include page="relative URL" flush="true|false">
     <jsp:param name="attributeName" value="attributeValue"/>
     <jsp:param …
     </jsp:include>

其中,relative URL指代被包含文件的相對路徑;屬性flush為true時,表示實時輸出緩沖區。<jsp:param>用于在包含文件時傳遞一些參數,一個<jsp:include>中可以包含一個或多個<jsp:param>動作元素。

下面通過一個具體的例子來闡述<jsp:include>動作元素的用法。

【例3-13】文件jsp_include.jsp靜態包含文件static.html,動態包含文件action.jsp。

jsp_include.jsp代碼如下:

其中,方法String request.getParameter("parameterName")以字符串的形式返回客戶端傳來的某一個請求參數的值,該參數名由parameterName指定。當傳遞給此方法的參數名沒有實際參數與之對應時,返回null。

static.html代碼如下:

action.jsp代碼如下:

jsp_include.jsp執行時,它所靜態包含的文件static.html顯示的表單出現在頁面的上方,而它動態包含的文件action.jsp出現在頁面的下方,實際上包含進來的是action.jsp的執行結果。此時并未提交數據,所以a1和a2都顯示為null,程序執行的結果如圖3-16所示。當在表單中輸入數據并單擊login按鈕提交后,頁面下方的a1和a2顯示輸入的數據,說明參數傳遞已經成功,程序執行的結果如圖3-17所示。從圖中可以看出,action.jsp的內容是動態變化的,它的內容由a1和a2參數決定,而static.html文件的內容是不變的。

圖3-16 jsp_include.jsp的執行結果

圖3-17 jsp_include.jsp提交數據后的執行結果

如果通過超級鏈接跳轉到action.jsp,頁面的執行結果如圖3-18所示,因為超級鏈接中并沒有傳遞參數,所以a1和a2都顯示為null。

圖3-18 通過超級鏈接跳轉到action.jsp頁面的執行結果

由于<jsp:include>也可以包含靜態文件,所以文件jsp_include.jsp中的代碼<%@ include file="static.html"%>改為<jsp:include page="static.html" flush="true"/>,執行結果是一樣的。

如果把【例3-12】中的<%@include%>改為<jsp:include>,則頁面不能顯示<%=formatter.Format(cal.getTime())%>的計算結果,正說明了兩種包含的區別。

注意

? 使用操作元素的單行語句,必須在該元素語句后加上斜線(/)。

? 與使用<%@ include %>的注意事項相同,被包含的文件中不要重復出現某些HTML標記,以免出錯。

JSP中include指令與include動作的區別如下:

include指令是指把其他頁面的Java代碼(源碼)加進來,跟本頁面的代碼合并在一起,相當于把源代碼從原頁面復制到本頁面中來,然后再編譯。由于本頁面在編譯時已經包含了別的文件的源代碼,所以以后其他頁面更改時,本頁面并不理會,因為已經編譯過了。

include動作是指兩個頁面的代碼運行完以后,再把包含的那個頁面運行后的HTML結果頁面,加到本頁面運行后的HTML結果頁面中來,所以是運行時包含,并且還可以傳遞參數給被包含的頁面。

表3-2列出了include指令與include動作的主要區別。

表3-2 include指令與include動作的主要區別

3.4.2 <jsp:forward>

<jsp:forward>用于在服務器端結束當前頁面的執行,并從當前頁面跳轉到其他指定頁面,轉向的目標頁面可以是靜態的HTML頁面、JSP文件或Servlet類。這個元素的使用語法和<jsp:include>類似。

<jsp:forward>既可以帶參數,也可以不帶參數,它們的語法格式分別如下:

     <jsp:forward page="pageURL"/>

     <jsp:forward page="pageURL">
     <jsp:param name="attributeName" value="attributeValue"/>
     <jsp:param …
     </jsp:forward>

【例3-14】usingForward.jsp重定向到頁面forwardTo.jsp,可以很清楚地了解<jsp:forward>操作元素的使用方法與功能。

usingForward.jsp代碼如下:

使用<jsp:forward>元素將網頁重定向到程序forwardTo.jsp,且不傳遞任何參數。

forwardTo.jsp代碼如下:

執行結果如圖3-19所示,其中地址欄顯示為usingForward.jsp,但是由于指令<jsp:forward>執行的關系,顯示的卻是forwardTo.jsp網頁的內容,并且指令<jsp:forward>后面的文字“此行代碼將不能顯示!”沒有顯示出來。

圖3-19 usingForward.jsp執行結果

<jsp:forward>操作典型的使用就是登錄,如進行權限驗證的頁面。當驗證通過后,就把頁面forword到登錄成功頁面;當驗證不通過時,就把頁面forword到登錄頁面。

【例3-15】login.jsp是用戶登錄界面,checklogin.jsp是登錄驗證界面,如果驗證成功,它把頁面forword到success.jsp頁面;如果不成功,它把頁面forword到login.jsp頁面進行重新驗證。

login.jsp代碼如下:

checklogin.jsp代碼如下:

success.jsp代碼如下:

     <%@page contentType="text/html;charset=gb2312"%>
     登錄成功
     <br>
     歡迎你,
     <%=request.getParameter("user") %>

login.jsp執行的結果如圖3-20所示,輸入正確的用戶名和密碼,單擊login按鈕提交后,經checklogin.jsp驗證,驗證成功,它把頁面forword到success.jsp頁面,如圖3-21所示。如果輸入錯誤的用戶名和密碼,checklogin.jsp把頁面forword到login.jsp頁面進行重新驗證,如圖3-22所示。輸入的用戶名作為參數,通過checklogin.jsp傳遞給login.jsp和success.jsp。

圖3-20 login.jsp執行結果

圖3-21 驗證成功forword到sucess.jsp的執行結果

圖3-22 驗證失敗forword到login.jsp的執行結果

在頁面重定向的過程中,圖3-21和圖3-22地址欄中的地址并沒有發生變化,這樣防止用戶跳過登錄驗證頁面而直接進入到其他網頁。另外,由于地址不變,就不會產生新的request,可以在頁面重定向的時候不傳遞參數,而使用request.getParameter("name"),注意此參數名是name,就是表單中的用戶名,程序執行的結果是一樣的。讀者可以更改程序代碼,查看運行結果,體會forword的含義。在4.3.2節,通過forword和sendRedirect的比較,讀者將能更加清楚地理解重定向的本質。

3.4.3 <jsp:param>

<jsp:param>元素主要用來傳遞參數給JSP程序,而由程序取得參數值,在程序中便是一個變量值。此操作元素的語法如下:

     <jsp:param name="attributeName" value="attributeValue"/>

<jsp:param>元素在使用時必須要設置其name屬性,表示傳遞參數的名稱,并通過value屬性來設置該參數的值。JSP操作元素和HTML不同,要設置元素的屬性則必須加上雙引號,否則執行時會出現錯誤。

使用<jsp:param>元素來傳遞參數,在JSP程序中則是以如下的程序代碼來取得此參數的值,這與取得用戶輸入數據的方式相同,是通過使用預設對象request的getParameter()方法來取得<jsp:param>所設置的參數值。

     request.getParameter("attributeName ");

<jsp:param>操作元素的使用必須配合<jsp:include>、<jsp:forward>及<jsp:plugin>等元素,在加載外部程序或是網頁轉換的時候,傳遞參數給另一個JSP程序。

3.4.4 <jsp:useBean>、<jsp:setProperty>和<jsp:getProperty>動作

1. <jsp:useBean>

<jsp:useBean>用來加載JSP頁面中使用的JavaBean,其語法格式如下:

     <jsp:useBean
     id="beanInstanceName"
     scope="page|request|session|application"
     class="package.class"
     ></useBean>

其中,id指定該JavaBean的實例變量的名稱,scope指定該Bean變量的有效范圍。page指只在當前JSP頁面中有效;request指在任何執行相同請求的JSP文件中使用Bean,直到頁面執行完畢;session指從創建該Bean開始,在相同session下的JSP頁面中可以使用該Bean;application指從創建該Bean開始,在相同application下的JSP頁面中可以使用該Bean。class屬性指定Bean的類路徑和類名,不可接受動態值,不能是抽象的,表3-3說明了這些屬性的用法。

表3-3 <jsp:useBean>的屬性和用法

注意

包含Bean的類文件應該放到服務器正式存放Java類的目錄下,而不是保留給修改后能夠自動裝載的類的目錄。

【例3-16】<jsp:useBean>動作實例useBean.jsp代碼如下:

useBean.jsp運行結果如圖3-23所示。

圖3-23 useBean.jsp運行結果

<jsp:useBean>的bean屬性用于指定Bean的名字,可以接受動態值。beanName屬性必須與type屬性結合使用,不能與Class屬性同時使用。

【例3-17】<jsp:useBean>動作實例useBeanBeanName.jsp代碼如下:

useBeanBeanName.jsp運行結果如圖3-24所示。

圖3-24 useBeanBeanName.jsp運行結果

2. <jsp:setProperty>

<jsp:setProperty>用于設置Bean的屬性值。語法格式如下:

<jsp:setProperty>動作用來設置已經實例化的Bean對象的屬性,它有以下兩種用法。

(1)可以在<jsp:useBean>元素的外面(后面)使用<jsp:setProperty>。

     <jsp:useBean id="myName" ... />
     ...
     <jsp:setProperty name="myName" property="someProperty" ... />

此時,不管<jsp:useBean>是找到了一個現有的Bean,還是新創建了一個Bean實例,<jsp:setProperty>都會執行。

(2)把<jsp:setProperty>放入<jsp:useBean>元素的內部。

     <jsp:useBean id="myName" ... >
     ...
     <jsp:setProperty name="myName" property="someProperty" ... />
     </jsp:useBean>

此時,<jsp:setProperty>只有在新建Bean實例時才會執行,如果使用現有實例,則不執行<jsp:setProperty>。

<jsp:setProperty>動作有4個屬性,這4個屬性及其用法如表3-4所示。

表3-4 <jsp:setProperty>的屬性和用法

<jsp:setProperty>元素使用Bean給定的set方法,在Bean中設置一個或多個屬性值。在使用這個元素之前必須首先使用<jsp:setProperty>聲明此Bean。因為<jsp:useBean>和<jsp:setProperty>是聯系在一起的,同時使用Bean實例的名字也應當相匹配。就是說,在<jsp:setProperty>中的name值應當和<jsp:useBean>中的id值相同,且大小寫敏感。

可以使用以下方法來設定<jsp:setProperty>屬性值:

通過用戶輸入的所有值(被作為參數存儲在request對象中)來匹配Bean中的屬性。

通過用戶輸入的指定值來匹配Bean中指定的屬性。

在運行時使用一個表達式來匹配Bean的屬性。

每一種設定屬性值的方法都有其特定的語法,使用時應注意以下幾個方面:

在Bean中的屬性名字必須和request對象中的參數名一致。

如果request對象的參數值中有空值,那么對應的Bean屬性將不會設定任何值。同樣,如果Bean中有一個屬性沒有與之對應的request參數值,那么這個屬性同樣也不會設定。

如果Bean屬性和request參數的名字不同,那么用戶就必須得指定property和param,如果它們同名,那么只需要指明property即可。

如果參數值為空(或未初始化),則對應的Bean屬性不用被設定。

如果用戶使用了property="*",那么Bean的屬性沒有必要按HTML表單中的順序排序,只要名稱正確就可以了。

【例3-18】<jsp:setProperty>的屬性和用法,useBeanParam.jsp代碼如下:

useBeanParam.jsp運行結果如圖3-25所示。

圖3-25 useBeanParam.jsp運行結果

3. <jsp:getProperty>

使用<jsp:getProperty>可獲取Bean的屬性值,并在頁面中顯示。其語法格式如下:

          <jsp:getProperty name="beanInstanceName" property=
     "propertyName" />

<jsp:getProperty>語法屬性的含義如下。

(1)name="beanInstanceName"

Bean的名字由<jsp:useBean>指定。

(2)property="propertyName"

指定Bean的屬性名,例如:

     <jsp:useBean id="calendar" scope="page" class="employee.Calendar" />
     <jsp:getProperty name="calendar" property="username" />

<jsp:getProperty>元素可以獲得Bean的屬性值,并可以將其使用或顯示在JSP頁面中。在使用<jsp:getProperty>之前,必須有由<jsp:useBean>所創建的Bean對象。

使用<jsp:getProperty>元素時注意以下限制:首先不能使用<jsp:getProperty>來檢索一個已經被索引了的屬性;其次,能夠和JavaBean組件一起使用<jsp:getProperty>,但是不能與Enterprise Bean(企業級Bean)一起使用。

在Sun公司的JSP參考中提到,如果使用<jsp:getProperty>來檢索的值是空值,那么將會產生NullPointerException;如果使用程序段或表達式來檢索值,那么在瀏覽器上出現的將是null(空值)。

【例3-19】通過一個用戶注冊的例子來具體介紹這三個動作元素的使用方法,因為使用之前先要創建一個JavaBean,在ch03項目中建立一個名為TestBean的Java類(關于JavaBean的概念及具體的創建方法,會在第6章詳細介紹)。

TestBean.java代碼如下:

從面向對象角度來看,這個TestBean類代表了用戶,它具有用戶名、用戶密碼、年齡等屬性。這個JavaBean的方法都是setProperty()和getProperty()類型的,主要用來配合JSP頁面中的<jsp:setProperty>和<jsp:getProperty>動作元素。這些方法在Eclipse開發環境中可以自動生成,不需要一個一個寫出來,具體方法在后面章節中會介紹。創建這個類的實例可以代表一個一個不同的用戶。

用戶登錄文件register.html的代碼如下:

register.jsp顯示注冊成功的用戶的提交信息,代碼如下:

register.jsp文件使用<jsp:useBean>、<jsp:setProperty>和<jsp:getProperty>這3個動作元素來處理用戶填寫的信息,并將結果顯示在頁面上。

程序register.html執行結果如圖3-26所示,輸入注冊信息并提交。成功后,注冊信息通過register.jsp頁面顯示出來,如圖3-27所示。

圖3-26 register.html的執行結果

圖3-27 register.jsp的執行結果

在本例中,register.jsp中的代碼<jsp:useBean id="user" scope="page" class="ch03.TestBean" />指定在本頁面中使用JavaBean,此JavaBean的類為ch03.TestBean,id為user。

在register.html中表單的參數名和TestBean.java中的屬性名完全一樣,所以在register.jsp中可以通過<jsp:setProperty name="user" property="*" />把用戶從表單提交的數據傳遞給TestBean的對象user。

在register.jsp中,可以通過user.getUserName()方法獲得用戶名信息,也可以通過<jsp:getProperty name="user" property="userName" />獲得JavaBean的屬性,兩種方法的執行結果是一樣的。

為了理解<jsp:getProperty>的使用,并演示form參數和JavaBean屬性的關系,把【例3-19】做以下兩種更改。

(1)把register.html中表單參數userName改為xingming(即和JavaBean的屬性名不一致),修改后的代碼如下:

     <td>姓名:<input name="xingming" type="text"></td>

其他代碼保持不變,把它保存為register2.html。重新執行程序,可以看到,由于表單參數xingming和Bean屬性名不一致,使用<jsp:setProperty name="user" property="*" />指令為JavaBean設置屬性時并沒有設置xingming屬性,所以造成user.getUserName()方法返回空的結果。程序執行結果如圖3-28所示。

圖3-28 測試form參數和Bean屬性不一致的執行結果

此時需要更改register.jsp,代碼如下:

     <jsp:setProperty name="user" property="userName" param="xingming"/>
     <jsp:setProperty name="user" property="*" />

而其他的兩個屬性沒有任何變化,所以依然用<jsp:setProperty name="user" property="*" />即可。把更改過的文件保存為register2.jsp,然后register2.html把信息提交給register2.jsp處理。

     <form method="get" action="register2.jsp">

再次執行程序,輸入一些信息并提交,這次可以把form的參數和Bean的屬性進行重新映射,程序執行結果如圖3-29所示。

圖3-29 測試form參數和Bean屬性一致的執行結果

(2)把register2.jsp中的

     <jsp:setProperty name="user" property="userName" param="xingming"/>

改為

     <jsp:setProperty name="user" property="userName" value="xingming"/>

重新執行程序,輸入數據并提交,可以看出,不管在表單中輸入的用戶名是什么,在執行register.jsp后,用戶名信息都是xingming。程序執行結果如圖3-30所示。

圖3-30 測試value屬性的執行結果

通過上面的兩個實例,讀者應該能夠理解param和value標記的作用了。

需要注意的是,<jsp:setProperty>元素使用Bean給定的set()方法,在Bean中設置一個或多個屬性值,是按照設置的先后順序來確定的,再把【例3-19】做以下兩種更改。

(1)register.html保持不變,此時需要更改register.jsp,代碼如下:

     <jsp:setProperty name="user" property="age" value="30"/>
     <jsp:setProperty name="user" property="*" />

把更改過的文件保存為register3.jsp。然后register.html把信息提交給register3.jsp處理。

     <form method="get" action="register3.jsp">

再次執行程序,輸入一些信息并提交。注意,此次填寫年齡為25,form的參數和Bean的屬性進行重新映射。程序執行結果如圖3-31所示。

圖3-31 測試屬性先后設置的執行結果

(2)register.html保持不變,把register3.jsp的兩行代碼順序交換,代碼如下:

     <jsp:setProperty name="user" property="*" />
     <jsp:setProperty name="user" property="age" value="30"/>

把更改過的文件保存為register4.jsp,然后register.html把信息提交給register4.jsp處理。

     <form method="get" action="register4.jsp">

再次執行程序,輸入一些信息并提交。注意,此次填寫年齡仍然為25,form的參數和Bean的屬性進行重新映射。程序執行結果如圖3-32所示。比較這兩次程序執行的結果發現,年齡的值第一次是從表單提交得來的數據,而第二次是固定值30,這與set方法設置的先后順序有關。

圖3-32 代碼順序交換后的執行結果

3.4.5 <jsp:plugin>

<jsp:plugin>操作元素的功能在于從JSP網頁中加載Java Applet或JavaBean程序組件,與HTML的<Applet>與<Object>標簽有著類似的功能。這個元素有許多屬性設置,以下是此元素的使用語法。

     <jsp:plugin
     type="bean|applet"
     code="classFileName"
     codebase="classFileDirectoryName"
     name="instanceName"
     align="left|right|top|middle|bottom"
     width="width"
     height="height"
     hspace="horizontalSpace"
     vspace="verticalSpace"
     archive="archiveURL,…"
     >
     <jsp:params>
     <jsp:param name="propertyName" value="propertyValue"/>
     …
     </jsp:params>
     <jsp:fallback>text message</jsp:fallback>
     </jsp:plugin>

<jsp:plugin>元素的屬性如表3-5所示。

表3-5 <jsp:plugin>元素屬性

【例3-20】演示<jsp:plugin>元素的用法。使用<jsp:plugin>加載兩個Java Applet程序,其中一個Applet程序將指定的圖片顯示在窗口中,另一個Applet程序則會取得幾個<jsp:param>所設置的參數,并將參數的內容輸出到窗口中。

showmsg.java代碼如下:

為了演示<jsp:plugin>,設計一個名稱為howmsg的applet,主要是用來取得JSP網頁中所設置的各個參數:msg1、msg2及msg3。然后將這些參數的內容顯示在該Applet在網頁中所顯示的區域中。

usingPlugin.jsp代碼如下:

程序代碼引用<jsp:plugin>,將上述程序showmsg.java編譯的Applet組件showmsg.class加載至網頁當中,<jsp:plugin type = "applet" code = "ch03/showmsg.class" height = "200" width = "200">表示在JSP頁面中插入Applet類型的小程序,該小程序的字節碼文件"ch03/showmsg.class"存放在與JSP頁面相同的目錄下,小程序在瀏覽器的顯示為高200像素,寬200像素大小。<jsp:params>語句依次設置每個要傳遞給Applet程序的參數,分別是3個程序語言的名稱,其執行結果如圖3-33所示。

圖3-33 usingPlugin.jsp執行結果

主站蜘蛛池模板: 嵊泗县| 乳源| 兴文县| 珠海市| 科尔| 湖州市| 政和县| 龙南县| 达日县| 麦盖提县| 抚顺市| 静安区| 突泉县| 沂源县| 远安县| 莱西市| 招远市| 同江市| 乌审旗| 伊宁县| 西畴县| 新郑市| 密山市| 台湾省| 小金县| 临高县| 古丈县| 廉江市| 临潭县| 西华县| 东光县| 博乐市| 广水市| 华池县| 靖宇县| 安仁县| 昌吉市| 贵州省| 东海县| 巨野县| 宜君县|