【问题标题】:FacesContext.getCurrentInstance().getExternalContext().invalidateSession() calls posconstruct twiceFacesContext.getCurrentInstance().getExternalContext().invalidateSession() 两次调用 posconstruct
【发布时间】:2013-03-06 13:08:10
【问题描述】:

我已按名称 studentManagedBean 管理 bean。在那个 bean 中,我使用了 post 构造来初始化 studentsList。在我使用的另一个托管 bean testbean FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 并重定向到我用来显示学生的页面students.xhtml。

我的问题是当我使用 FacesContext.getCurrentInstance().getExternalContext().invalidateSession();并重定向到 student.xml 页面,init 方法(post 构造)用于调用两次。当我评论上述行时,init 方法(post 构造)现在只调用一次。

谁能告诉我这个无效会话到底会做什么。

  @ManagedBean(name = "studentManagedBean" )
    @SessionScoped
    public class StudentManagedBean implements Serializable {


        private List<SBean> stud;



        @PostConstruct
        private void init(){
            this.stud=dao.getAllStudInfo();
        }





 @ManagedBean(name = "testBean" )
    @SessionScoped
    public class TestBean implements Serializable {

public String navigate(String name){
        if(name.equals("Add student")){
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
             return  "student";

        }

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    显然,当前视图中还引用了会话范围 bean StudentManagedBean。当视图被构建/恢复时,如果在视图构建期间引用它,它可能会创建 bean。但是,如果您此后使会话无效,则会话范围的 bean 将被销毁(显然,因为它存储在会话范围中),并且当目标视图在视图呈现期间仍然引用它时将再次重新创建。

    这必须完全有道理。如果您不希望在使会话无效之前创建 bean,只需不要在当前视图中的任何位置引用它,直接在视图中,或间接作为托管属性或另一个 bean 的编程 EL 评估在当前视图中直接引用。

    如果您无法立即找出它被引用的位置,只需在 bean 的构造函数中放置一个调试断点,然后探索调用堆栈中的 who/what/why。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2010-12-02
      • 2022-12-09
      • 2013-08-18
      • 2012-01-08
      • 2016-10-17
      • 2013-12-19
      • 1970-01-01
      相关资源
      最近更新 更多