在Spring MVC中你可以使用@PathVariable注解将URI的参数的值绑定到方法的参数上。
@RequestMapping(value = "/owners/{ownerId}", method = RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
Owner owner = ownerService.findOwner(ownerId);
model.addAttribute("owner", owner);
return "displayOwner";
}
这个模板" /owners/{ownerId}" 就是指定了参数的名字是ownerId,当控制器去处理请求的时候,ownerId 的值就会出现在URI中合适的部分。为了去处理@PathVariable中的参数名和URI中的参数名,Spring MVC需要去匹配这两个名字,例如你也可以这样去指定:
@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable("ownerId") String theOwner, Model model) {
// implementation omitted
}
如果你的方法的参数名和URI模板中的名字是一样的,那么你就可以不需要这样的去配置。一个方法可以有多个@PathVariable的注解。
@RequestMapping(value = "/owners/{ownerId}/pets/{petId}", method = RequestMethod.GET)
public String findPet(@PathVariable String ownerId,@PathVariable String petId, Model model) {
Owner owner = ownerService.findOwner(ownerId);
Pet pet = owner.getPet(petId);
model.addAttribute("pet", pet);
return "displayPet";
}
当@PathVariable用在Map<String, String>参数上时,那么map中的值就会被URI 模板中的参数值填补。
@RequestMapping("/pathvariable/{userId}/{userName}/{password}")
public String testPathvariable(@PathVariable Map<String,String> strMap){
for(String str : strMap.keySet()){
System.out.println(str + " " + strMap.get(str));
}
return "pathvariable";
}
一个URI模板可以被不同的@RequestMapping控制,例如下面,你可以使用:/owners/42/pets/21访问。
@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
@RequestMapping("/pets/{petId}")
public void findPet(@PathVariable String ownerId,
@PathVariable String petId, Model model) {
// implementation omitted
}
}
@PathVariable注解的参数可以是简单的数据类型,例如int,String, Date等,String自动的进行转换或者如果转换失败的话,那么就会抛出TypeMismatchException你也可以添加额外的类型,但是需要你自己转化,这个在后面会介绍。