在 Java 中,@RequestParam
是 Spring MVC 中的一个注解,主要用于从 HTTP 请求 中提取参数,并将它们绑定到 方法的参数 上。它通常用于处理来自客户端(例如,浏览器或其他 HTTP 客户端)发送的 查询参数 或 表单数据。
作用
-
绑定请求参数到方法参数:
@RequestParam
允许你将请求的查询参数(或者表单数据)直接绑定到方法的参数上。Spring 会自动解析请求并将相应的值注入到方法参数中。
-
指定请求参数名称:
- 你可以指定参数的名称,通过
@RequestParam
中的value
属性来匹配请求中的参数名。
- 你可以指定参数的名称,通过
-
设置默认值:
- 如果请求中没有指定该参数,可以通过
defaultValue
属性来设置一个默认值。这样可以避免MissingServletRequestParameterException
错误。
- 如果请求中没有指定该参数,可以通过
基本用法
1. 接收查询参数
假设客户端发送了一个 HTTP 请求:
GET /greet?name=John&age=30
你可以在控制器方法中使用 @RequestParam
来获取这些参数:
@GetMapping("/greet") public String greet(@RequestParam String name, @RequestParam int age) { return "Hello, " + name + ". You are " + age + " years old."; }
在这个例子中,name
和 age
参数会从请求的查询字符串中获取。
2. 指定参数名称
你也可以显式指定参数名称,这在请求参数的名称不一致时非常有用。例如:
@GetMapping("/greet") public String greet(@RequestParam("name") String username, @RequestParam("age") int userAge) { return "Hello, " + username + ". You are " + userAge + " years old."; }
如果请求是 /greet?name=John&age=30
,那么 name
和 age
参数会分别被注入到 username
和 userAge
。
3. 提供默认值
如果请求中没有传递某个参数,可以通过 defaultValue
属性设置一个默认值:
@GetMapping("/greet") public String greet(@RequestParam(value = "name", defaultValue = "Guest") String name) { return "Hello, " + name; }
如果请求中没有 name
参数,那么 name
的值将会是 "Guest"
。
4. 非必需的参数
你还可以指定某个请求参数是否是必需的。如果参数不是必需的,可以设置 required = false
。默认为 true
,如果参数缺失,Spring 会抛出 MissingServletRequestParameterException
异常。
@GetMapping("/greet") public String greet(@RequestParam(value = "name", required = false, defaultValue = "Guest") String name) { return "Hello, " + name; }
在上面的例子中,name
参数是可选的。如果没有提供,默认值为 "Guest"
。
5. 接收多个相同名称的参数
如果请求中有多个同名的参数,@RequestParam
会将它们封装到一个列表(List
)中。例如:
GET /greet?name=John&name=Jane
@GetMapping("/greet") public String greet(@RequestParam List<String> name) { return "Hello, " + String.join(", ", name); }
在这个例子中,name
将是一个包含 "John"
和 "Jane"
的列表。
6. 与表单数据一起使用
当使用 POST
请求并提交表单数据时,@RequestParam
同样适用于接收表单字段。例如,假设你有一个 HTML 表单:
<form method="POST" action="/submit"> <input type="text" name="username"> <input type="text" name="email"> <button type="submit">Submit</button> </form>
在控制器中,你可以使用 @RequestParam
来接收表单数据:
@PostMapping("/submit") public String submit(@RequestParam("username") String username, @RequestParam("email") String email) { return "Username: " + username + ", Email: " + email; }
7. 接收数组或集合参数
你还可以接收数组或集合类型的参数。例如,假设请求中传递了多个同名的参数:
GET /filter?category=electronics&category=furniture&category=clothing
你可以通过 @RequestParam
接收这些参数并将它们绑定到数组或集合中:
@GetMapping("/filter") public String filter(@RequestParam("category") String[] categories) { return "Categories: " + String.join(", ", categories); }
或者使用 List
:
@GetMapping("/filter") public String filter(@RequestParam("category") List<String> categories) { return "Categories: " + String.join(", ", categories); }
总结
@RequestParam
用于从请求中提取参数,并将其绑定到方法参数上。- 它通常用于处理 查询参数 或 表单数据。
- 你可以设置默认值、标记参数为必填或非必填、处理多个同名参数等。
- 适用于 GET、POST 等 HTTP 请求。
通过使用 @RequestParam
,你可以更方便地从 HTTP 请求中提取数据并进行处理。