Spring PathVariable注释
与@RequestParam一样,@PathVariable注释用于从HTTP请求中提取数据。然而,它们略有不同。区别在于@RequestParam从URL获取参数,而@PathVariable只是从URI中提取参数。
示例
假设我们有一个支持以下URL的:
http://www.yourwebsite.net/employee/1
1在上面的URL中表示员工的ID。到现在为止,一直都还不错。但是,现在,从Spring控制器来看,路径将如下所示(取决于为id指定的名称):
/employee/{id}
上面的URL路径对我们有什么帮助?好吧,由于{}语法(恰好称为URI template),我们现在可以使用@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查看outid参数并将其与模板变量“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"; } }
从上面的代码片段可以看出,我们有两个模板变量:
身份证
然后,我们提取每个模板变量,并通过指定方法参数所引用的tempalte变量将它们“分配”给方法参数。
@PathVariable vs@RequestParam总结
尽管@PathVariable和@RequestParam都用于从URL提取值,但它们的使用取决于URL的设计。
通常,@PathVariable主要用于restfulweb服务,而@RequestParam用于从查询参数中提取数据。