Spring PathVariable注释

时间:2020-02-23 14:34:37  来源:igfitidea点击:

与@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用于从查询参数中提取数据。