有没有办法从 Java Bean 访问 web.xml 属性?
题
Servlet API 中是否有任何方法可以从与 Web 容器完全无关的 Bean 或 Factory 类中访问 web.xml 中指定的属性(例如初始化参数)?
例如,我正在编写一个工厂类,我想在工厂中包含一些逻辑来检查文件和配置位置的层次结构,以查看哪些(如果有)可用于确定要实例化的实现类 - 例如,
- 类路径中的属性文件,
- web.xml 参数,
- 系统属性,或
- 如果没有其他可用的,则一些默认逻辑。
我希望能够在不注入任何引用的情况下执行此操作 ServletConfig
或任何类似于我的工厂的东西 - 代码应该能够在 Servlet 容器之外正常运行。
这可能听起来有点不常见,但我希望我正在开发的这个组件能够与我们的一个 Web 应用程序一起打包,并且具有足够的通用性,可以与我们的一些命令行工具一起打包,而无需我的组件需要一个新的属性文件 - 所以我希望搭载其他配置文件(例如 web.xml)。
如果我没记错的话,.NET 有类似的东西 Request.GetCurrentRequest()
获取当前正在执行的引用 Request
- 但由于这是一个 Java 应用程序,我正在寻找类似的东西,可以用来访问 ServletConfig
.
解决方案
您可以执行此操作的一种方法是:
public class FactoryInitialisingServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent event) {
}
public void contextInitialized(ServletContextEvent event) {
Properties properties = new Properties();
ServletContext servletContext = event.getServletContext();
Enumeration<?> keys = servletContext.getInitParameterNames();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = servletContext.getInitParameter(key);
properties.setProperty(key, value);
}
Factory.setServletContextProperties(properties);
}
}
public class Factory {
static Properties _servletContextProperties = new Properties();
public static void setServletContextProperties(Properties servletContextProperties) {
_servletContextProperties = servletContextProperties;
}
}
然后在你的 web.xml 中有以下内容
<listener>
<listener-class>com.acme.FactoryInitialisingServletContextListener<listener-class>
</listener>
如果您的应用程序在 Web 容器中运行,那么一旦创建了上下文,容器就会调用侦听器。在这种情况下,_servletContextProperties 将替换为 web.xml 中指定的任何上下文参数。
如果您的应用程序在 Web 容器外部运行,则 _servletContextProperties 将为空。
其他提示
您是否考虑过使用 Spring 框架来实现此目的?这样,您的 bean 就不会产生任何额外的麻烦,并且 spring 会为您处理配置设置。
我认为您必须添加一个关联的引导类,该类引用 ServletConfig (或 ServletContext)并将这些值转录到 Factory 类。至少这样你可以单独打包它。
@工具包 :优秀,最谦卑 - 这是我一段时间以来一直在尝试做的事情