2012-03-26 2 views
3

Я прочитал из вопроса 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.

+0

Где именно это необходимо и почему? Почему вы не просто выполняете эту работу в самом «ServletContextListener»? «FacesContext», кстати, инициализируется только для каждого HTTP-запроса, URL которого соответствует шаблону URL-адреса 'FacesServlet' и, таким образом, его вызвал. – BalusC

+0

@BalusC Существует постоянная строка, которая загружается в статическом методе с использованием context-param в web.xml. Для этого ему необходимо «ServletContext # getInitParameter». Фактическим обходным путем для этого было создание класса Singleton, который загружает эти значения в классе, который реализует «ServletContextListener», но создает проблемы с его памятью, поэтому нам нужно создать экземпляр класса и загрузить его как атрибут в ServletContext, но затем Я не могу получить доступ к статическому методу. –

+0

* «Создание класса Singleton, который загружает эти значения в классе, который реализует ServletContextListener» * Я не представляю, как это имеет смысл. Каково функциональное требование? Вам нужно, чтобы он попал в переменную 'public static'? Зачем? – BalusC

ответ

2

Я не уверен, почему вам нужен синглтон. Just create one, который вы храните в области применения.

@Override 
public void contextInitialized(ServletContextEvent event) { 
    ServletContext context = event.getServletContext(); 
    Set<String> ips = parseContextParamSomehow(context.getInitParam("ips")); 
    Manager manager = new Manager(); 
    manager.setIps(ips); 
    context.setAttribute("manager", manager); 
} 

Это будет доступно на #{manager} в Е.Л. контексте. Также как управляемое свойство управляемого компонента JSF арбитража. Альтернативой является создание управляемого приложениями управляемого JSF компонента и выполнение задания в его конструкторе, но вы затем откладываете его конструкцию до первого HTTP-запроса, который включает в себя компонент.

+0

Синглтон был для реализации кеша (да, мы понятия не имеем о ehcache или других фреймворках), но это были плохие решения, поэтому вместо добавления этой рамки мой босс хочет решить эту проблему с запрограммированными нами классами. Кстати, ваше решение выглядит интересным, но как я могу получить доступ к 'context' в методе, который не вызывается в HTTP-запросе? –

+0

Просто 'событие', как показано в ответе? – BalusC

Смежные вопросы