我从另一个打开sessionScoped
托管bean时遇到问题。
我有一个页面,其中包含一个包含对象列表的表格。
在行上单击我导航到另一个页面并显示其内容。
我在sessionMap
对象或Flash
发送点击的行。
在另一页中发送和读取对象,并显示数据。
在另一页中,我在sessionMap
方法中收到Flash
或@PostConstruct
。
如果我回来并打开另一个对象,第一个对象将打开,问题是它是一个sessionScoped
bean,所以在第二个打开时它不会调用@PostConstruct
。
那么迫使sessionScoped
读取新值并打开另一个会话的解决方案是什么?
或者我如何通过听众而不是@PostConstruct
读取对象?
page1.java
@ManagedBean
@SessionScoped
class pageBean{
MyObject myObj;
public String save(){FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(myObj,"obj");
}
}
@ManagedBean
@SessionScoped
class pageBean{
@PostConstruct
public void init()
MyObject = (MyObject)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
答案 0 :(得分:2)
您的托管bean应该是@ViewScoped
。否则,您需要在(动作)侦听器方法中获取它,例如<f:event>
:
<f:event type="preRenderView" listener="#{bean.init}" />
其中您使用init()
方法获取会话对象。
public void init() {
obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
如果您的唯一目的是在EL中访问它,或者可能懒惰地加载到getter中:
public Obj getObj() {
if (obj == null) {
obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
return obj;
}
但这没有任何意义,因为会话范围对象只能由#{obj}
直接在EL中使用,而不需要像#{bean.obj}
这样的中介bean。
至少,整个设计毫无意义。这就是为什么我建议他们实际上应该@ViewScoped
代替。