Events 从另一个会话范围的托管bean访问会话范围的托管bean
我在打开另一个Events 从另一个会话范围的托管bean访问会话范围的托管bean,events,jsf-2,Events,Jsf 2,我在打开另一个sessionScoped托管bean时遇到问题。 我有一个页面,其中有一个包含对象列表的表。 在行单击时,我导航到另一个页面并显示其内容。 我正在sessionMap对象中或通过Flash发送单击的行。 在另一页中发送和读取对象,并显示数据。 在另一个页面中,我收到了@PostConstruct方法中的sessionMap或Flash public void init() { obj = (Obj) FacesContext.getCurrentInstance().ge
sessionScoped
托管bean时遇到问题。
我有一个页面,其中有一个包含对象列表的表。
在行单击时,我导航到另一个页面并显示其内容。
我正在sessionMap
对象中或通过Flash
发送单击的行。
在另一页中发送和读取对象,并显示数据。
在另一个页面中,我收到了@PostConstruct
方法中的sessionMap
或Flash
public void init() {
obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
如果我返回并打开另一个对象,第一个对象将打开,问题是它是一个sessionScoped
bean,因此在第二个打开时,它将不会调用@PostConstruct
。
那么,强制sessionScoped
读取新值并打开另一个会话的解决方案是什么?
或者如何通过侦听器而不是@PostConstruct
读取对象
page1.java
@ManagedBean
@SessionScoped
class pageBean{
MyObject myObj;
public String save(){FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(myObj,"obj");
}
}
您的托管bean应该已
@viewscope
。否则,您需要在(操作)侦听器方法中获取它,例如
:
或者,如果您的唯一目的是在EL中访问它,则可能会在getter中延迟加载:
public Obj getObj() {
if (obj == null) {
obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
return obj;
}
但是这没有任何意义,因为会话范围的对象只是通过{obj}
直接在EL中可用,而不需要像{bean.obj}
这样的中间bean
至少,整个设计毫无意义。这就是为什么我建议它们实际上应该是@viewscope
另见:
或在getter中,如果需要的话,通过延迟加载。但是在getter中这样做没有任何意义,因为会话属性在EL中已经直接可用,它们的名称类似于{obj}
。我将尝试在getter中读取对象,但是我可以知道如何使用以及它的用途吗
public void init() {
obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
public Obj getObj() {
if (obj == null) {
obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
return obj;
}