Зачем в сервлетах используются различные listener
Listener (слушатель) — это Java-класс, реализующий один из интерфейсов javax.servlet.*Listener, который работает как триггер и выполняет действия при наступлении событий жизненного цикла: создание/уничтожение запроса, сессии, контекста приложения, а также изменение их атрибутов.
Слушатели по области видимости
| Область | Слушатель | Отслеживает |
|---|---|---|
| Request | ServletRequestListener |
Создание и уничтожение запроса |
| Request | ServletRequestAttributeListener |
Изменение атрибутов запроса |
| Context | ServletContextListener |
Инициализация и уничтожение контекста приложения |
| Context | ServletContextAttributeListener |
Изменение атрибутов контекста |
| Session | HttpSessionListener |
Создание и уничтожение сессии |
| Session | HttpSessionAttributeListener |
Изменение атрибутов сессии (регистрируется в web.xml) |
| Session | HttpSessionBindingListener |
Привязка/отвязка объекта от сессии (реализуется самим объектом) |
| Session | HttpSessionActivationListener |
Миграция сессии между JVM в кластере |
Регистрация слушателя
Пример
<listener>
<listener-class>xyz.company.ExampleListener</listener-class>
</listener>
Или через аннотацию @WebListener (Servlet 3+).
HttpSessionBindingListener отличается от остальных: он не регистрируется в web.xml, а реализуется самим объектом, который помещается в сессию через setAttribute(). Контейнер автоматически вызывает valueBound()/valueUnbound() при добавлении/удалении такого объекта.
На собеседовании: ключевой вопрос — разница между
HttpSessionAttributeListenerиHttpSessionBindingListener. Первый — глобальный (один на все сессии), второй — локальный (привязан к конкретному объекту в сессии).