1

我需要将一些数据存储到用户会话中。通常我会用它getSessionMap().put()来解决这个问题。我的问题是,我需要在sessionCreated()sessionListener 的 -void 中执行此操作,但此时 FacesContext 仍然为空。所以下面的代码会生成一个 NullPointerException。

    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("data", "something");
    }

是否有另一种方法可以将数据存储到会话中,或者我可以手动初始化 FacesContext 的实例?不幸的是,我对 jsf 生命周期了解不多。

谢谢你的帮助!

4

1 回答 1

1

您似乎完全错过了这样一个事实,即 JSF 只是“普通”Servlet API 之上的一个大抽象层,并且ExternalContext(请花时间仔细阅读其javadoc,包括方法描述)仅代表“普通”中可用的类/方法" 小服务程序 API。

在您的特定情况下,当您在 Servlet API(而不是 Portlet API)之上使用 JSF 时,ExternalContext#getSessionMap()它只是HttpSession#setAttribute()/的一个外观#getAttribute()。你猜怎么着,HttpSession是在你HttpSessionListener随手可得的HttpSessionEvent论据!

@Override
public void sessionCreated(HttpSessionEvent event) {
    event.getSession().setAttribute("data", "something");
}

然后可以通过getSessionMap().get("data")@ManagedProperty("#{data}")在任何 JSF 支持 bean 中使用,或者仅通过#{data}在 JSF 页面中的 EL 中使用。

于 2013-08-22T13:20:51.683 回答