Spring MVC學習筆記(二)

在方法參數上使用@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註解自動校驗。

相關文章
相關標籤/搜索