Spring Web MVC
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中。其正式名称 "Spring Web MVC" 来自其源码模块名称(spring-webmvc),但它更通俗的名称是 "Spring MVC"。
与 Spring Web MVC 平行,Spring Framework 5.0 引入了一个响应式栈(reactive-stack)Web 框架,其名称 "Spring WebFlux" 同样基于其源码模块(spring-webflux)。本章涵盖 Spring Web MVC。关于响应式栈 Web 应用程序,请参阅 基于响应式栈的 Web 框架。
有关 Servlet 容器和 Jakarta EE 版本范围的基准信息和兼容性,请参阅 Spring Framework Wiki。
本节摘要
- DispatcherServlet
Spring MVC 的核心,作为所有请求的中央调度器。 - 过滤器 (Filters)
利用 Servlet 过滤器实现通用的请求处理逻辑。 - HTTP 消息转换
如何将请求/响应正文转换为对象(如 JSON、XML)。 - 注解控制器 (Annotated Controllers)
使用@Controller和@RestController构建灵活的请求处理程序。 - 函数式端点 (Functional Endpoints)
一种可选的编程式编程模型。 - URI 链接
安全、动态地构建指向控制器方法的 URI。 - 异步请求
利用 Servlet 3.0+ 的异步能力提升资源利用率。 - 范围请求 (Range Requests)
支持断点续传和大文件分块传输。 - 跨域 (CORS)
内置的跨源资源共享支持。 - API 版本管理
处理 Web 服务的版本演进。 - 错误响应
优雅地处理异常并返回标准的错误格式(如 RFC 7807)。 - Web 安全
安全性的核心关注点和最佳实践。 - HTTP 缓存
利用 ETag 和 Last-Modified 提升性能。 - 视图技术
支持 Thymeleaf、FreeMarker、JSP 等多种渲染引擎。 - MVC 配置
通过WebMvcConfigurer自定义框架行为。 - HTTP/2
在 Spring MVC 中利用 HTTP/2 连接多路复用。
补充教学
1. Spring MVC 的核心工作流
即使在复杂的企业级应用中,Spring MVC 的本质依然是围绕 DispatcherServlet 展开的“查表”过程:
- 请求进入:所有 HTTP 请求先打到 DispatcherServlet。
- 查找映射:它问
HandlerMapping:“谁能处理这个/api/user路径?” - 执行处理:找到对应的
@Controller方法后,它通过HandlerAdapter执行业务代码。 - 结果转换:如果是
@RestController,它通过HttpMessageConverter将返回值(如User对象)转为 JSON;如果是传统@Controller,它找ViewResolver渲染 HTML。
2. 从“网页开发”到“接口开发”的转变
早期的 Spring MVC 重点在于生成 HTML 页面(JSP, Velocity)。 现状:随着前后端分离的普及,现在的 Spring MVC 绝大多数时候是作为 RESTful API 的提供者。
- 关键变化:你会发现
@RestController和@ResponseBody成为了主流,而传统的“视图解析器”在现代项目中已不常用。
3. @Controller 与 @RestController 的区别
这是一个经典的面试题,但在实际开发中至关重要:
@Controller:主要用于返回物理视图路径(如"index"->index.html)。如果你想在里面回传 JSON,必须在方法上加@ResponseBody。@RestController:它是@Controller和@ResponseBody的组合体。意味着该类下的所有方法默认都会将返回值写进 HTTP 响应体(通常转为 JSON),而不是去查找视图。