Есть ли способ получить доступ к свойствам web.xml из Java Bean? - PullRequest
4 голосов
/ 03 сентября 2008

Есть ли в Servlet API какой-либо способ доступа к свойствам, указанным в web.xml (например, к параметрам инициализации), из класса Bean или Factory, который вообще не связан с веб-контейнером?

Например, я пишу класс Factory, и я хотел бы включить в Factory некоторую логику, чтобы проверить иерархию файлов и конфигурационных местоположений, чтобы увидеть, какие из них доступны, чтобы определить, какой класс реализации создать - например,

  1. файл свойств в пути к классам,
  2. параметр web.xml,
  3. системное свойство или
  4. некоторая логика по умолчанию, если больше ничего не доступно.

Я бы хотел сделать это, не вставляя ссылку на ServletConfig или что-то похожее на мою Фабрику - код должен нормально работать вне контейнера сервлетов.

Это может показаться немного необычным, но я бы хотел, чтобы этот компонент, над которым я работаю, мог быть упакован с одним из наших веб-приложений, а также был достаточно универсален, чтобы быть упакованным с некоторыми из наших команд. инструменты линии, не требуя нового файла свойств только для моего компонента - поэтому я надеялся использовать поверх других файлов конфигурации, таких как web.xml.

Если я правильно помню, в .NET есть что-то вроде Request.GetCurrentRequest(), чтобы получить ссылку на выполняемое в настоящее время Request - но, поскольку это приложение Java, я ищу что-то похожее, что можно было бы использовать для получения доступа к ServletConfig.

Ответы [ 3 ]

5 голосов
/ 03 сентября 2008

Один из способов сделать это:

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>

Если ваше приложение выполняется в веб-контейнере, то контейнер будет вызывать прослушиватель после создания контекста. В этом случае _servletContextProperties будет заменен на любые контекстные параметры, указанные в web.xml.

Если ваше приложение работает вне веб-контейнера, то _servletContextProperties будет пустым.

1 голос
/ 03 сентября 2008

Рассматривали ли вы использование Spring Framework для этого? Таким образом, ваши бобы не получат лишних усилий, и Spring выполнит настройку конфигурации за вас.

0 голосов
/ 03 сентября 2008

Я думаю, что вам придется добавить связанный класс начальной загрузки, который берет ссылку на ServletConfig (или ServletContext) и транскрибирует эти значения в класс Factory. По крайней мере, так вы можете упаковать его отдельно.

@ toolkit: Отлично, наиболее скромно - это то, что я пытался сделать некоторое время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...