在托管Bean中访问另一个托管Bean
如果有很多托管Bean,想要从其中一个托管Bean访问其他的托管Bean,这里有六中方法。
可以使用:
1)getVariableResolver
2)createValueBinding
3)getELResolver (since JSF 1.2)
4)createValueExpression (since JSF 1.2)
5)getRequestMap
6)getSessionMap.
举例:假设有两个托管Bean
< managed - bean >
< managed - bean - name > myBean1 </ managed - bean - name >
< managed - bean - class > mypackage.MyBean1 </ managed - bean - class >
< managed - bean - scope > request </ managed - bean - scope >
</ managed - bean >
< managed - bean >
< managed - bean - name > myBean2 </ managed - bean - name >
< managed - bean - class > mypackage.MyBean2 </ managed - bean - class >
< managed - bean - scope > session </ managed - bean - scope >
</ managed - bean >
托管Bean myBean1和myBean2是支撑Bean MyBean1.java和MyBean2.java的实例,它们可以通过JSF页面来访问。不管它们的managed-bean-scope是request还是session。
只是要注意的是,getRequestMap在托管Bean被设置成request的时候使用,getSessionMap在托管Bean被设置成session的时候使用。
< h:form >
< h:commandButton action = " #{myBean1.action1} " value = " action1 " />
< h:commandButton action = " #{myBean1.action2} " value = " action2 " />
< h:commandButton action = " #{myBean1.action3} " value = " action3 " />
< h:commandButton action = " #{myBean1.action4} " value = " action4 " />
< h:commandButton action = " #{myBean1.action5} " value = " action5 " />
< h:commandButton action = " #{myBean1.action6} " value = " action6 " />
< h:outputText binding = " #{myBean2.text} " />
</ h:form >
MyBean1.java:
package mypackage;
import javax.faces.context.FacesContext;
public class MyBean1
{
// Using VariableResolver. NOTE: this is deprecated since JSF 1.2!
public void action1()
{
FacesContext context = FacesContext.getCurrentInstance();
MyBean2 myBean2 = (MyBean2) context.getApplication().getVariableResolver().resolveVariable(context, " myBean2 " );
myBean2.getText().setValue( " action1 " );
}
// Using ValueBinding. NOTE: this is deprecated since JSF 1.2!
public void action2()
{
FacesContext context = FacesContext.getCurrentInstance();
MyBean2 myBean2 = (MyBean2) context.getApplication().createValueBinding( " #{myBean2} " ).getValue(context);
myBean2.getText().setValue( " action2 " );
}
// Using ELResolver. NOTE: this is implemented since JSF 1.2!
public void action3()
{
FacesContext context = FacesContext.getCurrentInstance();
MyBean2 myBean2 = (MyBean2) context.getELContext().getELResolver().getValue(context.getELContext(), null , " myBean2 " );
myBean2.getText().setValue( " action3 " );
}
// Using ValueExpression. NOTE: this is implemented since JSF 1.2!
public void action4()
{
FacesContext context = FacesContext.getCurrentInstance();
MyBean2 myBean2 = (MyBean2) context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(), " #{myBean2} " , MyBean2. class ).getValue(context.getELContext());
myBean2.getText().setValue( " action4 " );
}
// Using RequestMap. NOTE: myBean2 should be request scoped!
public void action5()
{
Object object = FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get( " myBean2 " );
// This only works if myBean2 is request scoped.
if (object != null )
{
MyBean2 myBean2 = (MyBean2) object;
myBean2.getText().setValue( " action5 " );
}
}
// Using SessionMap. NOTE: myBean2 should be session scoped!
public void action6()
{
Object object = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get( " myBean2 " );
// This only works if myBean2 is session scoped.
if (object != null )
{
MyBean2 myBean2 = (MyBean2) object;
myBean2.getText().setValue( " action6 " );
}
}
}
MyBean2.java:
package mypackage;
import javax.faces.component.html.HtmlOutputText;
public class MyBean2
{
private HtmlOutputText text;
public HtmlOutputText getText()
{
return text;
}
public void setText(HtmlOutputText text)
{
this .text = text;
}
}