我看到一个问题,链接如下:如何从任何方法中访问ServletContext实例?。该问题解释了如果我想在Java Web项目中的任何类中访问ServletContext,我可以声明一个指向ServletContextListener中ServletContext的静态字段,但是在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常量。
ServletContextListener
中完成任务呢?顺便说一下,FacesContext
仅在每个 URL 与FacesServlet
的 URL 模式匹配并因此调用它的每个单独 HTTP 请求上初始化。 - BalusCServletContext#getInitParameter
。目前的解决方法是创建一个单例类,在实现ServletContextListener
接口的类中加载这些值,但是这会导致内存问题,所以我们需要在ServletContext中创建该类的实例并将其作为属性加载,但是在静态方法中无法访问它。 - Luiggi Mendozapublic static
变量中吗?为什么? - BalusC