Spring MVC 详细介绍
1. 什么是 Spring MVC?
Spring MVC 是 Spring 框架中的一个 Web 模块,基于 MVC(Model-View-Controller)设计模式,用于快速构建灵活、松耦合的 Web 应用程序。它通过清晰的组件分层(模型、视图、控制器)简化了请求处理流程,并提供了丰富的功能支持,如数据绑定、验证、国际化、RESTful API 开发等。。
2. 核心作用与功能
Spring MVC 主要完成以下核心任务:
功能 | 说明 |
---|---|
请求处理与路由 | 将 HTTP 请求映射到对应的控制器方法(如 /users → UserController )。 |
数据绑定与转换 | 自动将请求参数(如 URL 参数、表单数据)绑定到 Java 对象,支持类型转换(如字符串转日期)。 |
业务逻辑处理 | 在控制器(Controller)中执行业务逻辑(如查询数据库、调用服务层)。 |
视图渲染 | 将处理结果(模型数据)渲染为 HTML、JSON、XML 等响应格式。 |
异常处理 | 统一处理全局或特定异常,返回友好的错误信息。 |
表单验证 | 集成验证框架(如 Hibernate Validator)对输入数据进行校验。 |
文件上传 | 支持单文件或多文件上传,简化文件处理流程。 |
3. Spring MVC 核心组件
以下是 Spring MVC 的核心组件及其协作流程:
1. 前端控制器(DispatcherServlet
)
• 角色:所有 HTTP 请求的入口,负责协调各组件。
• 作用:
• 接收请求并分发给对应的处理器(Controller)。
• 根据视图名称渲染最终响应。
2. 处理器映射(HandlerMapping
)
• 功能:根据请求 URL 找到对应的控制器方法(如 @GetMapping("/users")
)。
• 常用实现:
• RequestMappingHandlerMapping
:基于 @RequestMapping
注解的映射。
3. 控制器(Controller
)
• 职责:处理具体业务逻辑,返回模型数据和视图名称。
• 示例:
@Controller
public class UserController {
@GetMapping("/users")
public String listUsers(Model model) {
List<User> users = userService.findAll();
model.addAttribute("users", users); // 添加数据到模型
return "user-list"; // 返回视图名称
}
}
4. 视图解析器(ViewResolver
)
• 作用:将逻辑视图名称(如 "user-list"
)解析为具体的视图实现(如 JSP、Thymeleaf 模板)。
• 常见实现:
• InternalResourceViewResolver
:解析 JSP 视图。
• ThymeleafViewResolver
:解析 Thymeleaf 模板。
5. 视图(View
)
• 功能:将模型数据渲染为最终响应(如生成 HTML 页面)。
• 示例(Thymeleaf 模板):
<table>
<tr th:each="user : ${users}">
<td th:text="${user.name}"></td>
</tr>
</table>
6. 模型(Model
)
• 作用:存储业务逻辑处理后的数据,供视图渲染使用。
4. Spring MVC 处理流程
以下是一个请求在 Spring MVC 中的处理步骤:
- 用户发起请求(如
GET /users
)。 DispatcherServlet
接收请求,作为统一入口。HandlerMapping
查找控制器方法,确定处理该请求的UserController.listUsers()
。- 调用控制器方法,执行业务逻辑(如查询用户列表),并将数据存入
Model
。 - 返回视图名称(如
"user-list"
)。 ViewResolver
解析视图名称,找到对应的视图模板(如user-list.html
)。- 视图渲染:将模型数据填充到视图中,生成最终响应(如 HTML)。
- 响应返回给用户。
5. Spring MVC 的优势
优势 | 说明 |
---|---|
松耦合设计 | 各组件(Controller、Service、DAO)职责分离,便于维护和扩展。 |
注解驱动开发 | 通过 @Controller 、@RequestMapping 等注解简化配置。 |
灵活的数据绑定 | 支持将请求参数自动绑定到对象,处理复杂数据类型(如日期、枚举)。 |
强大的视图支持 | 兼容多种视图技术(JSP、Thymeleaf、FreeMarker、JSON)。 |
集成 Spring 生态 | 无缝整合 Spring 的依赖注入(DI)、AOP、事务管理等功能。 |
RESTful 支持 | 通过 @RestController 轻松开发 REST API(返回 JSON/XML)。 |
6. 示例:Spring MVC 开发 REST API
@RestController
@RequestMapping("/api/users")
public class UserApiController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getAllUsers() {
return userService.findAll();
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User savedUser = userService.save(user);
return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
}
}
• 说明:
• @RestController
表示返回 JSON 数据。
• @RequestBody
将请求体中的 JSON 自动转换为 User
对象。
7. Spring MVC vs. 传统 Servlet 开发
对比项 | Spring MVC | 传统 Servlet |
---|---|---|
配置复杂度 | 基于注解,配置简洁。 | 需手动配置 web.xml 和 Servlet 映射。 |
代码复用性 | 通过依赖注入和 AOP 提高复用性。 | 需自行管理对象生命周期和复用。 |
视图技术支持 | 支持多种模板引擎和响应格式(HTML、JSON)。 | 需手动拼接 HTML 或使用 JSP。 |
异常处理 | 全局异常处理器(@ControllerAdvice )统一管理。 | 需在每个 Servlet 中单独处理异常。 |
8. 总结
• Spring MVC 是什么:基于 MVC 模式的 Web 框架,用于构建灵活的企业级应用。
• 核心功能:请求路由、数据绑定、业务处理、视图渲染。
• 核心组件:DispatcherServlet
、Controller
、ViewResolver
、Model
。
• 优势:注解驱动、松耦合设计、强大的集成能力、支持 RESTful 开发。
适用场景:
• 传统 Web 应用(如后台管理系统)。
• RESTful API 开发(如移动端/前后端分离架构)。
• 需要与 Spring 生态(如 Spring Security、Spring Data)集成的项目。