@RequestParam 和 @PathVariable 都是 Spring MVC 中用于从 HTTP 请求中提取参数的注解,但它们的作用和使用场景有所不同。
一.@RequestParam
作用:从请求的查询参数(query parameters)或表单数据(form data)中提取参数。
使用场景:适用于 URL 中的查询参数或 POST 请求中的表单数据。
示例
假设有一个 URL:http://example.com/download?filename=template.xlsx
@GetMapping("/download")
public ResponseEntity<Resource> downloadFile(@RequestParam("filename") String filename) throws IOException {
// 方法体
}
@RequestParam("filename") String filename:从请求的查询参数中提取名为 filename 的参数,并将其赋值给方法参数 filename。
二.@PathVariable
作用:从请求的 URL 路径中提取参数。
使用场景:适用于 URL 路径中的占位符。
示例
假设有一个 URL:http://example.com/download/template.xlsx
@GetMapping("/download/{filename}")
public ResponseEntity<Resource> downloadFile(@PathVariable("filename") String filename) throws IOException {
// 方法体
}
@PathVariable("filename") String filename:从请求的 URL 路径中提取名为 filename 的占位符,并将其赋值给方法参数 filename。
三.区别总结
参数来源:
@RequestParam:从请求的查询参数或表单数据中提取。
@PathVariable:从请求的 URL 路径中提取。
URL 格式:
@RequestParam:URL 中的查询参数,如 http://example.com/download?filename=template.xlsx。
@PathVariable:URL 路径中的占位符,如 http://example.com/download/template.xlsx。
使用场景:
@RequestParam:适用于需要传递多个查询参数的场景,或者参数不是路径的一部分。
@PathVariable:适用于路径中包含动态部分的场景,如 RESTful API 设计。
四.示例对比
1.使用 @RequestParam
@GetMapping("/download")
public ResponseEntity<Resource> downloadFile(@RequestParam("filename") String filename) throws IOException {
// 方法体
}
URL:http://example.com/download?filename=template.xlsx
2.使用 @PathVariable
@GetMapping("/download/{filename}")
public ResponseEntity<Resource> downloadFile(@PathVariable("filename") String filename) throws IOException {
// 方法体
}
URL:http://example.com/download/template.xlsx
总结
@RequestParam:用于从查询参数或表单数据中提取参数。
@PathVariable:用于从 URL 路径中提取参数。
选择合适的注解可以使代码更清晰、更易于维护,并且能够正确地解析请求参数。