首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个会话作用域托管bean访问会话作用域托管bean

从另一个会话作用域托管bean访问会话作用域托管bean
EN

Stack Overflow用户
提问于 2013-01-11 12:52:27
回答 1查看 1.2K关注 0票数 0

我在从另一个人打开一个sessionScoped托管bean时遇到了问题。我有一个包含对象列表的表。在行单击上,我将导航到另一个页面并显示其内容。我正在sessionMap对象或Flash中发送已单击的行。在另一个页面中发送和读取该对象,并显示数据。在另一个页面中,我正在接收sessionMapFlash中的@PostConstruct方法。

如果我返回并打开另一个对象,第一个对象将打开,问题是它是一个sessionScoped bean,所以在第二个打开时,它将不会调用@PostConstruct。那么,强制sessionScoped读取新值并打开另一个会话的解决方案是什么?或者如何通过侦听器而不是@PostConstruct读取对象?

page1.java

代码语言:javascript
复制
@ManagedBean
@SessionScoped
class pageBean{

    MyObject myObj;
    public String save(){FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(myObj,"obj");
    }
}

代码语言:javascript
复制
@ManagedBean
@SessionScoped
class pageBean{
@PostConstruct
public void init()
MyObject = (MyObject)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-11 13:35:36

托管bean应该是@ViewScoped。否则,您需要在(操作)侦听器方法(如<f:event> )中获得它。

代码语言:javascript
复制
<f:event type="preRenderView" listener="#{bean.init}" />

其中,您在init()方法中获得会话对象。

代码语言:javascript
复制
public void init() {
    obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}

如果您的唯一目的是在EL中访问它,也可能懒洋洋地加载在getter中:

代码语言:javascript
复制
public Obj getObj() {
    if (obj == null) {
        obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
    }

    return obj;
}

但是,这是没有意义的,因为会话作用域对象通过#{obj}直接在EL中可用,而不需要中介bean (如#{bean.obj} )。

至少,整个设计没有意义。这就是为什么我建议他们实际上应该是@ViewScoped

另请参阅:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14278598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档