我目前正在修改一些 jsf 应用程序。我有两个豆子。
- 连接豆
- UIBean
当我第一次在 connectionBean 中设置连接参数时,UIBean 能够读取我的 connectionBean 信息并显示正确的 UI 树。
但是,当我尝试在同一会话中设置连接参数时。我的 UIBean 仍然会使用之前的 connectionBean 信息。
它只会在我使整个 httpSession 无效后使用。
无论如何我可以让一个会话 bean 更新另一个会话 bean?
在我看来,这是 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 的情况下,很难更具体!
@Phill Sacre getApplication().createValueBinding 现在已弃用。将此函数用于 JSF 1.2。获取 bean 的新副本。
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());
}
在第一个会话 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。