這一篇我們討論javabean。在上一篇Servlet&JSP的那些事兒(十二)中,我們編寫了一個簡單的留言板,不過在這個小項目中存在一些問題。比如,我們在jsp頁面中包含了大量的java代碼,對於這種小項目還好操作,但是對於大項目,如果頁面編輯人員一不小心,刪除了一些java代碼,就會出現錯誤。而java程式員又會面對大量的html代碼,也會對開發有影響。為了分離頁面中的html代碼和java代碼,javabean就應運而生。它將顯示邏輯和商務邏輯分離,使得前台和後台開發人員可以著重於自己的工作。jsp中,負責完成商務邏輯的java類,就叫做javabean。
JavaBean
其實它本質上就是一個java類,只不過遵循了一些編碼約定而已。在jsp頁面中,可以像使用普通類一樣執行個體化一個javabean類的對象。當然,也可以利用jsp中的動作元素來訪問javabean。一個標準的javabean有以下幾個特性:
1)它是一個public類
2)它有一個預設構造方法,也即不帶參數的構造方法。
3)它提供setXXX()和getXXX()方法來讓外部程式設定或擷取javabean的屬性。
4)它實現Serializable或Externalizable介面,以支援序列化。
javabean有四種屬性:簡單屬性(simple property)、索引屬性(indexed property)、綁定屬性(bound property)和約束屬性(constrained property)。簡單屬性就是接受單個值的屬性,索引屬性就是擷取和設定數組時使用的屬性,綁定屬性和約束屬性主要用於圖形化介面編程。
在Jsp中使用JavaBean
在jsp中可以像使用普通類一樣訪問javabean。jsp提供了3個動作元素<jsp:useBean>、<jsp:setProperty>和<jsp:getProperty>來訪問javabean。
<jsp:useBean>用於執行個體化javabean,或者定位一個已存在的javabean執行個體,並把執行個體的引用賦給一個變數。其文法如下:
<jsp:useBean id="name" scope="page|request|session|application" typeSpec/>
其中,typeSepc定義如下:
class="classname"|class="classname" type="typename"|type="typename" beanName="classname"
<jsp:useBean>各屬性的含義如下:
1)id用於標識javabean執行個體的名字,也是聲明指令碼變數的名字,並被初始化為javabean執行個體的引用。遵照java變數命名的規範。
2)scope指定一個範圍,在這個範圍以內,javabean執行個體的引用是可用的。預設為page
3)class用於指定javabean對象的完整的限定類名
4)beanName用於指定bean的名字。該名字被提供給java.beans.Beans類的instantiate()方法,來執行個體化一個javabean。
5)type指定定義的指令碼變數的類型,可以使bean類本身,或它的父類,或由javabean類實現的介面。
其執行過程為:jsp容器在<jsp:useBean>元素指定的範圍內尋找指定id的javabean對象,如果找到,且指定了type屬性,那jsp容器會試圖把該對象轉換為指定的type,如果失敗,則拋出一個ClassCastException異常。如果沒有找到指定的javabean對象,則拋出一個InstantiationException異常。如果沒找到該對象,但是元素中指定了class屬性,則利用該類建立一個新的對象,並將這個對象的引用賦給由屬性id指定的名字的變數,並將該對象儲存到屬性scope指定的範圍中。如果沒找到該對象,但元素中指定了beanName屬性,則調用Beans類的instantiate()方法。如果方法執行成功,將新建立的對象的引用賦給由屬性id指定的名字的變數,並將該對象儲存到屬性scope指定的範圍中。
<jsp:setProperty>和<jsp:useBean>一起使用,用來設定javabean的簡單屬性和索引屬性。其文法如下:
<jsp:setProperty name="beanname" prop_expr />
其中,prop_expr定義如下:
property="*"|property="propertyname"|property="propertyname" param="parametername"|property="propertyname" value="propertyvalue"
<jsp:setProperty>各屬性的含義如下:
1)name,javabean執行個體的名字,它必須是已在<jsp:useBean>元素中通過id屬性定義的名字。
2)property,被設定的屬性的名字。如果值為"*",標籤就會在請求對象中尋找所有的請求參數,看是否有參數的名字和bean屬性的名字相同,如果找到,則匹配。
3)param,指定請求對象中參數的名字。如果請求參數的名字和bean屬性名稱字不同,可以用param來指定參數的名字。
4)value,指定要賦給javabean屬性的值。不能和param同時出現。
<jsp:getProperty>
它用來訪問一個javabean屬性,並把屬性的值轉化成一個String,然後發送到輸出資料流中。如果屬性是一個對象,將調用該對象的toString()方法。其文法如下:
<jsp:getProperty name="beanname" property="propertyname" />
各屬性的含義如下:
1)name,javabean執行個體的名字,從這個執行個體中可以得到屬性。
2)property,要得到的屬性的名字。
兩種模型
使用jsp開發web應用程式時,有兩種架構模型可以選擇,成為模型1和模型2。下面分別介紹這兩種模型。
模型1
這種模型使用jsp+javabean來將頁面顯示和商務邏輯處理分開,jsp實現頁面的顯示,javabean實現商務邏輯。在這種模型中,jsp頁面獨自響應請求並將處理結果返回給使用者,所有的資料通過javabean來處理,jsp實現頁面的顯示。
這種模型雖然實現了頁面顯示和商務邏輯的分離,但是在jsp頁面中仍然要編寫流程式控制制和調用javabean代碼,當需要處理的商務邏輯非常複雜時,會使得程式非常複雜。這種模型不能滿足大型應用的需要,但對於小型應用,因為這種模型簡單,所以可以很好的滿足需求。
模型2
模型1中,會在jsp頁面中嵌入流程式控制制代碼和部分邏輯處理代碼,如果將這部分代碼提取出來,變成一個單獨的角色(控制器),這樣的web結構就成為模型2。模型2符合MVC夾頭模式。MVC模型我們在Servlet&JSP的那些事兒(二)也有所提及。在模型2中,控制器的角色由servlet實現,視圖的角色由jsp頁面來實現,模型的角色由javabean來實現。servlet接受請求,負責執行個體化javabean對象對商務邏輯進行處理,並未jsp頁面準備承載了資料的javabean對象,然後將請求分發給適當的jsp頁面來產生響應。作為模型的javabean主要有兩類,一類用於封裝商務邏輯,一類用於承載資料。
轉載請註明出處:http://blog.csdn.net/iAm333