Я прочитал из вопроса How to gain access to a ServletContext instance from any method?, что если я хочу получить доступ к сервлет-контексту из любого класса в моем веб-проекте Java, я могу объявить статическое поле, которое указывает на ServletContext
от ServletContextListener
, но статическое поле плохая практика в веб-приложениях Java, потому что GC не может ее собрать до тех пор, пока JVM не отключится (исправьте меня, если я ошибаюсь в этой точке). Есть ли другой способ доступа к ServletContext без использования слушателя или получения его в качестве параметра? Есть еще один способ решения этой проблемы? Я использую JSF 1.2 и JBoss 5.1 GA для веб-приложения.Static Servlet Контекстная переменная
Примечание: Я знаю, что могу использовать
(ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();
для доступа к ServletContext, но есть метод, который работает при запуске, который должен получить доступ к ServletContext и FacesContext.getCurrentInstance()
не был инициализирован.
UPDATE:
Нам нужно загрузить некоторые IP-адреса из web.xml в String
констант, когда веб-приложение запускается. Для этого мы создали класс Singleton, который загружает контекстные параметры в переменных, а затем заполняет константы String некоторыми значениями класса Singleton. Этот класс Singleton управляет множеством данных и выдает ошибки исключения из памяти. Чтобы исправить эту проблему, мы модифицируем класс Singleton как простой класс, который загружается как атрибут ServerContext, но затем константы String не могут быть загружены из-за отсутствия экземпляра этого (не более) Singleton.
Где именно это необходимо и почему? Почему вы не просто выполняете эту работу в самом «ServletContextListener»? «FacesContext», кстати, инициализируется только для каждого HTTP-запроса, URL которого соответствует шаблону URL-адреса 'FacesServlet' и, таким образом, его вызвал. – BalusC
@BalusC Существует постоянная строка, которая загружается в статическом методе с использованием context-param в web.xml. Для этого ему необходимо «ServletContext # getInitParameter». Фактическим обходным путем для этого было создание класса Singleton, который загружает эти значения в классе, который реализует «ServletContextListener», но создает проблемы с его памятью, поэтому нам нужно создать экземпляр класса и загрузить его как атрибут в ServletContext, но затем Я не могу получить доступ к статическому методу. –
* «Создание класса Singleton, который загружает эти значения в классе, который реализует ServletContextListener» * Я не представляю, как это имеет смысл. Каково функциональное требование? Вам нужно, чтобы он попал в переменную 'public static'? Зачем? – BalusC