📚 目录(点击跳转对应章节)
[一、Spring MVC 简介](#一、Spring MVC 简介)
[二、Controller 加载控制与业务 Bean 加载控制](#二、Controller 加载控制与业务 Bean 加载控制)
[三、Spring MVC 初始化配置类](#三、Spring MVC 初始化配置类)
四、请求映射路径的设置
[五、POST 请求中文乱码处理](#五、POST 请求中文乱码处理)
[六、非 JSON 格式请求参数处理](#六、非 JSON 格式请求参数处理)
[七、JSON 格式请求参数处理](#七、JSON 格式请求参数处理)
[八、@RequestParam 与 @RequestBody 的区别](#八、@RequestParam 与 @RequestBody 的区别)
九、日期类型的参数传递
十、总结
一、Spring MVC 简介

📌 图片解析
Spring MVC 是基于 MVC 设计模式 的 Web 框架,主要职责是:
- 接收 HTTP 请求
- 解析请求参数
- 调用业务逻辑
- 返回响应结果
整体请求流程可以抽象为:
客户端请求
→ DispatcherServlet
→ Controller
→ Service
→ Dao
→ 返回响应
📌 核心角色说明
- DispatcherServlet:前端控制器,所有请求的统一入口
- Controller:处理请求,接收参数,返回结果
- Model:封装数据
- View:页面或 JSON 响应
二、Controller 加载控制与业务 Bean 加载控制

📌 图片解析
图片中展示的是 Spring MVC 的 双容器结构:
Spring 容器体系
│
├── Root 容器
│ ├── Service
│ ├── Dao
│ ├── DataSource
│ └── TransactionManager
│
└── Web 容器
└── Controller
📌 设计目的
- Web 层与业务层解耦
- Controller 专注请求处理
- Service 专注业务逻辑
📌 访问规则
- Web 容器可以访问 Root 容器
- Root 容器不能访问 Web 容器
三、Spring MVC 初始化配置类

📌 图片解析
该配置类用于 替代 web.xml,在服务器启动时完成 Spring MVC 的初始化。
java
public class ServletContainersInitConfig
extends AbstractAnnotationConfigDispatcherServletInitializer
1️⃣ getServletMappings
java
return new String[]{"/"};
- 设置 Spring MVC 的请求拦截路径
/表示拦截所有请求- 所有请求交由 DispatcherServlet 处理
2️⃣ getServletConfigClasses
java
return new Class[]{SpringMvcConfig.class};
- 加载 Web 层配置
- 扫描 Controller
- 配置视图解析器、JSON 转换器等
3️⃣ getRootConfigClasses
java
return new Class[]{SpringConfig.class};
- 加载业务层配置
- 包含 Service、Dao、数据源、事务管理
📌 总结
Spring MVC 初始化的本质是:
创建 DispatcherServlet + 创建父子容器
四、请求映射路径的设置

📌 图片解析
java
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save")
public void save() {}
}
最终访问路径:
/user/save
📌 映射规则
- 类级别定义模块路径
- 方法级别定义功能路径
五、POST 请求中文乱码处理

📌 图片解析
在初始化配置类中添加过滤器:
java
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return new Filter[]{filter};
}
📌 作用
- 在请求进入 Controller 之前统一设置编码
- 解决 POST 请求中文乱码问题
六、非 JSON 格式请求参数处理
1️⃣ 参数名不一致的情况

📌 图片解析
java
@RequestMapping("/save")
public void save(@RequestParam("username") String name) {}
请求参数:
username=zhangsan
📌 作用
- 建立请求参数与方法参数的映射关系
2️⃣ 数组参数绑定

📌 图片解析
java
@RequestParam("hobby") String[] hobbies
请求示例:
hobby=java&hobby=python
Spring MVC 自动封装为数组类型。
七、JSON 格式请求参数处理
1️⃣ 添加 JSON 转换依赖

📌 图片解析
在 pom.xml 中添加 Jackson 依赖,用于 JSON 与 Java 对象之间的转换。
2️⃣ 请求数据必须是 JSON
json
{
"name": "zhangsan",
"age": 18
}
请求头中需要声明 JSON 类型。
3️⃣ 启用 JSON 自动转换

📌 图片解析
java
@EnableWebMvc
该注解用于启用 Spring MVC 的核心功能,包括消息转换器。
4️⃣ Controller 方法接收 JSON

📌 图片解析
java
@PostMapping("/save")
public void save(@RequestBody User user) {}
Spring MVC 会自动将 JSON 数据转换为 Java 对象。
5️⃣ 使用时的注意点
- 请求体必须是 JSON 格式
- JSON 的结构必须与 Java 对象属性一致
八、@RequestParam 与 @RequestBody 的区别

📌 图片解析总结
| 注解 | 数据来源 | 使用场景 |
|---|---|---|
| @RequestParam | 请求参数 | 表单、URL 参数 |
| @RequestBody | 请求体 | JSON 数据 |
📌 记忆口诀
表单参数用 @RequestParam
JSON 数据用 @RequestBody
九、日期类型的参数传递

📌 图片解析
图片中展示的是 Controller 方法直接接收日期类型参数 的场景。
1️⃣ 问题背景
当前端传递日期字符串时,例如:
birth=2023-10-01
Spring MVC 默认无法自动将字符串转换为日期类型。
2️⃣ 解决方案
在 Controller 方法参数上使用注解指定日期格式:
java
@RequestMapping("/save")
public void save(
@DateTimeFormat(pattern = "yyyy-MM-dd") Date birth
) {}
3️⃣ 工作原理
- Spring MVC 在参数绑定阶段
- 根据指定的日期格式
- 将字符串转换为 Date 对象
4️⃣ 使用场景总结
- 表单提交日期
- URL 传递日期参数
- 日期格式与 Java 类型不一致时
十、总结
- Spring MVC 通过 DispatcherServlet 统一接管请求
- 利用双容器机制解耦 Web 与业务
- 使用注解完成路径映射与参数绑定
- 通过 Jackson 实现 JSON 自动转换
- 借助格式化注解完成日期类型转换