Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 420

Ильдар Шаукатович Хабибуллин

Атрибуты — удобное средство хранения объектов, которые должны существовать на протяжении сеанса.

Атрибут удаляется методом

public void removeAttribute(String name);

Контейнер следит за событиями, происходящими во время сеанса. Создание или удаление атрибута, изменение его значения- события класса HttpSessionBindingEvent. Этот

класс является подклассом класса HttpSessionEvent, экземпляр которого создается при всяком изменении в активных сеансах Web-приложения — создании сеанса, прекращении сеанса, истечении срока ожидания запроса.

Сеанс завершается методом invalidate () или по истечении времени ожидания очередного запроса. Это время, в секундах, задается методом

public void setMaxInactiveInterval(int secs);

Сервлет может узнать назначенное время ожидания методом

public int getMaxInactiveInterval();

Фильтры

Суть работы сервлета заключается в обработке полученного из объекта типа ServletRequest запроса и формировании ответа в виде объекта типа ServletResponse. Попутно сервлет может проделать массу работы, создавая объекты, обращаясь к их методам, загружая файлы, соединяясь с базами данных. Эти действия усложняют изначально простую и четкую структуру сервлета. Чтобы придать стройность и упорядоченность сервлету, можно организовать цепочку фильтров — объектов, последовательно пропускающих через себя информацию, идущую от запроса к ответу, и преобразующих ее.

Удобство фильтров заключается еще и в том, что один фильтр может использоваться несколькими сервлетами и даже всеми ресурсами Web-приложения. Разработчик может подготовить набор фильтров на все случаи жизни и применять их в своих сервлетах.

При работе с фильтрами сразу создается цепочка фильтров, даже если в нее входит всего один фильтр. Вся работа с цепочками фильтров описывается интерфейсами Filter, FilterChain и FilterConfig. Интерфейс Filter реализуется разработчиком приложения, остальные интерфейсы должен реализовать контейнер сервлетов.

Каждый фильтр в цепочке — это объект типа Filter. Структура этого объекта напоминает структуру сервлета. Интерфейс Filter описывает три метода:

public void init(FilterConfig cong);

public void doFilter(ServletRequest req, ServletResponse resp,

FilterChain chain); public void destroy();

Как видно из этих описаний, фильтр может выполнить начальные действия методом init (), причем ему передается созданный контейнером объект типа FilterConfig, который очень похож на объект типа ServletConfig. Он также содержит начальные параметры, которые можно получить методами

public Enumeration getInitParameterNames(); public String getInitParameter(String name);

У него тоже есть имя, которое дается ему при установке фильтра в контейнер и записывается в конфигурационный файл web.xml в элемент <filter-name>. Имя класса-фильтра можно получить методом

public String getFilterName();

Наконец, он тоже возвращает ссылку на контекст методом

public ServletContext getServletContext(String name);

Вся фильтрация выполняется методом doFilter( ), который получает объекты req и resp, изменяет их и передает управление следующему фильтру в цепочке с помощью аргумента chain.