Сервлет
Servlet — Java-компонент, который container вызывает для обработки HTTP-запроса. В современных приложениях используется пакет jakarta.servlet.*; старые версии применяют javax.servlet.*.
Жизненный цикл
- Container создаёт экземпляр.
- Один раз вызывает
init. - Для запросов вызывает
service;HttpServletраспределяет их поdoGet,doPostи другим методам. - Перед выгрузкой вызывает
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 на время ожидания, но не делает любую вызываемую библиотеку неблокирующей автоматически.
Вопросы для повторения
- Создаётся ли servlet на каждый запрос? Обычно нет, один экземпляр вызывается конкурентно.
- Кто вызывает
service? Servlet container. - Почему нельзя хранить request в поле? Несколько потоков обслуживают разные запросы одним объектом.
- Что делает
DispatcherServlet? Является servlet и передаёт запрос в инфраструктуру Spring MVC.
Связано: Tomcat, Фильтры Filters слушатели Listeners и перехватчики Interceptors.