在方法參數上使用@ModelAttribute代表參數的值須要從model中獲取。若是model不存在,參數應當首先被實例化而後添加進model。一旦model存在,參數的屬性須要從名稱匹配的請求參數中獲取。java
示例
app
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method=RequestMethod.POST) public String processSubmit(@ModelAttribute Pet pet){ }
上面示例中pet實例的來源,有如下幾種狀況:
可能已經存在因爲使用了@SessionAttributes。
因爲在同一個控制器中的@ModelAttribute方法。
可能基於URI模板變量和類型轉換器檢索。
可能有默認的構造函數實例化。函數
@ModelAttribute方法是一種獲取經過使用@SessionAttributes存儲在請求中的屬性普通方式。在某些狀況下經過使用URI模板變量和類型轉換器檢索屬性會更方便。code
示例
orm
@RequestMapping(value="/account/{account}", method=RequestMethod.PUT) public String save(@ModelAttribute("account") Account account){}
示例中model屬性與URI模板變量名相匹配。若是註冊了能夠將String類型的account值轉換爲Account實例的Converter<String, Account>,上面的示例能夠不須要@ModelAttribute方法。字符串
下一步是數據綁定。WebDataBinder類將表單域和字符串參數按照名字與model屬性匹配。
匹配的域會進過必要的類型轉換。it
數據綁定過程當中可能會產生缺乏必須的域或類型轉換等錯誤。在緊跟@ModelAttribute參數添加BindingResult參數來檢查此類錯誤。io
示例
模板
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method=RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindResult result){ if(result.hasErrors()){ retrun "petForm"; } }
經過BindResult能夠檢查是否存在錯誤。經過使用Spring的errors表單標籤顯示錯誤。
在數據綁定中能夠經過BindingResult使用自定義的校驗器來記錄數據綁定錯誤。這樣能夠將數據綁定錯誤存放在一個地方反饋給用戶。class
示例
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method=RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result){ new PetValidator().validate(pet, reult); if(result.hasErrors){ return "petForm"; } }
或者經過添加JSR-303@Valid註解自動校驗。