🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Spring 中的`PathVariable`注解 > 原文: [https://javatutorial.net/pathvariable-annotation-in-spring](https://javatutorial.net/pathvariable-annotation-in-spring) 就像`@RequestParam`一样,`@PathVariable`注解用于从 HTTP request 中提取数据。 但是,它们略有不同。 区别在于`@RequestParam`从 URL 获取参数,而`@PathVariable`只是从 URI 中提取参数。 ![java-featured-image](https://img.kancloud.cn/05/3e/053ee0bb59842d92359246c98f815e0c_780x330.jpg) ### 示例 假设您有一个支持以下 URL 的网站: ```java http://www.yourwebsite.net/employee/1 ``` 上面的 URL 中的`1`代表员工的 ID。 到目前为止,一切都很好。 现在,从您的 Spring 控制器开始,路径看起来像(取决于您给`id`赋予的名称): ```java /employee/{id} ``` 以上网址路径对我们有何帮助? 好吧,由于有了`{}`语法(碰巧称为 URI 模板),您现在可以使用`@PathVariable`将其传递给方法,并且您的方法以及注释将类似于以下内容: ```java @RequestMapping(value="/employee/{id}", method=RequestMethod.GET) <Access Modifier> <Return Type> <Method Name> (@PathVariable <Type> id) { <body> } ``` 从上面的代码片段中可以看到,现在`id`将从路径中引用`{id}`。 让我们尝试一个真实的例子: ```java @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`注解的名称,如下所示: ```java @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")`,它再次指定了我们要引用的模板变量。 因此,最终您有两个选择: 1. 方法参数使用相同的名称 2. 在`@PathVariable`注解中指定模板变量的名称 ### 多个`@PathVariable`注解 如果您可以有多个`@PathVariable`,该怎么办? 我们可以做到吗? 我们可以! 实际上,这与添加单个`@PathVariable`非常相似。 我来给你展示。 ```java @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"; } } ``` 从上面的代码片段中可以看到,我们有两个模板变量: 1. `company` 2. `id` 然后,我们提取每个模板变量,然后通过指定方法参数所引用的临时变量将它们“分配”给方法参数。 ## `@PathVariable` vs `@RequestParam`结论 尽管`@PathVariable`和`@RequestParam`都用于从 URL 提取值,但是可以根据 URL 的设计使用它们。 通常,`@PathVariable`通常用于 RESTful Web 服务中,而`@RequestParam`用于从查询参数中提取数据。