0

我目前正在修改一些 jsf 应用程序。我有两个豆子。

  • 连接豆
  • UIBean

当我第一次在 connectionBean 中设置连接参数时,UIBean 能够读取我的 connectionBean 信息并显示正确的 UI 树。

但是,当我尝试在同一会话中设置连接参数时。我的 UIBean 仍然会使用之前的 connectionBean 信息。

它只会在我使整个 httpSession 无效后使用。

无论如何我可以让一个会话 bean 更新另一个会话 bean?

4

3 回答 3

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 的情况下,很难更具体!

于 2008-11-13T09:03:10.060 回答
1

@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());
}
于 2009-06-01T09:16:46.310 回答
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。

于 2012-02-15T14:29:12.590 回答