从另一个会话范围的托管bean访问会话范围的托管bean

时间:2013-01-11 12:52:27

标签: events jsf-2

我从另一个打开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");
}

1 个答案:

答案 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代替。

另见: