在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你也可以添加額外的類型,但是需要你自己轉化,這個在後面會介紹。