5

我正在运行一个JSF应用程序并声明了一些应用程序范围的支持 bean(在common-beans.xml中或使用 @ManagedBean and @ApplicationScoped 注释)。

如何从内部访问这些 bean javax.servlet.http.HttpSessionListener

我知道 FacesContext 会话侦听器中不可用,因此使用:

public class AnHTTPSessionListener implements HttpSessionListener {
    ...
    public void sessionDestroyed(HttpSessionEvent e) {
        AppBean appBean = (AppBean) FacesContext.getCurrentInstance()
                                                .getExternalContext()
                                                .getApplicationMap().get("appBean")
       ...
    }

...按预期抛出了NPE。

更新:

(在 BalusC 回答之前)

我最终做的是使用env-entry元素(而不是使用应用程序范围的 bean)在web.xml中声明我需要访问的应用程序范围的信息,然后使用以下方法检索该信息:

   InitialContext ic = new InitialContext();
   Context env = (Context) ic.lookup("java:comp/env");
   appName = (String) env.lookup("appBeanValue");

这不是我的想法,但这是一种解决方法。

4

1 回答 1

9

JSF 将应用程序范围的托管 bean 存储为ServletContext.

所以,这应该这样做:

public void sessionDestroyed(HttpSessionEvent e) {
    AppBean appBean = (AppBean) e.getSession().getServletContext().getAttribute("appBean");
    // ...
}

也可以看看:

于 2012-11-29T11:36:07.347 回答