@PathVariable和@RequestParam有什么区别?
时间: 2025-08-07 09:45:40 浏览: 10
### @PathVariable 与 @RequestParam 的区别及使用场景
#### 1. 定义与功能
- **@PathVariable** 是用于从 URL 路径中提取占位符参数的注解,通常用于 RESTful 风格的 Web 服务。它适用于表示资源路径中的变量[^2]。例如,在 `/users/{id}` 中,`{id}` 是路径的一部分,可以通过 `@PathVariable` 提取。
- **@RequestParam** 是用于从请求 URL 中的查询参数或请求体中提取参数的注解。它通常用于处理 GET 和 POST 请求中的查询参数或表单数据[^1]。
#### 2. 使用场景
- **@PathVariable** 主要用于需要明确指定资源标识符的场景,例如获取某个特定用户的详细信息。它通过路径变量来定位资源,符合 RESTful 设计规范。例如:
```java
@GetMapping("/users/{id}")
public String getUserById(@PathVariable("id") int userId) {
return "User ID: " + userId;
}
```
在上述代码中,`/users/123` 将会匹配到 `userId = 123`[^5]。
- **@RequestParam** 主要用于处理查询参数或表单提交的数据。它可以用于分页查询、搜索过滤等场景。例如:
```java
@GetMapping("/users")
public String listUsers(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size) {
return "Page: " + page + ", Size: " + size;
}
```
在上述代码中,`/users?page=2&size=20` 将会匹配到 `page = 2` 和 `size = 20`[^4]。
#### 3. 参数设置
- **@RequestParam** 支持设置参数是否为必填项以及默认值。例如:
```java
@GetMapping("/user")
public String getUserByUsername(@RequestParam(required = false, defaultValue = "anonymous") String username) {
return "Query User: " + username;
}
```
在上述代码中,如果未提供 `username` 参数,则默认值为 `"anonymous"`[^3]。
- **@PathVariable** 通常不需要设置必填项或默认值,因为路径变量通常是必需的,否则无法匹配到正确的资源。
#### 4. 示例对比
| 注解 | 使用场景 | 示例 URL | 示例代码 |
|-----------------|-----------------------------|--------------------------|-------------------------------------------------------------------------|
| **@PathVariable** | 路径变量,RESTful 风格 | `/users/123` | `@GetMapping("/users/{id}") public String getUserById(@PathVariable("id") int userId)` |
| **@RequestParam** | 查询参数或表单数据 | `/users?page=2&size=20` | `@GetMapping("/users") public String listUsers(@RequestParam("page") int page, @RequestParam("size") int size)` |
---
阅读全文