JavaBean在JSP中的應用(3個JSP標籤)
一、在JSP中如何使用JavaBean
為了能在JSP頁面中整合JavaBean元件和支援JavaBean的功能,JSP規範專門定義了三個JSP標籤:<jsp:useBean>、<jsp:setProperty>和<jsp:getProperty>,它們分別用於建立和查詢JavaBean的例項物件,設定JavaBean物件的屬性,讀取JavaBean物件的屬性。對於JSP頁面來說,只要一個類具有一個公共的、無引數的構造方法,就可以把這個類當做JavaBean來使用,如果類中有不接受任何引數的getter方法或只接受一個引數的setter方法,就可以把字首get或set後面的部分當著一個屬性名來引用。例如,JDK自帶的java.util.Date類具有一個公共的、無引數的構造方法,其中還包含一個定義的方法:
publicvoidsetTime(long time)
因此,在JSP頁面可以把該類當做一個JavaBean來看待,且認為該JavaBean包含一個time的屬性。
-
JSP頁面按照呼叫JavaBean的方式對Date類進行呼叫
<jsp:useBeanid="currentDate"class="java.util.Date" />
<jsp:setPropertyname="currentDate"property="time"value="1234567" />
<jsp:getPropertyname="currentDate"property="time" />
-
JSP頁面像呼叫一個普通Java類的方式呼叫JavaBean
<%java.util.DatecurrentDate = newjava.util.Date();
currentDate.setTime(1234567);
out.println(currentDate.getTime());
%>
二、<jsp:useBean>標籤
該標籤用於在某個指定的域範圍(application、session、request、pageContext等)中查詢一個指定名稱的JavaBean物件,如果存在則直接返回該JavaBean物件的引用。如果不存在則例項化一個新的JavaBean物件,並將它按指定的名稱儲存在指定的域範圍中。常見語法如下:
<jsp:useBean id="beanInstanceName" class="package.class"
scope="page|request|session|application" />
其中,class屬性用於指定JavaBean的完整類名,JSP引擎將使用這個類名來建立JavaBean的例項物件或作為查詢到JavaBean物件的型別;id屬性用於指定JavaBean例項物件的引用名稱和其儲存在域範圍的名稱;scope屬性用於指定JavaBean例項物件所儲存的域範圍,其預設值是page。
-
page表示將JavaBean例項物件儲存在PageContext物件中,預設儲存進page域範圍;
-
request表示將JavaBean例項物件儲存在ServletRequest物件中;
-
session表示將JavaBean例項物件儲存在HttpSession物件中。此設定要求當前JSP頁面支援Session,即沒有將page指令的session屬性設定為false;
-
application表示將JavaBean例項物件儲存在ServletContext物件中。
除了上述幾個屬性,該標籤還有:
-
type屬性
用於指定JavaBean例項物件的引用變數的型別,它必須是JavaBean物件的類名稱、父類名稱或所實現的介面名稱中的一個。type屬性的預設值為class屬性的設定值,當JSP引擎將標籤翻譯成Servlet程式中的程式碼時,將使用type屬性值作為JavaBean物件引用變數的型別。
-
beanName屬性
用於指定JavaBean的名稱,這個名稱不是JavaBean例項物件的引用名稱,而是JavaBean規範中定義的一種名稱,它將作為傳遞給java.beans.Beans類的instantiate方法的引數。java.beans.Beans類的instantiate方法可以從這個資原始檔中產生JavaBean的例項物件。設定該屬性不能同時設定class屬性,但必須同時設定type屬性。
<jsp:useBean>標籤除了可以按照空元素的方式進行使用外,還可以按容器元素的格式進行使用,如:
<jsp:useBean...>
Body
</jsp:useBean...>
Body部分只在標籤建立JavaBean的例項物件時才執行,也就是說,如果scope屬性指定的域範圍存在id屬性指定的JavaBean物件,那Body內容將被忽略。
三、<jsp:setProperty>標籤
該標籤用於設定JavaBean物件的屬性,也就是呼叫JavaBean物件的setter方法,其語法如下:
<jsp:setPropertyname="beanInstanceName"property="propertyName"
[ value="{string | <%= expression %>}" | param="parameterName" ] |
property="*"
/>
-
name屬性是必不可少的,用於指定JavaBean例項物件的名稱,其值應與<jsp:useBean>標籤的id屬性相同。
-
property屬性是必不可少的,用於指定JavaBean例項物件的屬性名。
-
value屬性是可選的,它用於指定JavaBean例項物件的某個屬性的值,value屬性的設定值可以是一個字串,也可以是一個表示式。如果是value屬性的設定值是字串,那麼它將自動轉換成所要設定的JavaBean屬性的型別;如果是表示式,則表示式的結果型別與所要設定的JavaBean屬性的型別一致(不一致則報錯)。
-
param屬性是可選的,它用於將請求引數的值賦給JavaBean例項物件的某個屬性。如果當前請求訊息中沒有param屬性所指定的請求引數,該標籤不會將null賦給JavaBean屬性,所設定的JavaBean屬性仍將等於其原來的初始值,value和param屬性不能同時使用。
-
property="*",這種形式用於對JavaBean例項物件多個屬性進行賦值,它表示將請求訊息中的引數逐一與JavaBean例項物件中的屬性進行比較,如果找到同名的屬性,則將該引數賦給該屬性,不存在則不會被賦值。
注意:如果param屬性和value屬性都沒有設定,且property="prppertyName",它等效於param屬性的設定值與property屬性值相同的情況
四、<jsp:getProperty>標籤
該標籤用於讀取JavaBean物件的屬性,也就是呼叫JavaBean物件的getter方法,然後將讀取的屬性值轉換成字串後插入進輸出的響應正文中,其使用語法如下:
<jsp:getPropertyname="beanInstanceName"property="PropertyName" />
其中,name屬性用於指定JavaBean例項物件的名稱,其值應與<jsp:useBean>標籤的id屬性值相同,property屬性用於指定JavaBean例項物件的屬性名,如果一個JavaBean例項物件的某個屬性的值為null,則該標籤輸出該屬性的結果將是內容為null的字串。