原文: https://javatutorial.net/pathvariable-annotation-in-spring

就像@RequestParam一样,@PathVariable注解用于从 HTTP request 中提取数据。 但是,它们略有不同。 区别在于@RequestParam从 URL 获取参数,而@PathVariable只是从 URI 中提取参数。

Spring 中的`PathVariable`注解 - 图1

示例

假设您有一个支持以下 URL 的网站:

  1. http://www.yourwebsite.net/employee/1

上面的 URL 中的1代表员工的 ID。 到目前为止,一切都很好。 现在,从您的 Spring 控制器开始,路径看起来像(取决于您给id赋予的名称):

  1. /employee/{id}

以上网址路径对我们有何帮助? 好吧,由于有了{}语法(碰巧称为 URI 模板),您现在可以使用@PathVariable将其传递给方法,并且您的方法以及注释将类似于以下内容:

  1. @RequestMapping(value="/employee/{id}", method=RequestMethod.GET)
  2. <Access Modifier> <Return Type> <Method Name> (@PathVariable <Type> id) { <body> }

从上面的代码片段中可以看到,现在id将从路径中引用{id}。 让我们尝试一个真实的例子:

  1. @Controller
  2. @SpringBootApplication
  3. public class EmployeeManager {
  4. @RequestMapping(value=" /employee/{id}")
  5. public String pathVariableDemo(Model model, @PathVariable int id) {
  6. model.addAttribute("id", id);
  7. return "demo";
  8. }
  9. }

现在,Spring 查看id参数,并将其与模板变量id进行匹配。

请记住,如果我的代码将id(参数)命名为其他名称,则将无法使用。 但是,如果您不想为参数和模板变量使用相同的名称,则可以指定PathVariable注解的名称,如下所示:

  1. @Controller
  2. @SpringBootApplication
  3. public class EmployeeManager {
  4. @RequestMapping(value=" /employee/{id}")
  5. public String pathVariableDemo(Model model, @PathVariable("id") int someRandomName) {
  6. model.addAttribute("id", someRandomName);
  7. return "demo";
  8. }
  9. }

从上面的示例中可以看到,我将参数名称更改为someRandomName,但我还添加了@PathVariable("id"),它再次指定了我们要引用的模板变量。

因此,最终您有两个选择:

  1. 方法参数使用相同的名称
  2. @PathVariable注解中指定模板变量的名称

多个@PathVariable注解

如果您可以有多个@PathVariable,该怎么办? 我们可以做到吗? 我们可以! 实际上,这与添加单个@PathVariable非常相似。

我来给你展示。

  1. @Controller
  2. @SpringBootApplication
  3. public class EmployeeManager {
  4. @RequestMapping(value="/{company}/employee/{id}", method=RequestMethod.GET)
  5. public String pathVariableDemo(@PathVariable("company") String companyName, @PathVariable("id") int employeeId) {
  6. // handle the code
  7. return "demo";
  8. }
  9. }

从上面的代码片段中可以看到,我们有两个模板变量:

  1. company
  2. id

然后,我们提取每个模板变量,然后通过指定方法参数所引用的临时变量将它们“分配”给方法参数。

@PathVariable vs @RequestParam结论

尽管@PathVariable@RequestParam都用于从 URL 提取值,但是可以根据 URL 的设计使用它们。

通常,@PathVariable通常用于 RESTful Web 服务中,而@RequestParam用于从查询参数中提取数据。