原文: 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
@SpringBootApplication
public 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
@SpringBootApplication
public 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
@SpringBootApplication
public class EmployeeManager {
@RequestMapping(value="/{company}/employee/{id}", method=RequestMethod.GET)
public String pathVariableDemo(@PathVariable("company") String companyName, @PathVariable("id") int employeeId) {
// handle the code
return "demo";
}
}
从上面的代码片段中可以看到,我们有两个模板变量:
company
id
然后,我们提取每个模板变量,然后通过指定方法参数所引用的临时变量将它们“分配”给方法参数。
@PathVariable
vs @RequestParam
结论
尽管@PathVariable
和@RequestParam
都用于从 URL 提取值,但是可以根据 URL 的设计使用它们。
通常,@PathVariable
通常用于 RESTful Web 服务中,而@RequestParam
用于从查询参数中提取数据。