大可制作:QQ群:31564239(asp|jsp|php|mysql)

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对象。