Подтвердить что ты не робот

Область контекста сервлета и глобальная переменная

Что (если есть) - это разница между сохранением переменной в ServletContext и просто ее как публичным статическим членом одного из классов?

Вместо записи:

// simplified (!)
int counter = (Integer)getServletContext().getAttribute("counter");
counter++;
this.getServletContext().setAttribute("counter", counter);

Почему бы просто не иметь:

// in class MyServlet
public static int counter = 0;

// in a method somewhere
MyServlet.counter++;

(Игнорировать concurrency проблемы, пожалуйста, это просто тупой пример)

Из того, что я могу сказать, эти две опции ведут себя одинаково под Tomcat. Есть ли что-то лучше в использовании первого варианта?

4b9b3361

Ответ 1

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

Все, что заставляет два разных запроса обслуживаться экземпляром приложения в другом загрузчике классов (это может быть перезагрузка сервера, повторное развертывание веб-приложений или серверы с несколькими серверами node), приведет к разрыву вашей логики. Контекст сервлета выдержит эти вещи, поскольку веб-контейнер знает об этом и может сериализовать его или иметь общий репозиторий.

Ответ 2

Ну, они не совсем то же самое; servlet-context-scope является частной для webapp, тогда как статическая область является частной для загрузчика классов. В зависимости от вашего контейнера и того, как он настроен, это может быть или не быть одинаковым. Когда вы думаете о Webapps и JavaEE, использование контекстно-зависимого поля будет более надежно переносимым. Кроме того, атрибуты с контекстно-зависимым доступом легче получить из JSP, т.е. Вам не нужны сценарии, чтобы добраться до них.