Как Spring MVC работает поверх Servlet API?

«Как Spring MVC работает поверх Servlet API?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring MVC — это фреймворк, построенный поверх стандартного Servlet API. Его ядро — DispatcherServlet, который действует как единый Front Controller, обрабатывающий все входящие HTTP-запросы.

Архитектура обработки запроса:

graph LR
    A[HTTP Request] --> B[DispatcherServlet]
    B --> C[Handler Mapping]
    C --> D[Controller]
    D --> E[ModelAndView]
    E --> F[View Resolver]
    F --> G[View]
    G --> H[HTTP Response]

1. Регистрация DispatcherServlet Он объявляется как единственный сервлет в web.xml или через Java-конфигурацию SpringBootServletInitializer.

<!-- web.xml -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/application-context.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

2. Процесс обработки запроса внутри DispatcherServlet:

  • HandlerMapping: Определяет, какой контроллер (@Controller) должен обработать запрос, на основе URL (@RequestMapping).
  • HandlerAdapter: Вызывает метод контроллера, связывает параметры (аргументы метода, @ModelAttribute).
  • ViewResolver: Преобразует логическое имя представления, возвращённое контроллером, в конкретное представление (JSP, Thymeleaf).

3. Ключевое отличие от чистого Servlet API Spring MVC абстрагирует низкоуровневые операции HttpServletRequest/HttpServletResponse, предлагая декларативный подход.

// Чистый Servlet
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    String name = req.getParameter("name");
    // ... ручная обработка
}

// Spring MVC Controller
@GetMapping("/greet")
public String greet(@RequestParam String name, Model model) {
    model.addAttribute("message", "Hello " + name);
    return "greet-view"; // ViewResolver найдёт greet-view.jsp
}

Таким образом, Spring MVC не заменяет сервлеты, а предоставляет мощную абстракцию для удобной разработки веб-слоя.