Servlet API 中是否有任何方法可以从与 Web 容器完全无关的 Bean 或 Factory 类中访问 web.xml 中指定的属性(例如初始化参数)?

例如,我正在编写一个工厂类,我想在工厂中包含一些逻辑来检查文件和配置位置的层次结构,以查看哪些(如果有)可用于确定要实例化的实现类 - 例如,

  1. 类路径中的属性文件,
  2. web.xml 参数,
  3. 系统属性,或
  4. 如果没有其他可用的,则一些默认逻辑。

我希望能够在不注入任何引用的情况下执行此操作 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 类。至少这样你可以单独打包它。

@工具包 :优秀,最谦卑 - 这是我一段时间以来一直在尝试做的事情

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top