1. 概述

在本文中,我们将探讨Spring的@RequestParam@PathVariable注解的区别。

@RequestParam@PathVariable都可以用于从请求URI中提取值,但是它们还是有一些的不同。

2. 查询参数与URI路径

@RequestParam是从查询字符串中提取值。

@PathVariables从URI提取路径值。

我们写两个映射来测试一下:

@RequestMapping(value = "/vs/{id}" , method = RequestMethod.GET)
@ResponseBody
public String getPathVariable(@PathVariable String id) {
  logger.info("PathVariable ID: {}", id);
  return "PathVariable ID: " + id;
}

@RequestMapping(value = "/vs" , method = RequestMethod.GET)
@ResponseBody
public String getRequestParam(@RequestParam String id) {
  logger.info("RequestParam ID: {}", id);
  return "RequestParam ID: " + id;
}

我们来测试一下

# curl http://localhost:8080/vs/test
PathVariable ID: test%  

# curl http://localhost:8080/vs?id=test
RequestParam ID: test%

3. 编码与准确的值

因为*@PathVariable从URI路径中提取值,因此未进行编码。而@RequestParam*进行了编码。

这里我们使用加号(+)来测试一下:

# curl http://localhost:8080/vs/a+b
PathVariable ID: a+b%  

# curl http://localhost:8080/vs?id=a+b
RequestParam ID: a b%

可以看出使用*@PathVariable*是直接从URI路径中获取值。

而*@RequestParam*将加号(+)装换为空格了。

4. 结论

本文探讨Spring MVC中的@RequestParam@PathVariable注解的区别。

与往常一样,可以在GitHub上找到示例实现。