<jsp:useBean>動作標記用于在 JSP 頁面中創建 bean 實例,并且通過設置相關屬性,可以將該實例存儲到指定的范圍。如果在指定的范圍已經存在該 bean 實例,那么將使用這個實例,而不會重新創建。
實際工程中,常用 JavaBean 做組件開發,而在 JSP 頁面中,只需要聲明并使用這個組件,較大程度地實現了靜態內容和動態內容的分離。
聲明 JavaBean 的語法格式如下:
<jsp:useBean id="變量名" scope="page|request|session|application"
{
type="數據類型"
|class="package.className"
|class="package.className" type="數據類型"
|beanName="package.className" type="數據類型"
}
/>
<jsp:setProperty name="變量名" property="*" />
也可以在標記體內嵌入子標記,例如:
<jsp:useBean id="變量名" scope="page|request|session|application"...>
<jsp:setProperty name="變量名" property="*" />
</jsp:useBean>
以上兩種使用方法是有嚴格區別的,當在頁面中使用<jsp:useBean>標記創建一個 bean 時,對于第二種使用格式,如果該 bean 是第一次被實例化,那么標記體內的內容會被執行;如果已經存在指定的 bean 實例,則標記體內的內容就不再被執行。
對于第一種使用格式,無論在指定的范圍內是否己經存在指定的 bean 實例, <jsp:useBean>標記后面的內容都會被執行。
下面對<jsp:useBean>動作中各屬性的用法進行詳細介紹。
1、id 屬性:在 JSP 中給這個 bean 實例取的名字,即指定一個變量,只要在它的有效范圍內,均可使用這個名稱來調用它。該變量必須符合 Java 中變量的命名規則。
2、scope 屬性:設置所創建的 bean 實例的有效范圍,取值有 4 種:page、request、session、application。默認情況下取值為 page。
• 值為 page:在當前 JSP 頁面及當前頁面以 include 指令靜態包含的頁面中有效。
• 值為 request:在當前的客戶請求范圍內有效。在請求被轉發至的目標頁面中,如果要使用原貢面中創建的 bean 實例,通過 request 對象的 getAttribute("id屬性值") 方法來獲取。請求的生命周期是從客戶端向服務器發出請求開始,到服務器響應這個請求給用戶后結束。所以請求結束后,存儲在其中的 bean 實例也就失效了。
• 值為 session:對當前 HttpSession 內的所有頁面都有效。當用戶訪問 Web 應用程序時,服務器為用戶創建一個 session 對象,并通過 session 的 ID 值來區分不同的用戶。針對某一個用戶而言,對象可被多個頁面共享。通過 session 對象的 getAttribute(“id屬性值”) 方法獲取存儲在 session 中的 bean 實例。
• 值為application:所有用戶共享這個bean實例。有效范圍從服務器啟動開始,到服 務器關閉結束。application對象是在服務器啟動時創建的,可以被多個用戶共享。所以,訪 問application對象的所有用戶共享存儲于該對象中的bean實例。使用application對象的 getAttribute(“id屬性值”)方法獲取存在于application對象中的bean實例。
Scope屬性之所以很重要,是因為只有在不存在具有相同id和scope的對象時, <8卩:!^86&11>才會實例化新的對象;如果已有id和scope都相同的對象,則直接使用已有的 對象,此時,jspruseBean開始標記和結束標記之間的任何內容都將被忽略。
3、 type="數據類型":設置由 id 屬性指定的 bean 實例的類型。該屬性可指定要創建實例的類的本身、類的父類或者一個接口。
通過 type 屬性設置 bean 實例類型的格式如下:
<jsp:useBean id="stu" type="com.Bean.StudentInfo" scope="session" />
如果在 session 范圍內,名為 stu 的實例已經存在,則將該實例轉換為 type 屬性指定的 StudentInfo 類型(此時的類型轉換必須是合法的)并賦值給 id 屬性指定的變量;若指定的實例不存在,將會拋出“bean stu not found within scope”異常。
4、class="package.className":該屬性指定了一個完整的類名,其中,package 表示類包的名字,className 表示類的 class 文件名稱。
通過 class 屬性指定的類不能是抽象的,它必須具有公共的、沒有參數的構造方法。在沒有設置 type 屬性時,必須設置 class 屬性。例如,通過 class 屬性定位一個類的格式如下:
<jsp:useBean id="stu" class="com.Bean.StudentInfo" scope="session" />
程序首先會在 session 范圍中查找是否存在名為 stu 的 StudentInfo 類的實例,如果存在,就會通過 new 操作符實例化 StudentInfo 類來獲取一個實例,并以 stu 為實例名稱存儲在 session 范圍內。
5、class="package.className" type="數據類型":class 屬性與 type 屬性可以指定同一個類,這兩個屬性一起使用時的格式舉例說明如下:
<jsp:useBean id="stu" class="com.Bean.StudentInfo" type="com.Bean.StudentBase" scope="session" />
6、beanName="package.className" type="數據類型":beanName 屬性與 type 屬性可以指定同一個類,這兩個屬性一起使用時的格式舉例說明如下:
<jsp:useBean id="stu" beanName="com.Bean.StudentInfo" type="com.Bean.StudentBase" />
假設 StudentBase 類為 StudentInfo 類的父類。執行到該標記時,首先,程序會創建一個以 id 屬性值為名稱的變量 stu,類型為 type 屬性的值,并初始化為 null;然后在 session 范圍內查找名為 stu 的 bean 實例。
如果實例存在,則將其轉換為 type 屬性指定的 StudentBase 類型(此時的類型轉換必須是合法的)并賦值給變量 stu;如果實例不存在,則將通過 instantiate() 方法,從 StudentInfo 類中實例化一個類,并將其轉換成 StudentBase 類型后賦值給變量 stu,最后將變量 stu 存儲在 session 范圍內。
一般情況下,使用如下格式來應用 標記:
<jsp:useBean id="變量名" class="package.className" />
如果多個頁面中共享這個 bean 實例,可將 scope 屬性設置為 session。
使用<jsp:useBean>標記在頁面中實例化 bean 實例后,設置或修改該 bean 中的屬性就可以用<jsp:setProperty>完成,讀取該 bean 中指定的屬性要用<jsp:getProperty>來完成,這兩個標記在下面小節中將陸續介紹。
當然,讀取和設置 bean 中的屬性還有另一種方式,就是在腳本程序中利用 id 屬性所命名的對象變量,通過調用該對象的方法顯式地讀取或者修改其屬性。