一、什么是 Spring MVC

Spring MVC 是 Spring 框架提供的一个基于 MVC(Model-View-Controller) 设计模式的 Web 应用开发框架。它将 Web 应用分为三层:

表格

层级职责
Model(模型)封装业务数据与逻辑,如 Service、DAO、Entity
View(视图)负责数据展示,如 JSP、Thymeleaf、FreeMarker
Controller(控制器)接收请求、调用业务层、返回视图或数据

Spring MVC 的核心是 DispatcherServlet(前端控制器),它作为整个请求的"总指挥",协调各组件完成请求处理。


二、Spring MVC 核心组件

在深入流程之前,先认识六大核心组件:

表格

组件作用
DispatcherServlet前端控制器,接收所有请求并分发
HandlerMapping处理器映射器,根据 URL 找到对应的 Controller
HandlerAdapter处理器适配器,调用具体的 Controller 方法
Handler(Controller)处理器,执行业务逻辑
ViewResolver视图解析器,解析逻辑视图名到物理视图
View视图,最终渲染页面

三、Spring MVC 执行流程(重点)

Spring MVC 处理一次 HTTP 请求的完整流程如下:

深入理解Spring MVC 工作流程》-CSDN博客

Spring MVC执行流程- C语言中文网

详细步骤拆解

步骤 1:用户发送 HTTP 请求

浏览器向服务器发送请求,如 http://localhost:8080/user/list,所有请求首先到达 DispatcherServlet

DispatcherServlet 需要在 web.xml 或 Spring Boot 配置中配置为拦截所有请求(/)。

步骤 2:DispatcherServlet 查询 Handler

DispatcherServlet 调用 HandlerMapping,根据请求的 URL 查找对应的处理器。

SpringMVC执行流程及工作原理2.DispatcherServlet收到请求调用处理器映射器HandlerMapp - 掘金

HandlerMapping 返回一个 HandlerExecutionChain(执行链),包含:

  • 目标 Handler(Controller)

  • 一组 HandlerInterceptor(拦截器)

步骤 3:返回处理器执行链

HandlerMapping 将找到的 HandlerExecutionChain 返回给 DispatcherServlet。

步骤 4:请求适配器执行

DispatcherServlet 将 Handler 交给 HandlerAdapter 执行。为什么要适配器?因为 Controller 的实现方式多样:

  • 实现 Controller 接口

  • 使用 @Controller + @RequestMapping 注解

  • 实现 HttpRequestHandler 接口

HandlerAdapter 负责统一调用方式。

步骤 5:执行 Handler(Controller)
@Controller
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @RequestMapping("/list")
    public ModelAndView list() {
        List<User> users = userService.findAll();
        ModelAndView mv = new ModelAndView();
        mv.addObject("users", users);  // 封装 Model 数据
        mv.setViewName("userList");     // 设置逻辑视图名
        return mv;
    }
}
步骤 6:返回 ModelAndView

Controller 执行完毕后,返回一个 ModelAndView 对象给 HandlerAdapter,包含:

  • Model:数据模型(键值对)

  • View:逻辑视图名(如 "userList"

HandlerAdapter 再将 ModelAndView 返回给 DispatcherServlet。

步骤 7:请求视图解析

DispatcherServlet 将逻辑视图名交给 ViewResolver 解析。

xml

<!-- spring-mvc.xml 配置示例 -->
<<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

逻辑视图名 userList 会被解析为物理路径:

plain

/WEB-INF/views/userList.jsp
步骤 8:返回 View 对象

ViewResolver 将解析后的 View 对象返回给 DispatcherServlet。

步骤 9:渲染视图

DispatcherServlet 将 Model 中的数据填充到 View 中,进行页面渲染。

步骤 10:返回响应

最终,DispatcherServlet 将渲染后的页面作为 HTTP 响应返回给浏览器。


四、流程图对比

不同资料对 Spring MVC 流程的表述略有差异,但核心逻辑一致:

Spring MVC 流程图- 知乎

SpringMVC学习笔记(二)——SpringMVC工作流程- 一直学习的程序小白- 博客园

关键记忆点:

  1. 所有请求都经过 DispatcherServlet

  2. HandlerMapping 负责"找"Controller

  3. HandlerAdapter 负责"调"Controller

  4. ViewResolver 负责"找"页面

  5. 最终返回 Model + View 的渲染结果


五、Spring MVC 配置示例

1. web.xml 配置(传统方式)

xml

<?xml version="1.0" encoding="UTF-8"?>
<<web-app>
    <!-- 配置 DispatcherServlet -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

2. Spring MVC 配置文件

xml

<?xml version="1.0" encoding="UTF-8"?>
<<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="...">
    
    <!-- 开启注解扫描 -->
    <context:component-scan base-package="com.example.controller"/>
    
    <!-- 开启 MVC 注解驱动 -->
    <mvc:annotation-driven/>
    
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!-- 静态资源放行 -->
    <mvc:resources mapping="/static/**" location="/static/"/>
</beans>

3. Spring Boot 方式(现代推荐)

java

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Controller
public class HelloController {
    
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("msg", "Hello Spring MVC!");
        return "hello"; // 自动解析为 templates/hello.html
    }
}

Spring Boot 自动配置了 DispatcherServlet 和 ViewResolver,无需手动编写 XML。


六、Spring MVC vs Spring Boot

表格

特性Spring MVCSpring Boot
配置方式XML / 注解手动配置自动配置(约定大于配置)
依赖管理手动引入Starter 一键引入
部署方式外置 Tomcat内嵌 Tomcat,jar 包运行
适用场景传统项目、学习原理现代快速开发

七、总结

Spring MVC 的核心设计理念是 "前端控制器模式",通过 DispatcherServlet 统一接收请求,再分发给各组件协作处理。理解以下三点即可掌握 Spring MVC:

  1. DispatcherServlet 是入口 — 所有请求都经过它

  2. HandlerMapping + HandlerAdapter 是桥梁 — 找到并调用 Controller

  3. ViewResolver + View 是出口 — 解析并渲染最终页面

💡 学习建议:先掌握传统 Spring MVC 的流程原理,再使用 Spring Boot 进行实际开发,这样既能理解底层机制,又能提高开发效率。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐