我有一个名为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";
}
答案 0 :(得分:0)
显然,会话范围bean StudentManagedBean
也在当前视图中引用。当构建/恢复视图时,如果在视图构建期间引用它,它可以创建bean。但是如果你之后的会话无效,那么会话范围的bean会被破坏(显然,因为它存储在会话范围内),并且当目标视图在渲染视图期间仍然引用它时将会再次重新创建。
这必须完全有道理。如果您不希望在使会话无效之前创建bean,则只需在当前视图中的任何位置引用它,可以直接在视图中引用,也可以间接引用为托管属性或另一个bean的编程EL评估。在当前视图中直接引用。
如果你无法立即弄清楚它被引用的位置,只需在bean的构造函数中放入一个调试断点,然后探究who / what / why的调用堆栈。