0

sessionScoped我从另一个打开托管 bean 时遇到问题。我有一个页面,其中有一个包含对象列表的表格。在行单击时,我正在导航到另一个页面并显示其内容。我在sessionMapobject 或 by中发送点击的行Flash。对象在其他页面中被发送和读取并显示数据。在另一页中,我收到了sessionMaporFlash@PostConstruct方法中。

如果我回来打开另一个对象,第一个对象将打开,问题是它是一个sessionScopedbean,所以在第二个打开时它不会调用@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");
}
4

1 回答 1

2

您的托管 bean 应该是@ViewScoped. 否则,您需要在 (action)listener 方法中获取它,例如<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;
}

但这没有任何意义,因为会话范围的对象可以直接在 EL 中使用,#{obj}而不需要像#{bean.obj}.

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

也可以看看:

于 2013-01-11T13:35:36.657 回答