Доступ к ServletContext вне сервлета - PullRequest
4 голосов
/ 16 сентября 2009

Интересно, кто-нибудь может посоветовать вопрос о веб-приложении на Java?

У меня есть установленный стандартный класс Java, в котором есть методы для установки и получения значений файла свойств. Эти методы используются во всей системе и вызываются как сервлетами, так и не сервлет-классами.

Но я бы хотел использовать ServletContextListener, чтобы задать пути к файлу свойств глобально, а не жестко кодировать их или сохранить в базе данных.

ServletContextListener может использоваться для установки «глобальных переменных» для сервлетов с context.setAttribute («PROP_FILE_PATH», «C: \ ...»). Но есть ли способ получить доступ к этим переменным вне сервлетов, или ServletContext может быть получен вне сервлетов?

Я не думаю, что передача ServletContext в качестве параметра методам класса, которые я должен получить и установить значения файла свойств, будет приемлемой опцией из-за количества вызовов.

Спасибо

Martin

Ответы [ 4 ]

8 голосов
/ 16 сентября 2009

Вы всегда можете хранить свои настройки в другом месте, чем контекст сервлета, скажем, набор статических переменных в классе конфигурации. Тогда ServletContextListener может установить эти переменные при запуске, и любой другой код может получить доступ к этой статике, независимо от того, имеют ли они доступ к самому ServletContext или нет.

1 голос
/ 07 апреля 2011

ServletContext через ServletContextListener, как указано выше, можно использовать для загрузки статических переменных в классе конфигурации. Он также может быть запущен для перезагрузки этих переменных, если это необходимо. Кроме того, вам просто необходим доступ к объекту HttpServletRequest, чтобы получить доступ к контексту. Если вы передадите запрос промежуточному объекту, вы сможете легко добраться до контекста.

ServletContext application = req.getSession().getServletContext();

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

1 голос
/ 16 сентября 2009

ServletContext может использоваться в контексте или границах сервлета.

Вы можете хранить переменные на сервере jndi, который поставляется вместе с сервером приложений и может использовать исходный контекст для получения переменных оттуда.

Также классы, которые загружают файл свойств, вы можете связать в jar и поместить этот jar в classpath вашего сервера (вы можете обратиться к скрипту запуска сервера и поместить его в classpath там). Так что, когда ваш сервер загружен загрузить класс со статическим блоком {} внутри него и обратиться к файлу этих свойств. Затем вы можете ссылаться на этот класс напрямую, как в пути к классам сервера. Что касается жесткого кодирования пути к файлу свойств, вы можете сохранить его на сервере jndi.

0 голосов
/ 03 мая 2019

Если вы используете Spring, вам не нужно реализовывать свой собственный ServletContextListener. Вы можете использовать ContextLoaderListener Spring, который реализует его и, если он зарегистрирован, сохраняет servletContext и делает его доступным через статический метод для дальнейшего использования.

Регистрация в web.xml:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Тогда легко получить доступ к servletContext вне сервлета:

import javax.servlet.ServletContext;
import org.springframework.web.context.ContextLoaderListener;

ServletContext servletContext = 
  ContextLoaderListener.getCurrentWebApplicationContext().getServletContext();
...