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

  1. Дошёл ли запрос до приложения и правильного порта?
  2. Совпали ли context path и servlet path?
  3. Зарегистрирован ли controller в контексте?
  4. Совпали ли HTTP method, media type и mapping?
  5. Не остановил ли запрос security filter?
  6. Нет ли trailing slash или path matching различий?

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

  1. Кто выбирает controller method? HandlerMapping.
  2. Зачем HandlerAdapter? Унифицирует вызов разных видов handler.
  3. Где сериализуется JSON? В HttpMessageConverter, выбранном для типа и media type.
  4. Filter идёт до DispatcherServlet? Да.
  5. Interceptor является servlet filter? Нет, это механизм Spring MVC.

Связано: Контроллеры Spring, Сервлет, Spring WEB.