Front Controller и DispatcherServlet
Front Controller — единая точка входа, которая принимает HTTP-запрос и делегирует его подходящему обработчику. В Spring MVC эту роль выполняет DispatcherServlet.
Путь запроса
HTTP request
→ servlet filters
→ DispatcherServlet
→ HandlerMapping
→ HandlerAdapter
→ controller
→ return value handlers / message converters
→ HTTP responseПри исключении подключаются HandlerExceptionResolver и @ControllerAdvice. Для view-контроллера результат проходит через ViewResolver; для REST тело сериализует message converter.
Что важно различать
- servlet container вызывает filters и
DispatcherServlet; DispatcherServletне ищет методы reflection «вручную», а использует набор стратегий;- interceptor относится к выбранному handler и работает внутри MVC;
- security обычно начинается раньше, в filter chain;
- один процесс может иметь несколько servlet, но Boot-приложению обычно достаточно одного dispatcher.
Диагностика 404
- Дошёл ли запрос до приложения и правильного порта?
- Совпали ли context path и servlet path?
- Зарегистрирован ли controller в контексте?
- Совпали ли HTTP method, media type и mapping?
- Не остановил ли запрос security filter?
- Нет ли trailing slash или path matching различий?
Вопросы для повторения
- Кто выбирает controller method?
HandlerMapping. - Зачем
HandlerAdapter? Унифицирует вызов разных видов handler. - Где сериализуется JSON? В
HttpMessageConverter, выбранном для типа и media type. - Filter идёт до DispatcherServlet? Да.
- Interceptor является servlet filter? Нет, это механизм Spring MVC.
Связано: Контроллеры Spring, Сервлет, Spring WEB.