原文: https://javatutorial.net/pathvariable-annotation-in-spring
就像@RequestParam一样,@PathVariable注解用于从 HTTP request 中提取数据。 但是,它们略有不同。 区别在于@RequestParam从 URL 获取参数,而@PathVariable只是从 URI 中提取参数。

示例
假设您有一个支持以下 URL 的网站:
http://www.yourwebsite.net/employee/1
上面的 URL 中的1代表员工的 ID。 到目前为止,一切都很好。 现在,从您的 Spring 控制器开始,路径看起来像(取决于您给id赋予的名称):
/employee/{id}
以上网址路径对我们有何帮助? 好吧,由于有了{}语法(碰巧称为 URI 模板),您现在可以使用@PathVariable将其传递给方法,并且您的方法以及注释将类似于以下内容:
@RequestMapping(value="/employee/{id}", method=RequestMethod.GET)<Access Modifier> <Return Type> <Method Name> (@PathVariable <Type> id) { <body> }
从上面的代码片段中可以看到,现在id将从路径中引用{id}。 让我们尝试一个真实的例子:
@Controller@SpringBootApplicationpublic class EmployeeManager {@RequestMapping(value=" /employee/{id}")public String pathVariableDemo(Model model, @PathVariable int id) {model.addAttribute("id", id);return "demo";}}
现在,Spring 查看id参数,并将其与模板变量id进行匹配。
请记住,如果我的代码将id(参数)命名为其他名称,则将无法使用。 但是,如果您不想为参数和模板变量使用相同的名称,则可以指定PathVariable注解的名称,如下所示:
@Controller@SpringBootApplicationpublic class EmployeeManager {@RequestMapping(value=" /employee/{id}")public String pathVariableDemo(Model model, @PathVariable("id") int someRandomName) {model.addAttribute("id", someRandomName);return "demo";}}
从上面的示例中可以看到,我将参数名称更改为someRandomName,但我还添加了@PathVariable("id"),它再次指定了我们要引用的模板变量。
因此,最终您有两个选择:
- 方法参数使用相同的名称
- 在
@PathVariable注解中指定模板变量的名称
多个@PathVariable注解
如果您可以有多个@PathVariable,该怎么办? 我们可以做到吗? 我们可以! 实际上,这与添加单个@PathVariable非常相似。
我来给你展示。
@Controller@SpringBootApplicationpublic class EmployeeManager {@RequestMapping(value="/{company}/employee/{id}", method=RequestMethod.GET)public String pathVariableDemo(@PathVariable("company") String companyName, @PathVariable("id") int employeeId) {// handle the codereturn "demo";}}
从上面的代码片段中可以看到,我们有两个模板变量:
companyid
然后,我们提取每个模板变量,然后通过指定方法参数所引用的临时变量将它们“分配”给方法参数。
@PathVariable vs @RequestParam结论
尽管@PathVariable和@RequestParam都用于从 URL 提取值,但是可以根据 URL 的设计使用它们。
通常,@PathVariable通常用于 RESTful Web 服务中,而@RequestParam用于从查询参数中提取数据。
