JSF學習筆記-Managed Bean


在書上看到些東西,覺得可以保存在博客里,結果在網上一搜,已經有人這么做了,那我就省省打字這點事吧。

     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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM