FacesContext.getCurrentInstance()。getExternalContext()。invalidateSession()调用posconstruct两次

时间:2013-03-18 08:50:28

标签: jsf-2 primefaces

我有一个名为studentManagedBean的托管bean。在那个bean中,我使用post构造来初始化studentsList。在我使用的另一个托管bean testbean中 。FacesContext.getCurrentInstance()getExternalContext()invalidateSession(); 并重定向到页面students.xhtml我曾经在那里展示学生。

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

任何人都可以告诉我这个无效会话究竟会做什么。

  @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";

        }

1 个答案:

答案 0 :(得分:0)

显然,会话范围bean StudentManagedBean也在当前视图中引用。当构建/恢复视图时,如果在视图构建期间引用它,它可以创建bean。但是如果你之后的会话无效,那么会话范围的bean会被破坏(显然,因为它存储在会话范围内),并且当目标视图在渲染视图期间仍然引用它时将会再次重新创建。

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

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