现在的位置: 首页 > 综合 > 正文

JSF Managed Bean

2013年06月11日 ⁄ 综合 ⁄ 共 5661字 ⁄ 字号 评论关闭
 

Managed Beans

JSF 使用 Bean 来达到逻辑层与表现层分离的目的,Bean 的管理集中在组态档案中,您只要修改组态档案,就可以修改 Bean 之间的相依关系

Backing Beans

JSF使用 JavaBean
來達到程式邏輯與視圖分離的目的,在JSF中的Bean其角色是屬於Backing Bean,又稱之為Glue Bean,其作用是在真正的業務邏輯BeanUI元件之間搭起橋樑,在Backing Bean中會呼叫業務邏輯Bean處理使用者的請求,或者是將業務處理結果放置其中,等待UI元件取出當中的值並顯示結果給使用者。

  JSFBean的管理集中在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>

 ....

  這個例子我們在 第一個JSF程式看過,<managed-bean-class>設定所要使用的Bean類別,<managed-bean-name>設定之名稱,可供我們在JSF頁面上使用Expression Language來取得或設定Bean的屬性,例如:

<h:inputText value="#{user.name}"/>

  <managed-bean-scope>設定Bean的存活範圍,您可以設定為requestsession application,設定為request時,Bean的存活時間為請求階最,設定為session則在使用者應用程式交互開始,直到關閉瀏覽器或 顯式的結束會話為止(例如登出程式),設定為application的話,則Bean會一直存活,直到應用程式關閉為止。

  您還可以將存活範圍設定為none,當設定為none時會在需要的時候生成一個新的Bean,例如您在一個method中想要生成一個臨時的Bean,就可以將之設定為none

  在JSF頁面上要取得Bean的屬性,是使用 JSF表示語言 (Expression Language),要注意到的是,JSF表示語言是寫成 #{expression},而 JSP表示語言 是寫成 ${expression},因為表示層可能是使用JSP,所以必須特別區分,另外要注意的是,JSF的標籤上之屬性設定時,只接受JSF表示語言。

 

Beans 的组态与设定
资料来源: PmWiki@caterpillar
作者: caterpillar

  JSF预设会读取faces-config.xml中关于Bean的定义,如果想要自行设置定义档的名称,我们是在web.xml中提供javax.faces.CONFIG_FILES参数,例如:

<web-app>
   <context-param>
      <param-name>javax.faces.CONFIG_FILES</param-name>
      <param-value>/WEB-INF/beans.xml</param-value>
   </context-param>   
...
 </web-app>

  定义档可以有多个,中间以 "," 区隔,例如:

/WEB-INF/navigation.xml,/WEB-INF/beans.xml

  一个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>
 ....

  当然,您的属性不一定是字符串值,也许会是intfloatboolean等等型态,您可以设定<value> 值时指定这些值的字符串名称,JSF会尝试进行转换,例如设定为true时,会尝试使用Boolean.valueOf()方法转换为boolean true,以下是一些可能进行的转换:

型态

转换

shortintlongfloatdoublebyte,或相应的Wrapper类别

尝试使用WrappervalueOf()进行转换,如果没有设置,则设为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型态的对象,我们设定为前一个名称为userUserBean对象。

Beans 上的 List, Map

如果您的Bean上有接受ListMap型态的属性,则您也可以在组态档案中直接设定这些属性的值,一个例子如下:

....

 <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一样,设定一个ListMap对象,例如在JSF附的范例中,有这样的设定:

....

   <managed-bean>

    <description>

抱歉!评论已关闭.