有没有办法从Java Bean访问web.xml属性?

时间:2008-09-03 13:26:55

标签: java servlets

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

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

  1. 类路径中的属性文件
  2. web.xml参数
  3. 系统属性,或
  4. 如果没有其他可用的默认逻辑。
  5. 我希望能够在不注入ServletConfig或类似于我工厂的任何内容的情况下执行此操作 - 代码应该能够在Servlet容器之外运行。

    这可能听起来有点不常见,但我想要这个组件,我正在努力与我们的一个webapps一起打包,并且也足够多才能与我们的一些命令一起打包 - 行工具,不需要为我的组件提供新的属性文件 - 所以我希望能够搭载其他配置文件,例如web.xml。

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

3 个答案:

答案 0 :(得分: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中指定的任何context-params。

如果您的应用程序在Web容器外运行,则_servletContextProperties将为空。

答案 1 :(得分:1)

您是否考虑过使用Spring框架?这样,你的bean不会得到任何额外的瑕疵,而spring会为你处理配置设置。

答案 2 :(得分:0)

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

@toolkit:非常好,最谦卑 - 这是我一直试图做的事情