springmvc @modelAttribute

在瞭解@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";
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章