静态Servlet Context变量

时间:2012-03-26 20:38:07

标签: java jsf web-applications jsf-1.2 servlet-listeners

我已经从问题How to gain access to a ServletContext instance from any method?中读到,如果我想从我的Java Web项目中的任何类访问Servlet Context,我可以声明一个指向ServletContext ServletContextListener的静态字段但是静态字段在Java Web应用程序中是一种不好的做法,因为GC在JVM关闭之前无法收集它(如果我在这一点上错了,请纠正我)。是否有另一种方法来访问ServletContext而不使用侦听器或接收它作为参数?还有另一种解决方法可以解决这个问题吗?我正在使用JSF 1.2和JBoss 5.1 GA进行Web应用程序。

注意:我知道我可以使用

(ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();

访问ServletContext,但有一个方法在启动时运行,需要访问ServletContext并且FacesContext.getCurrentInstance()尚未初始化。

更新:

当Web应用程序启动时,我们需要从web.xml加载一些IP到String常量。为此,我们创建了一个Singleton类,它在变量中加载context-params,然后用一些Singleton类的值填充String常量。这个Singleton类管理大量数据并且发出内存异常错误。为了解决这个问题,我们将Singleton类修改为一个作为ServerContext属性加载的简单类,但是由于没有这个(不再是)Singleton的实例,所以无法加载String常量。 / p>

1 个答案:

答案 0 :(得分:2)

我不确定你为什么需要一个单身人士。存储在应用程序范围内的Just create one bean。

@Override
public void contextInitialized(ServletContextEvent event) {
    ServletContext context = event.getServletContext();
    Set<String> ips = parseContextParamSomehow(context.getInitParam("ips"));
    Manager manager = new Manager();
    manager.setIps(ips);
    context.setAttribute("manager", manager);
}

它将在EL上下文中由#{manager}提供。也作为arbitraty JSF托管bean的托管属性。另一种方法是创建一个应用程序范围的JSF托管bean并在其构造函数中完成工作,但是您将其构造推迟到涉及该bean的第一个HTTP请求。