目录
[一、路径参数:参数直接来自 URL 路径](#一、路径参数:参数直接来自 URL 路径)
[1. 什么是路径参数](#1. 什么是路径参数)
[2. 使用方式](#2. 使用方式)
[3. 特点与适用场景](#3. 特点与适用场景)
[二、请求参数:来自 URL 或表单的 key-value 参数](#二、请求参数:来自 URL 或表单的 key-value 参数)
[1. 什么是请求参数](#1. 什么是请求参数)
[2. 使用方式](#2. 使用方式)
[3. 特点与适用场景](#3. 特点与适用场景)
[三、请求体参数:来自 HTTP Request Body 的结构化数据](#三、请求体参数:来自 HTTP Request Body 的结构化数据)
[1. 什么是请求体参数](#1. 什么是请求体参数)
[2. 使用方式](#2. 使用方式)
[3. 特点与适用场景](#3. 特点与适用场景)
[1. 什么是对象参数](#1. 什么是对象参数)
[2. 使用方式](#2. 使用方式)
[3. 底层原理说明](#3. 底层原理说明)
在使用 Spring MVC 编写接口时,我们几乎每天都在和"参数"打交道。
路径参数、请求参数、JSON、对象接收......看起来方式很多,但如果只停留在"记注解",很容易越学越乱。
事实上,从参数来源 的角度来看,Spring MVC 中绝大多数的传参方式都可以归纳为 四种核心形式 :路径参数、请求参数、请求体参数、对象参数
理解这四类参数的来源和适用场景,基本就掌握了 Spring MVC 80% 的参数接收机制。
一、路径参数:参数直接来自 URL 路径
1. 什么是路径参数
路径参数是 URL 路径本身的一部分,通常用于表示某个具体资源。
GET /users/1
其中的 1,就是一个典型的路径参数。
2. 使用方式
java
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.getById(id);
}
3. 特点与适用场景
- 参数嵌入在 URL 中,语义清晰
- 符合 RESTful 设计风格
- 通常用于资源的定位
常见场景:
- 根据 id 查询详情
- 根据 id 删除资源
二、请求参数:来自 URL 或表单的 key-value 参数
1. 什么是请求参数
请求参数通常以 key=value 的形式出现,存在于 URL 查询串或表单数据中。
GET /users?name=zhangsan&age=18
2. 使用方式
java
@GetMapping("/users")
public List<User> list(
@RequestParam String name,
@RequestParam Integer age) {
return userService.list(name, age);
}
3. 特点与适用场景
- 参数形式简单、直观
- 适合可选参数较多的场景
- 不具备强结构性
常见场景:
- 条件查询
- 分页、排序参数
三、请求体参数:来自 HTTP Request Body 的结构化数据
1. 什么是请求体参数
请求体参数来源于 HTTP 请求体,通常是 JSON 格式,前后端分离项目中非常常见。
{
"name": "zhangsan",
"age": 18
}
2. 使用方式
java
@PostMapping("/users")
public void save(@RequestBody User user) {
userService.save(user);
}
3. 特点与适用场景
- 数据结构清晰、层次分明
- 通常用于 POST、PUT 请求
- 依赖 HttpMessageConverter 进行解析
常见场景:
- 新增数据
- 更新数据
- 前后端分离接口
四、对象参数:请求参数的自动封装
1. 什么是对象参数
对象参数并不是单独的一种数据来源,而是 Spring MVC 将请求参数自动绑定为 Java 对象的结果。
POST /users
name=zhangsan&age=18
2. 使用方式
java
@PostMapping("/users")
public void save(User user) {
userService.save(user);
}
3. 底层原理说明
Spring 会根据以下规则进行自动绑定:
- 请求参数名
- 对象属性名
- 对应的 setter 方法
只要三者匹配,就可以完成自动封装。
这是 Spring MVC 非常"无感但强大"的能力。
五、一个非常容易混淆的点
对象参数 ≠ 请求体参数
很多人容易把下面两种写法混为一谈:
java
public void save(User user) // 对象参数(来自请求参数)
public void save(@RequestBody User user) // 请求体参数(来自 JSON)
关键区别在于:
- 是否使用 @RequestBody
- 参数来自请求参数,还是请求体
这一点在实际开发中非常重要。
六、四种传参形式对比总结
| 类型 | 参数来源 | 典型注解 | 常见场景 |
|---|---|---|---|
| 路径参数 | URL 路径 | @PathVariable | 资源定位 |
| 请求参数 | URL / 表单 | @RequestParam | 条件查询 |
| 请求体参数 | Request Body | @RequestBody | JSON 提交 |
| 对象参数 | 请求参数封装 | 无 / @ModelAttribute | 表单提交 |
七、总结
Spring MVC 的传参,本质是根据"参数来源不同",选择不同的解析与绑定方式。