日期:2014-05-16  浏览次数:20297 次

JSF入门八(Managed Beans)

本文参考

http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630

?

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

?

一、Backing Beans

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-scope>设定Bean的存活范围,您可以设定为request、session 与application,您还可以将存活范围设定为none,当设定为none时会在需要的时候生成一个新的Bean,例如您在一个method中想要生成一个临时的Bean,就可以将之设定为none。

?

二、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

您也可以将其它产生的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类型的对