JSP入門初級教程之Actions的使用
JSP actions 使用您可以動態的插入一個文件,重用JavaBeans組件,前進到另一個頁面,或為Java 插件生成一個HTML。可以使用的action 有:
(1) jsp:include --在頁面被請求時包含進一個文件。
(2) jsp:useBean--找到或實例化一個JavaBean。
(3) jsp:setProperty--設置一個JavaBean屬性。
(4) jsp:getProperty--將JavaBean的屬性插入到輸出。
(5) jsp:forward--讓請求者可以向前到一個新的頁面。
(6) jsp:plugin--用OBJECT或EMBED標簽為Java plugins生成特定的瀏覽器的代碼。
1、jsp:include Action
這個action使您可以在即將生成的頁面上包含進一些文件:
與include directive不同,這個action是在頁面被請求時才將文件包含進來,而,include directive則是在JSP頁面被轉換為servlet時包含文件。為了提高效率,include action做了一點小小的犧牲,即,它不允許被包含的頁面含有一般的JSP代碼(例如,不可設置HTTP頭),但是,它具有顯著的靈活性,如下面的JSP 代碼,它實現將四個不同的片段插入如下的頁面。每一次當標題改變的時候,您僅需修改這四個文件而無須更改主要的JSP 頁面。
WhatsNew.jsp
當然您可以定義自己? ML文件,但有一點請注意:
您應該將文件放到您的JSP目錄下的news目錄內。
jsp:useBean Action 的使用
一、 語法:
這個action使您能將一個JavaBean裝入一個JSP頁面。這是一個非常有用的能力,因為它使您可以使用可重用的JAVA類而不需犧牲性能。最簡單的語法用于指定一個bean:
這通常意味著“實例化一個類的對象通過指定一個類,并將之與一個通過id指定名稱的變量綁定”。然而,就象我們看到的,您可以指定一個scope屬性來使得bean不僅僅與當前的頁面相聯系。在這種情形下,得到一個對已存在的bean的引用是非常有用的,而且,僅當沒有相同的id和scope的bean存在時才創建一個新的。現在,您已有了bean,您可以通過jsp:setProperty來修改它,或者,通過使用之前用id指定的名字來使用scriptlet或明確的調用方法。當您說“這個bean有一個稱為foo的X類型的屬性”,您真正的意思是“這個類有一個稱為getFoo的方法,它返回X類型的某類值,還有另一個方法稱為setFoo,它以X為參數。”這jsp:setProperty action 將在下一單元詳細的介紹,但是現在您既可以給出一個明確的值,給出一個屬性來說明此值是從request的參數繼承而來,也可以僅僅列出屬性來標志此值應該從與屬性名同名的參數繼承而來。您可以通過調用適用的getXxx方法,或更普遍的,使用jsp:getProperty action,來得到已存在的JSP表達式或scriptlet屬性。
請注意,為bean指定的類必須在服務器的規則的類路徑下,而不是用來保留當改變時自動裝載的類的路徑。例如,在Java Web Server上,它和它所用的類必須到類的目錄或在lib目錄下的一個jar文件內,而不是在servlets的目錄下。
下面讓我們來看一個非常簡單的例子,它裝載一個bean并且設置/得到一個簡單的串參數。
BeanTest.jsp
SimpleBean.java
以下是bean的原代碼:
運行結果為:頁面輸出: Reusing JavaBeans in JSP
Message:Hello WWW
二、jsp:useBean 的詳細用法
最簡單的使用bean的方式是:
為了裝載bean,需要用jsp:setProperty和 jsp:getProperty來修改和檢索bean的屬性。且,還有兩種別的選項。首先,您可以使用容器的格式,也就是:
要指出的是,Body部分應該僅在bean第一次實例化時被執行,而不是在每次被找到和使用時。Beans能夠被共享,因此,并不是所有的jsp:useBean 陳述都產生一個新的bean的實例。其次,除了id 或class以外,還有三種屬性您可以使用:scope,type,和beanName。這些屬性總結如下:
三、jsp:setProperty Action
語法:
在前面我們就知道了可以使用 jsp:setProperty 來為一個bean的屬性賦值。您可以使用兩種方式實現它。其一是,在jsp:useBean后(而不是在之內)使用jsp:setProperty:
在這種方式中,jsp:setProperty 將被執行無論是否已有一個具有相同的id和scope的bean存在。另一種方式是,jsp:setProperty出現在jsp:useBean 元素內,如:
此種情況下,jsp:setProperty僅在新的對象被實例化時才執行。
以下是四種jsp:setProperty的可用的屬性:
如果您將value和param同時缺省,這和您將param的名稱設為bean的屬性名相同一樣。您可以通過將name的值設置為”*”和省略value和param來自動的使用與bean的屬性相應的request的屬性。在這種情況下,服務器將反復的查找可用的屬性和request參數來匹配具有相同名字的。
四、jsp:getProperty Action
語法:
這個屬性檢索出bean的屬性的值并將之轉化為一個字符串,然后將之插入到輸出。它有兩個必選屬性:name,在之前用jsp:useBean引入的名稱,property,必須被插入值的屬性。
(1) jsp:include --在頁面被請求時包含進一個文件。
(2) jsp:useBean--找到或實例化一個JavaBean。
(3) jsp:setProperty--設置一個JavaBean屬性。
(4) jsp:getProperty--將JavaBean的屬性插入到輸出。
(5) jsp:forward--讓請求者可以向前到一個新的頁面。
(6) jsp:plugin--用OBJECT或EMBED標簽為Java plugins生成特定的瀏覽器的代碼。
1、jsp:include Action
這個action使您可以在即將生成的頁面上包含進一些文件:
| <jsp:include page="relative URL" flush="true" /> |
與include directive不同,這個action是在頁面被請求時才將文件包含進來,而,include directive則是在JSP頁面被轉換為servlet時包含文件。為了提高效率,include action做了一點小小的犧牲,即,它不允許被包含的頁面含有一般的JSP代碼(例如,不可設置HTTP頭),但是,它具有顯著的靈活性,如下面的JSP 代碼,它實現將四個不同的片段插入如下的頁面。每一次當標題改變的時候,您僅需修改這四個文件而無須更改主要的JSP 頁面。
WhatsNew.jsp
| <HTML> <HEAD> <TITLE> JSP教程</TITLE> <BODY > <CENTER> <TABLE BORDER=5 BGCOLOR="#EF8429"> <TR><TH CLASS="TITLE"> What"s New at Chinese comic sites</TABLE> </CENTER> <P> Here is a summary of our four most recent news stories: <OL> <LI><jsp:include page="news/Item1.html" flush="true"/> <LI><jsp:include page="news/Item2.html" flush="true"/> <LI><jsp:include page="news/Item3.html" flush="true"/> <LI><jsp:include page="news/Item4.html" flush="true"/> </OL> </BODY> </HTML> |
當然您可以定義自己? ML文件,但有一點請注意:
您應該將文件放到您的JSP目錄下的news目錄內。
jsp:useBean Action 的使用
一、 語法:
| <jsp:useBean id="beanInstanceName" scope="page|request|session|application" { class="package.class" | type="package.class" | class="package.class" type="package.class" | beanName="{package.class | <%= expression %>}" type="package.class" } { /> | > 其他元素 </jsp:useBean> } |
這個action使您能將一個JavaBean裝入一個JSP頁面。這是一個非常有用的能力,因為它使您可以使用可重用的JAVA類而不需犧牲性能。最簡單的語法用于指定一個bean:
| <jsp:useBean id="name" class="package.class" /> |
這通常意味著“實例化一個類的對象通過指定一個類,并將之與一個通過id指定名稱的變量綁定”。然而,就象我們看到的,您可以指定一個scope屬性來使得bean不僅僅與當前的頁面相聯系。在這種情形下,得到一個對已存在的bean的引用是非常有用的,而且,僅當沒有相同的id和scope的bean存在時才創建一個新的。現在,您已有了bean,您可以通過jsp:setProperty來修改它,或者,通過使用之前用id指定的名字來使用scriptlet或明確的調用方法。當您說“這個bean有一個稱為foo的X類型的屬性”,您真正的意思是“這個類有一個稱為getFoo的方法,它返回X類型的某類值,還有另一個方法稱為setFoo,它以X為參數。”這jsp:setProperty action 將在下一單元詳細的介紹,但是現在您既可以給出一個明確的值,給出一個屬性來說明此值是從request的參數繼承而來,也可以僅僅列出屬性來標志此值應該從與屬性名同名的參數繼承而來。您可以通過調用適用的getXxx方法,或更普遍的,使用jsp:getProperty action,來得到已存在的JSP表達式或scriptlet屬性。
請注意,為bean指定的類必須在服務器的規則的類路徑下,而不是用來保留當改變時自動裝載的類的路徑。例如,在Java Web Server上,它和它所用的類必須到類的目錄或在lib目錄下的一個jar文件內,而不是在servlets的目錄下。
下面讓我們來看一個非常簡單的例子,它裝載一個bean并且設置/得到一個簡單的串參數。
BeanTest.jsp
| <HEAD> <TITLE>Reusing JavaBeans in JSP</TITLE> </HEAD> <BODY> <CENTER> <TABLE BORDER=5> <TR><TH CLASS="TITLE"> Reusing JavaBeans in JSP</TABLE> </CENTER> <P> <jsp:useBean id="test" class="hall.SimpleBean" /> <jsp:setProperty name="test" property="message" value="Hello WWW" /> <H1>Message: <I> <jsp:getProperty name="test" property="message" /> </I></H1> </BODY> |
SimpleBean.java
以下是bean的原代碼:
| package hall; public class SimpleBean { private String message = "No message specified"; public String getMessage() { return(message); } public void setMessage(String message) { this.message = message; } } |
運行結果為:頁面輸出: Reusing JavaBeans in JSP
Message:Hello WWW
二、jsp:useBean 的詳細用法
最簡單的使用bean的方式是:
| <jsp:useBean id="name" class="package.class"/> |
為了裝載bean,需要用jsp:setProperty和 jsp:getProperty來修改和檢索bean的屬性。且,還有兩種別的選項。首先,您可以使用容器的格式,也就是:
| <jsp:useBean ...> Body </jsp:useBean> |
要指出的是,Body部分應該僅在bean第一次實例化時被執行,而不是在每次被找到和使用時。Beans能夠被共享,因此,并不是所有的jsp:useBean 陳述都產生一個新的bean的實例。其次,除了id 或class以外,還有三種屬性您可以使用:scope,type,和beanName。這些屬性總結如下:
| 屬性 | 含義 |
| id | 給一個變量命名,此變量將指向bean。如果發現存在一個具有相同的id和scope 的bean則使用之而不新建一個。 |
| class | 指出bean的完整的包名。 |
| scope | 指明bean在之上可以被使用的前后關系。有四個可能的值:page,request,session,和application。缺省為page,表明bean僅在當前頁可用(保存在當前的PageContext中)。request的一個值表明bean僅用于當前客戶端的請求(保存在ServletRequest對象中)。Session的值指出在當前的HttpSession的生命周期內,對象對所有的頁面可用。 最后,application的值指出對象對所有共享ServletsContext的頁面可以使用。使用jsp:useBean 僅在沒有相同的id和scope 的bean時創建一個新的bean,如果已有則使用之,并忽略以jsp:useBean標志開始和結尾的代碼。 |
| type | 指明將指向對象的變量的類型。這必須與類名相匹配或是一個超類或者是一個實現類的接口。記住,變量的名由id屬性來指定。 |
| beanName | 賦予bean一個名字,您應該在Beans的實例化方法中提供。它允許您給出type和一個beanName,并省略類屬性。 |
三、jsp:setProperty Action
語法:
| <jsp:setProperty name="beanInstanceName" { property="*" | property="propertyName" [ param="parameterName" ] | property="propertyName" value="{string | <%= expression %>}" } /> |
在前面我們就知道了可以使用 jsp:setProperty 來為一個bean的屬性賦值。您可以使用兩種方式實現它。其一是,在jsp:useBean后(而不是在之內)使用jsp:setProperty:
| <jsp:useBean id="myName" ... /> ... <jsp:setProperty name="myName" property="someProperty" ... /> |
在這種方式中,jsp:setProperty 將被執行無論是否已有一個具有相同的id和scope的bean存在。另一種方式是,jsp:setProperty出現在jsp:useBean 元素內,如:
| <jsp:useBean id="myName" ... > ... <jsp:setProperty name="myName" property="someProperty" ... /> </jsp:useBean> |
此種情況下,jsp:setProperty僅在新的對象被實例化時才執行。
以下是四種jsp:setProperty的可用的屬性:
| 屬性 | 用法 |
| name | 這是一個必選屬性。它指出哪一個bean的屬性將被設置。jsp:usebean必須出現在jsp:setProperty之前。 |
| property | 這是一個必選屬性。表明您將設置哪一個屬性。然而,有一個特殊的情況:如果以"*"為值意味著,所有的名稱與bean的屬性匹配的request參數都將被傳遞到相應的屬性設置方法。 |
| value | 這是一個可選屬性。它指定被設置的屬性的值。字符串的值通過相應的對象或包的標準的valueOf方法將自動的轉換為numbers,boolean,Boolean,byte,Byte,char,和Character。例如,boolean或Boolean屬性的值“true”將通過Boolean.valueOf方法轉化,而,一個int或Integer屬性的值“42”將通過Integer.valueOf轉化。您不能同時使用value和param屬性,但,兩個都不用是允許的。 |
| param | 這是一個可選屬性。它指明了bean的屬性應該繼承的request的參數。如果當前的request沒有這樣的一個參數,就什麼也不做:系統并不將null傳給設置屬性的方法。因此,您可以使用bean的缺省值。例如下面的這段程序執行“將numberOfItems屬性設置為任意numItems request參數的值,如果有這樣的一個request參數,否則什么也不做。” <jsp:setProperty name="orderBean" property="numberOfItems" param="numItems" /> |
如果您將value和param同時缺省,這和您將param的名稱設為bean的屬性名相同一樣。您可以通過將name的值設置為”*”和省略value和param來自動的使用與bean的屬性相應的request的屬性。在這種情況下,服務器將反復的查找可用的屬性和request參數來匹配具有相同名字的。
四、jsp:getProperty Action
語法:
| <jsp:getProperty name="beanInstanceName" property="propertyName" /> |
這個屬性檢索出bean的屬性的值并將之轉化為一個字符串,然后將之插入到輸出。它有兩個必選屬性:name,在之前用jsp:useBean引入的名稱,property,必須被插入值的屬性。