Какой сервлет является главным в Spring MVC
Что проверяют
Понимаете ли вы, что происходит между приходом HTTP-запроса и вызовом метода контроллера. Само имя DispatcherServlet знают почти все, поэтому сразу просят пройти путь запроса по шагам или спрашивают, чем фильтр отличается от интерсептора.
Как отвечать
DispatcherServlet реализует паттерн Front Controller: один сервлет принимает все запросы приложения и раздаёт их обработчикам. Путь запроса:
- HandlerMapping: по URL, методу и заголовкам находит обработчик. Для
@RequestMappingэтоRequestMappingHandlerMapping; - HandlerInterceptor:
preHandleдо вызова,postHandleпосле успешного вызова,afterCompletionв самом конце, даже при исключении; - HandlerAdapter: вызывает метод контроллера и собирает его аргументы (
@PathVariable,@RequestBodyи так далее); - HttpMessageConverter: для
@RestControllerи@ResponseBodyпревращает результат в тело ответа, JSON обычно пишет Jackson; - ViewResolver и View: в классическом MVC по имени представления находят шаблон Thymeleaf или JSP и рендерят его с моделью;
- HandlerExceptionResolver: превращает исключение в ответ, через него работают
@ExceptionHandlerи@ControllerAdvice.
Про регистрацию. В Spring Boot сервлет создаёт автоконфигурация и вешает на /, руками ничего писать не нужно. Без Boot, начиная с Servlet 3.0, его регистрируют кодом через WebApplicationInitializer, а web.xml остался в старых проектах. В Spring Boot 3 всё это живёт в пакетах jakarta.servlet, а не javax.servlet.
Где спотыкаются
Рассказывают про настройку в web.xml как про основной способ. Для проекта на Boot это сразу выдаёт устаревшие знания.
Путают фильтры и интерсепторы. Фильтры, включая цепочку Spring Security, работают на уровне контейнера сервлетов до DispatcherServlet и о контроллерах не знают. Интерсепторы вызываются внутри него и видят выбранный обработчик.
Говорят, что ViewResolver участвует в каждом запросе. Для REST-контроллера ответ пишет конвертер сообщений, представление не ищется. И отдельно: в WebFlux сервлета нет вовсе, роль диспетчера там играет DispatcherHandler.