在瞭解@modelAttribute前,我們首先來了解一下
model,modelMap,ModelAndView的區別
model:Model 是一個接口, 其實現類爲ExtendedModelMap,繼承了ModelMap類
modelMap:鍵值對的map對象
public ModelMap addAttribute(String attributeName, Object attributeValue) {
Assert.notNull(attributeName, "Model attribute name must not be null");
this.put(attributeName, attributeValue);
return this;
}
ModelAndView:一個視圖容器,簡單點說就是Model+view
下面我們來看@modelAttribute
@modelAttribute可以放在方法體前,也可放在方法體中
方法體前
@ModelAttribute的目的是讓該方法在訪問requestmapping之前先被調用
@ModelAttribute
public void testmodelattribute(@RequestParam("pet") int abc, Model model){
model.addAttribute("attributeName", abc);
}
隱式賦值,將返回值用model.addAttribute方法將該對象以鍵值對的形式存起來,key爲類型名
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
@ModelAttribute如果指定了屬性名,且在方法體上存在返回值,則該返回值相當於key=attributeName,value = user
@ModelAttribute("attributeName")
public String addAccount(User user) {
return user;
}
@ModelAttribute可以寫在requestMapping之前,不過返回值不是視圖名,而是屬性值,相當於在request中封裝了key=attributeName,value=val,視圖名會以”/helloWorld.do”轉換爲邏輯視圖helloWorld來獲取
@RequestMapping(value = "/helloWorld.do")
@ModelAttribute("attributeName")
public String test() {
return "val";
}
方法體中
假如我們初始化一個model,並時期擁有值,我們可以通過@ModelAttribute(”user”)寫在方法體中爲其賦值,如下:
public class HelloWorldController {
@ModelAttribute("user")
public User addAccount() {
return new User("xiaoming","123456");
}
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute("user") User user) {
system.out.println(user.getName())//xiaoming
return "helloWorld";
}
}
從Form表單或URL參數中獲取值(可加可不加)
public class HelloWorldController {
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute User user) {
system.out.println(user.getName())//xiaoming
return "helloWorld";
}
}
由於我們由表單獲取的值可能會出現轉化時失敗,產生異常,這時我們可以做相關的校驗,加入BindingResult 這個對象即可
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) {
if (result.hasErrors()) {
return "petForm";
}
}