在書上看到些東西,覺得可以保存在博客里,結果在網上一搜,已經有人這么做了,那我就省省打字這點事吧。
JSF使用 JavaBean 來達到程序邏輯與視圖分離的目的,在JSF中的Bean其角色是屬於Backing Bean,又稱之為Glue Bean,其作用是在真正的業務邏輯Bean及UI組件之間搭起橋梁,在Backing Bean中會呼叫業務邏輯Bean處理使用者的請求,或者是將業務處理結果放置其中,等待UI組件取出當中的值並顯示結果給使用者。
JSF將Bean的管理集中在faces-config.xml中,一個例子如下:
<managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class>onlyfun.caterpillar.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
<managed-bean-class>設定所要使用的Bean類,<managed-bean-name>設定之名稱,可供我們在JSF頁面上使用Expression Language來取得或設定Bean 的屬性,例如:
<h:inputText value="#{user.name}"/>
<managed-bean-scope>設定Bean的存活范圍,您可以設定為request、session 與application,設定為request時,Bean的存活時間為請求階段,設定為session則在使用者應用程序交互開始,直到關閉瀏覽器或顯式的結束會話為止(例如登出程序),設定為application的話,則Bean會一直存活,直到應用程序關閉為止(session和application的區別不是太懂)。
您還可以將存活范圍設定為none,當設定為none時會在需要的時候生成一個新的Bean,例如您在一個method中想要生成一個臨時的Bean,就可以將之設定為none。
在JSF頁面上要取得Bean的屬性,是使用 JSF表示語言 (Expression Language),要注意到的是,JSF表示語言是寫成 #{expression},而 JSP表示語言 是寫成 ${expression},因為表示層可能是使用JSP,所以必須特別區分,另外要注意的是,JSF的標簽上的屬性設定時,只接受JSF表示語言。
一個Bean最基本要定義Bean的名稱、類與存活范圍,例如:
<managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class>onlyfun.caterpillar.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
如果要在其它類中取得Bean對象,則可以先取得javax.faces.context.FacesContext,它代表了JSF目前的執行環境對象,接着嘗試取得javax.faces.el.ValueBinding對象,從中取得指定的Bean對象,例如:
FacesContext context = FacesContext.getCurrentInstance();
ValueBinding binding =context.getApplication().createValueBinding("#{user}");
UserBean user = (UserBean) binding.getValue(context);
如果只是要嘗試取得Bean的某個屬性,則可以如下:
FacesContext context = FacesContext.getCurrentInstance();
ValueBinding binding =context.getApplication().createValueBinding("#{user.name}");
String name = (String) binding.getValue(context);
如果有必要在啟始Bean時,自動設置屬性的初始值,則可以如下設定:
<managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class>onlyfun.caterpillar.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>name</property-name> <value>caterpillar</value> </managed-property> <managed-property> <property-name>password</property-name> <value>123456</value> </managed-property> </managed-bean>
如果要設定屬性為 null 值,則可以使用<null-value/>標簽,例如:
<managed-property> <property-name>name</property-name> <null-value/> </managed-property> <managed-property> <property-name>password</property-name> <null-value/> </managed-property>
當然,您的屬性不一定是字符串值,也許會是int、float、boolean等等類型,您可以設定<value> 值時指定這些值的字符串名稱,JSF會嘗試進行轉換,例如設定為true時,會嘗試使用Boolean.valueOf()方法轉換為boolean的 true,以下是一些可能進行的轉換:
類型 轉換
short、int、long、float、double、byte,或相應的Wrapper類 嘗試使用Wrapper的valueOf()進行轉換,如果沒有設置,則設為0
boolean 或 Boolean 嘗試使用Boolean.valueOf()進行轉換,如果沒有設置,則設為false
char 或 Character 取設置的第一個字符,如果沒有設置,則設為0
String 或 Object 即設定的字符串值,如果沒有設定,則為空字符串new String("")
您也可以將其它產生的Bean設定給另一個Bean的屬性,例如:
<managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class>onlyfun.caterpillar.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <managed-bean> <managed-bean-name>other</managed-bean-name> <managed-bean-class>onlyfun.caterpillar.OtherBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>user</property-name> <value>#{user}</value> </managed-property> </managed-bean>
在上面的設定中,在OtherBean中的user屬性,接受一個UserBean類型的對象,我們設定為前一個名稱為user的UserBean對象。
Beans上的List, Map
如果您的Bean上有接受List或Map類型的屬性,則您也可以在配置文件中直接設定這些屬性的值,一個例子如下:
<managed-bean> <managed-bean-name>someBean</managed-bean-name> <managed-bean-class>onlyfun.caterpillar.SomeBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>someProperty</property-name> <list-entries> <value-class>java.lang.Integer</value-class> <value>1</value> <value>2</value> <value>3</value> </list-entries> </managed-property> </managed-bean>
這是一個設定接受List類型的屬性,我們使用<list-entries>標簽指定將設定一個List對象,其中<value-class>指定將存入List的類型,而<value>指定其值,如果是基本類型,則會嘗試使用指定的 <value-class>來作Wrapper類。
設定Map的話,則是使用<map-entries>標簽,例如:
<managed-bean> <managed-bean-name>someBean</managed-bean-name> <managed-bean-class>onlyfun.caterpillar.SomeBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>someProperty</property-name> <map-entries> <value-class>java.lang.Integer</value-class> <map-entry> <key>someKey1</key> <value>100</value> </map-entry> <map-entry> <key>someKey2</key> <value>200</value> </map-entry> </map-entries> </managed-property> </managed-bean>
由於Map對象是以key-value對的方式來存入,所以我們在每一個<map-entry>中使用<key>與<value>標簽來分別指定。
您也可以直接像設定Bean一樣,設定一個List或Map對象,例如在JSF附的范例中,有這樣的設定:
<managed-bean> <description>Special expense item types</description> <managed-bean-name>specialTypes</managed-bean-name> <managed-bean-class>java.util.TreeMap</managed-bean-class> <managed-bean-scope>application</managed-bean-scope> <map-entries> <value-class>java.lang.Integer</value-class> <map-entry> <key>Presentation Material</key> <value>100</value> </map-entry> <map-entry> <key>Software</key> <value>101</value> </map-entry> <map-entry> <key>Balloons</key> <value>102</value> </map-entry> </map-entries> </managed-bean>
而范例中另一個設定List的例子如下:
<managed-bean> <managed-bean-name>statusStrings</managed-bean-name> <managed-bean-class>java.util.ArrayList</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <list-entries> <null-value/> <value>Open</value> <value>Submitted</value> <value>Accepted</value> <value>Rejected</value> </list-entries> </managed-bean>
參考:http://hi.baidu.com/bjwdm007/blog/item/a139ed2d08f532341e308936.html