JSF在一个管理Bean中引用另一个管理Bean
如果一个管理Bean中的属性和方法跟另一个管理Bean一样,为了代码的重用而不是再次重写相同的代码,我们会想在这个Bean中直接引用那个管理Bean。
看示例:
----1---JavaCode-----
public class PRequestHisIpBean{
// 引用另外的管理Bean
private NetManageBean netmanage ;
public PRequestHisIpBean(){
// 执行引用Bean的方法
if(netmanage!=null)netmanage.manageNet();
}
public NetManageBean getNetmanage() {
if(netmanage==null)netmanage=new NetManageBean();
return netmanage;
}
public void setNetmanage(NetManageBean netmanage) {
this.netmanage = netmanage;
}
}
----2---faces-config.xml---------
<managed-bean>
<managed-bean-name>netmanage</managed-bean-name>
<managed-bean-class>
com.system.NetManageBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>RequestIp</managed-bean-name>
<managed-bean-class>
com.report.PRequestHisIpBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>netmanage</property-name>
<value>#{netmanage}</value>
</managed-property>
</managed-bean>
注意:现在的netmanage 还是空的,如果直接执行引用Bean的方法
if(netmanage!=null)netmanage.manageNet();
netmanage 是 null ;
不过可以在初始化NetManageBean 时执行你
想要的方法。只有在当前构造函数执行以后才执行setNetmanage方法,给netmanage赋值。
执行顺序是:
先到构造函数中,但不执行里面的方法,先初始化普通属性,即给属性赋值,然后才
执行构造函数中的方法。
当构造函数执行完成对象生成之后,才初始化本管理Bean中引用的其它管理Bean类的对象,如开始初始化NetManageBean ,给netmanage 赋值。
要想在本类初始化的时候就得到引用的管理Bean的实例,可以改变执行顺序,将本类的构造函数中的方法移到setNetmanage方法中,并在this.netmanage = netmanage;之后执行。
修改 1 的代码为:
----3---JavaCode-----
public class PRequestHisIpBean{
// 引用另外的管理Bean
private NetManageBean netmanage ;
public PRequestHisIpBean(){
}
public NetManageBean getNetmanage() {
if(netmanage==null)netmanage=new NetManageBean();
return netmanage;
}
public void setNetmanage(NetManageBean netmanage) {
this.netmanage = netmanage;
// 执行引用Bean的方法
if(netmanage!=null)netmanage.manageNet();
}
}
这样if(netmanage!=null)netmanage.manageNet();就不会为空了;