4

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

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

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

我希望能够在不注入任何对ServletConfig我的工厂的引用或任何类似的东西的情况下做到这一点——代码应该能够在 Servlet 容器之外正常运行。

这可能听起来有点不常见,但我希望我正在开发的这个组件能够与我们的一个 webapps 打包在一起,并且还具有足够的通用性,可以与我们的一些命令行工具打包,而无需只为我的组件需要一个新的属性文件 - 所以我希望搭载其他配置文件,例如 web.xml。

如果我没记错的话,.NET 有类似Request.GetCurrentRequest()获取当前执行的引用的东西Request——但由于这是一个 Java 应用程序,我正在寻找可以用来访问ServletConfig.

4

3 回答 3

5

您可以这样做的一种方法是:

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 将为空。

于 2008-09-03T14:36:25.657 回答
1

您是否考虑过为此使用 Spring 框架?这样,您的 bean 就不会得到任何额外的麻烦,并且 spring 会为您处理配置设置。

于 2008-09-03T14:20:45.197 回答
0

我认为您必须添加一个关联的引导类,该类引用 ServletConfig(或 ServletContext)并将这些值转录到 Factory 类。至少这样你可以单独打包。

@toolkit:非常好,最谦虚-这是我一段时间以来一直在尝试做的事情

于 2008-09-03T14:24:03.410 回答