Spring MVC 本身与 Spring 框架深度整合,同时拥有 Spring 的优点:依赖注入(DI)、面向切面编程(AOP)等。
Spring MVC 提供了强大的约定大于配置编程支持,提供软件设计范式,减少开发者的决策次数,只需要规定应用中不符合约定的部分。
可以方便地与其他视图技术(FreeMarker、Thymeleaf 等)整合。
Spring MVC 的模型数据通常存放在 Map 结构中,方便被其他框架引用。
拥有简洁统一的异常处理机制。
可以灵活实现数据验证、数据格式化、数据绑定,支持使用任意对象进行数据绑定。

1 Spring MVC 请求流程

image.png

用户单击请求路径,发起 HTTP 请求,请求被 前端控制器(DispatcherServlet) 接收处理。
前端控制器请求 处理器映射器(HandlerMapping) 查找 Handler。
处理器映射器根据注解 / XML 配置找到 Handler(包含拦截器 Interceptor),返回给前端控制器。
前端控制器请求 处理器适配器(HandlerAdapter) 执行对应的 Handler(即 Controller)。
处理器适配器执行 Handler(Controller 业务逻辑)。
Handler 执行完成后,返回给适配器一个 ModelAndView 对象(包含 Model 数据 + View 视图)。
处理器适配器将 ModelAndView 返回给前端控制器。
前端控制器请求 视图解析器(ViewResolver) 解析视图。
视图解析器根据视图名称找到具体视图,返回给前端控制器。
前端控制器进行视图渲染,将 Model 数据填充到 request 域,生成最终页面。
前端控制器将结果响应给用户。

方便记忆:
流程六块:上三下三
用户 → DispatcherServlet → HandlerMapping → HandlerAdapter (Controller) → ViewResolver → View

2 Spring Boot 对 Spring MVC 的自动配置

Spring Boot 为 Spring MVC 提供全自动配置,自动配置类所在包:
org.springframework.boot.autoconfigure.web.servlet
自动配置的核心组件:
ViewResolver:视图解析器,根据返回值得到视图对象,决定转发 / 重定向
ContentNegotiatingViewResolver:组合所有视图解析器
✔ 定制:向容器添加自定义 ViewResolver,会自动被组合
Converter 转换器:类型转换(String ↔ 对象等)
Formatter 格式化器:日期、数字格式化(2007-12-12 → Date)
HttpMessageConverter:HTTP 请求 / 响应格式转换(对象 ↔ JSON)
✔ 定制:向容器注册自定义 HttpMessageConverter 即可生效
ConfigurableWebBindingInitializer:Web 数据绑定初始化器

3 MVC 三层说明

M(Model)
负责实体建模、数据持久化、业务逻辑,对应数据库实体、Service、Repository。
C(Controller)
接收请求,调用业务逻辑,返回数据或视图。

@RequestMapping("/new")
public ModelAndView create(ModelMap model) {
    String[] files = {"/img/1.jpg", "/img/2.jpg"};
    model.addAttribute("files", files);
    return new ModelAndView("movie/new");
}

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(Movie movie) throws Exception {
    movieRepository.save(movie);
    return "redirect:/list"; // 必须返回字符串视图名,不能返回 1
}

V(View)
使用 Thymeleaf 模板引擎(同类:FreeMarker)

5 扩展 Spring MVC 配置

XML 写法

<mvc:view-controller path="/hello" view-name="success"/>
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/hello"/>
        <bean class="自定义拦截器"/>
    </mvc:interceptor>
</mvc:interceptors>

Spring Boot 注解配置

@Configuration
public class WebConfig implements WebMvcConfigurer {  // 实现这个接口

    // 添加视图控制器
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/hello").setViewName("success");
    }
    
    // 添加拦截器等...
}

6 Spring MVC 核心组件

1. HandlerMapping(处理器映射器)

作用:根据请求 URL 找到对应的 Controller 方法
常用实现:
RequestMappingHandlerMapping:注解版(@RequestMapping)
BeanNameUrlHandlerMapping:Bean 名称匹配 URL
支持通配符、Ant 风格路径:/user/*、/user/**

2. HandlerAdapter(处理器适配器)

作用:统一调用不同类型的 Handler(Controller、HttpRequestHandler、Servlet)
关键实现:
RequestMappingHandlerAdapter:处理注解 Controller
执行参数解析、返回值处理、消息转换

3. HandlerInterceptor(拦截器)

三个方法
preHandle:进入 Controller 前执行
postHandle:Controller 执行完、渲染页面前
afterCompletion:页面渲染完成后
应用场景:登录校验、日志、权限、接口限流

**其他补充:拦截器和过滤器区别 **
Filter:Servlet 规范,依赖容器,before/after
Interceptor:Spring MVC 组件,能访问 Controller、Model,更精细

4. ExceptionHandler 全局异常

@ExceptionHandler:单个 Controller 异常处理
@RestControllerAdvice + @ExceptionHandler:全局统一异常处理
配合 ResponseEntity 可自定义 HTTP 状态码

5. 数据绑定与校验

@Valid / @Validated 开启校验
JSR-380 校验注解:@NotBlank、@NotNull、@Email、@Pattern
校验结果:BindingResult 接收错误信息
自定义校验器:实现 ConstraintValidator

7 参数绑定高级用法

1. 常用注解

@RequestParam:普通参数,必填 / 非必填
@PathVariable:路径变量 /user/{id}
@RequestBody:接收 JSON 对象
@RequestHeader:获取请求头
@CookieValue:获取 Cookie
@ModelAttribute:自动封装对象、方法前置增强

2. 复杂参数绑定

数组、List、Set、Map 直接注入
多级对象封装:user.address.city
日期格式化:@DateTimeFormat、@JsonFormat

3. Converter & Formatter

Converter<S,T>:任意类型互转
Formatter:字符串 ↔ 对象(日期、数字格式化)
WebDataBinder:数据绑定器,可注册自定义转换器

8 返回值处理进阶

1. 常见返回值类型

String:视图名
ModelAndView:数据 + 视图
@ResponseBody:直接返回 JSON / 字符串
ResponseEntity:自定义状态码、响应头、响应体
Void:自行通过 response 输出

2. HttpMessageConverter

作用:请求 / 响应体自动转换(JSON ↔ Java 对象)
默认使用 Jackson
可自定义:FastHttpMessageConverter、GsonHttpMessageConverter
支持:JSON、XML、Protobuf、文本等

3. 视图与重定向

转发:forward:/path
重定向:redirect:/path(会丢失 request 域数据)
重定向传参:RedirectAttributes 用 addFlashAttribute 跨请求保存

9 Spring MVC 高级机制

1. 异步请求

Callable、DeferredResult 实现异步 Servlet
适合:长连接、排队任务、第三方接口调用
释放容器线程,提高吞吐量

2. 文件上传

依赖:commons-fileupload 或 Servlet 3.0 原生
使用:MultipartFile
多文件上传:数组 / List

3. 跨域 CORS

方法级:@CrossOrigin
全局配置:实现 WebMvcConfigurer 重写 addCorsMappings
也可通过过滤器统一处理

4. 数据缓存与静态资源

addResourceHandlers 配置静态资源映射
缓存控制:Cache-Control、ETag
资源版本号:MD5 版本管理

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐