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

JSF在一个管理Bean中引用另一个管理Bean

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();就不会为空了;