Сервлет

Servlet — Java-компонент, который container вызывает для обработки HTTP-запроса. В современных приложениях используется пакет jakarta.servlet.*; старые версии применяют javax.servlet.*.

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

  1. Container создаёт экземпляр.
  2. Один раз вызывает init.
  3. Для запросов вызывает service; HttpServlet распределяет их по doGet, doPost и другим методам.
  4. Перед выгрузкой вызывает destroy.

Один экземпляр обычно обслуживает много запросов параллельно. Поля servlet не должны хранить изменяемое состояние конкретного пользователя или запроса.

public final class HealthServlet extends HttpServlet {
    @Override
    protected void doGet(
            HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        response.setContentType("text/plain");
        response.getWriter().write("ok");
    }
}

Container

Tomcat, Jetty и Undertow управляют HTTP-соединениями, servlet, filters, listeners и служебными потоками. Spring MVC размещает внутри этой модели свой Front Controller.

Async servlet освобождает request thread на время ожидания, но не делает любую вызываемую библиотеку неблокирующей автоматически.

Вопросы для повторения

  1. Создаётся ли servlet на каждый запрос? Обычно нет, один экземпляр вызывается конкурентно.
  2. Кто вызывает service? Servlet container.
  3. Почему нельзя хранить request в поле? Несколько потоков обслуживают разные запросы одним объектом.
  4. Что делает DispatcherServlet? Является servlet и передаёт запрос в инфраструктуру Spring MVC.

Связано: Tomcat, Фильтры Filters слушатели Listeners и перехватчики Interceptors.