Получить доступ

Каков жизненный цикл сервлета?

MiddleСервлеты и фильтрыSpringSpring Boot >=3
Ещё спрашивают так:
  • Как Spring MVC связан с сервлетами?
Коротко

Сервлет — объект, обрабатывающий HTTP-запросы в контейнере (Tomcat). Цикл: init один раз → service (doGet, doPost…) на каждый запрос в разных потоках → destroy при остановке.

  • Экземпляр один на все запросы — поля сервлета не должны хранить данные запроса
  • Spring MVC — это один сервлет DispatcherServlet, который раздаёт запросы контроллерам
  • Spring Boot 3 — пакеты jakarta.servlet вместо javax.servlet

А ещё Фильтры (Filter) работают до сервлета — на них построен Spring Security

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Жизненный цикл:

  1. контейнер загружает класс и создаёт один экземпляр;
  2. init(ServletConfig) — однократная инициализация (при старте или первом запросе — load-on-startup);
  3. service(request, response) — на каждый запрос, в потоке из пула контейнера; для HTTP — вызов doGet, doPost и т. д.;
  4. destroy() — при остановке приложения: освободить ресурсы.

Потокобезопасность. Один экземпляр обслуживает все запросы параллельно, поэтому изменяемые поля сервлета — гонка данных. Данные запроса — в локальных переменных, атрибутах запроса или сессии. То же правило для singleton-контроллеров Spring.

Spring MVC регистрирует в контейнере один сервлет — DispatcherServlet (front controller). Он принимает все запросы, находит обработчик через HandlerMapping, вызывает его через HandlerAdapter, сериализует ответ и обрабатывает исключения.

Spring Boot запускает встроенный Tomcat (Jetty, Undertow), регистрирует DispatcherServlet и фильтры автоматически. С Spring Boot 3 / Spring 6 — Jakarta EE: пакеты jakarta.servlet.* вместо javax.servlet.*, что ломает старые библиотеки при миграции.

Что хотят услышать

  • Этапы init, service, destroy.
  • Один экземпляр и потокобезопасность.
  • Связь с DispatcherServlet.
  • jakarta.servlet в Boot 3 — плюс.

Частые ошибки

  • Хранить данные запроса в поле сервлета или контроллера.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Новый сервлет создаётся на каждый запрос
  • ✓Контейнер вызывает init() один раз → service()/doGet/doPost на каждый запрос → destroy() при выгрузке
  • ✗init() вызывается на каждый запрос
  • ✗destroy() вызывается после каждого запроса

Что спросят дальше

  • Чем ServletConfig отличается от ServletContext?
  • Что делает filter?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем