JSf Managed Beans (2)

 1JSF Gossip: Backing Beans

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



这个例子我们在 第一个JSF程式 看过,<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会一直存活,直到应用程式关闭为止。

您还可以将存活范围设定为none,当设定为none时会在需要的时候生成一个新的Bean,例如您在一个method中想要生成一个临时的Bean,就可以将之设定为none。

在JSF页面上要取得Bean的属性,是使用 JSF表示语言(Expression Language),要注意到的是,JSF表示语言是写成 #{expression},而 JSP 表示语言 是写成 ${expression},因为表示层可能是使用JSP,所以必须特别区分,另外要注意的是,JSF的标签上之属性设定时,只接受JSF表示语言。
2.JSF Gossip: Beans 的组态与设定

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


当然,您的属性不一定是字串值,也许会是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物件。
3.JSF Gossip: 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>
 ....
 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值