Статическая переменная контекста сервлета - PullRequest
3 голосов
/ 27 марта 2012

Я прочитал вопрос Как получить доступ к экземпляру ServletContext из любого метода? что если я хочу получить доступ к контексту сервлета из любого класса в моем веб-проекте на Java, я могу объявить статическое полеэто указывает на ServletContext из ServletContextListener, но статическое поле является плохой практикой в ​​веб-приложениях Java, потому что GC не может собрать его, пока JVM не будет выключена (исправьте меня, если я ошибаюсь в этом пункте),Есть ли другой способ получить доступ к ServletContext без использования слушателя или получения его в качестве параметра?Есть другой обходной путь для решения этой проблемы?Я использую JSF 1.2 и JBoss 5.1 GA для веб-приложения.

Примечание. Я знаю, что могу использовать

(ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();

для доступа к ServletContext, но есть метод, который выполняется наавтозагрузка, которой требуется доступ к ServletContext и FacesContext.getCurrentInstance() не была инициализирована.

ОБНОВЛЕНИЕ:

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

1 Ответ

2 голосов
/ 27 марта 2012

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

@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} в контексте EL.Также как управляемое свойство произвольного управляемого JSF-компонента.Альтернативой является создание управляемого JSF-компонента в области приложения и выполнение работы в его конструкторе, но затем вы откладываете его конструирование до первого HTTP-запроса, включающего бин.

...