我目前正在修改一些jsf应用程序。我有两个豆子。
当我第一次在connectionBean中设置连接参数时,UIBean能够读取我的connectionBean信息并显示正确的UI树。
但是,当我尝试在同一会话中设置连接参数时。我的UIBean仍将使用先前的connectionBean信息。
只有在我使整个httpSession无效后才会使用。
无论如何我可以让一个会话bean更新另一个会话bean吗?
答案 0 :(得分:1)
听起来我觉得UIBean引用了一个过时的ConnectionBean版本会遇到一些问题。这是JSF的一个问题 - 如果重新创建bean,JSF将不会更新所有其他bean中的引用。
您每次都可以尝试获取ConnectionBean的“新”副本。以下方法将按名称检索辅助bean:
protected Object getBackingBean( String name )
{
FacesContext context = FacesContext.getCurrentInstance();
return context
.getApplication().createValueBinding( String.format( "#{%s}", name ) ).getValue( context );
}
在不知道代码细节以及如何使用bean的情况下,很难更具体!
答案 1 :(得分:1)
@Phill Sacre 现在不推荐使用getApplication()。createValueBinding。使用此函数代替JSF 1.2。获得豆子的新副本。
protected Object getBackingBean( String name )
{
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ValueExpression expression = app.getExpressionFactory().createValueExpression(context.getELContext(),
String.format("#{%s}", name), Object.class);
return expression.getValue(context.getELContext());
}
答案 2 :(得分:0)
在第一个会话bean中定义常量和静态方法:
public class FirstBean {
public static final String MANAGED_BEAN_NAME="firstBean";
/**
* @return current managed bean instance
*/
public static FirstBean getCurrentInstance()
{
FacesContext context = FacesContext.getCurrentInstance();
return (FirstBean) context.getApplication().evaluateExpressionGet(context, "#{" + FirstBean.MANAGED_BEAN_NAME + "}", TreeBean.class);
}
...
比在第二个会话bean中使用这样:
...
FirstBean firstBean = FirstBean.getCurrentInstance();
...
更好的方法是使用一些依赖注入框架,如JSF 2或Spring。