JSF SessionScoped managedBean与ViewScoped managedBean一起使用

时间:2012-01-10 16:43:28

标签: jsf null managed-bean session-scope

我的项目中存在以下问题:

我们有2个托管bean,其配置如下:

@ManagedBean
@SessionScoped
public class SessionBean {
    private PersonnelFile personnelFile; // + getters/setters
}

@ManagedBean
@ViewScoped
public class ViewBean {
    @ManagedProperty("#{sessionBean}")
    private SessionBean sessionBean;

    public void selectPersonnel() {
        sessionBean.getPersonnelFile().setPerson(new Person());
    }
}

这不是所有的代码,但它给你一个关于sitatution的一般概念:

  • 持有会话对象的SessionScoped bean
  • ViewScoped bean,它包含与视图相关的对象和对SessionScoped bean的引用

现在的问题是:

  • 我访问我的观点
  • 我对同一个视图做了一些回发,每次回到视图..到目前为止一直很好
  • 在某个时刻,我使用视图中的信息在SessionScoped bean中设置会话对象,我离开了我的视图......到目前为止一直很好
  • 现在,当我返回到这个视图时,他创建了一个新的ViewScoped bean实例(如预期的那样)并设置了SessionScoped bean(因为ManagedProperty注释)
  • 当我调试这个时,我可以看到对SessionScoped bean的引用保持不变,所以它是同一个对象
  • 但是,我先前在SessionScoped bean中设置的对象已变为null,这意味着他“丢失”了有关该对象的会话信息
  • 我从未在SessionScoped bean中重置此对象,因此我看不出它出错的地方......

如果您想要更多解释,或者您希望我更好地说出这个问题,请告诉我或使用编辑按钮!

1 个答案:

答案 0 :(得分:0)

@BalusC 我想我们可能已经发现了这个问题。在我们的web.xml中,我们使用以下设置:

 <context-param>
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
     <param-value>client</param-value>
 </context-param>

现在,如果我理解正确,我们就无法通过具有此设置的视图范围bean来编辑会话范围的bean的状态...我们能够改变会话状态的唯一方法-scoped bean,是bean本身的构造函数或PostConstruct方法。从视图范围的bean内部对会话范围的bean所做的更改未在服务器上保留。

如果我们将此变量设置为“server”,则状态确实持久存储在服务器上,并且不会每次都传输到客户端。我理解这会在内存方面给服务器带来更多负担,但我想知道如何使用client方法解决问题。

所以,我的问题已解决,但我不确定解决方案是否理想......