我已经从问题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>
答案 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请求。