0

我已按名称 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";

        }
4

1 回答 1

0

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

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

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

于 2013-03-18T17:46:28.430 回答