nnotation-driven
<mvc:annotation-driven /> 會自動註冊RequestMappingHandlerMapping、RequestMappingHandlerAdapter 與ExceptionHandlerExceptionResolver 三個bean。
? 還將提供以下支持:
– 支持使用 ConversionService 實例對表單參數進行類型轉換
– 支持使用 @NumberFormat annotation、@DateTimeFormat註解完成數據類型的格式化
– 支持使用 @Valid 註解對 JavaBean 實例進行 JSR 303 驗證
– 支持使用 @RequestBody 和 @ResponseBody 註解
Spring MVC 通過反射機制對目標處理方法進行解析,將請求消息綁定到處理方法的入參中。數據綁定的核心部件是DataBinder
數據綁定流程
? 1. Spring MVC 主框架將 ServletRequest 對象及目標方法的入參實例傳遞給 WebDataBinderFactory 實例,以創建 DataBinder 實例對象
? 2. DataBinder 調用裝配在 Spring MVC 上下文中的ConversionService 組件進行數據類型轉換、數據格式化工作。將 Servlet 中的請求信息填充到入參對象中
? 3. 調用 Validator 組件對已經綁定了請求消息的入參對象進行數據合法性校驗,並最終生成數據綁定結果BindingData 對象
? 4. Spring MVC 抽取 BindingResult 中的入參對象和校驗錯誤對象,將它們賦給處理方法的響應入參
@InitBinder
? 由 @InitBinder 標識的方法,可以對 WebDataBinder 對象進行初始化。WebDataBinder 是 DataBinder 的子類,用於完成由表單字段到 JavaBean 屬性的綁定
? @InitBinder方法不能有返回值,它必須聲明為void。
? @InitBinder方法的參數通常是是 WebDataBinder
數據校驗
<mvc:annotation-driven/> 會默認裝配好一個LocalValidatorFactoryBean,通過在處理方法的入參上標註 @valid 註解即可讓 Spring MVC 在完成數據綁定後執行數據校驗的工作
? 在已經標註了 JSR303 註解的表單/命令對象前標註一個@Valid,Spring MVC 框架在將請求參數綁定到該入參對象後,就會調用校驗框架根據註解聲明的校驗規則實施校驗
? Spring MVC 是通過對處理方法簽名的規約來保存校驗結果的:前一個表單/命令對象的校驗結果保存到隨後的入參中,這個保存校驗結果的入參必須是 BindingResult 或
Errors 類型,這兩個類都位於org.springframework.validation 包中
Spring MVC 就會實施校驗並將校驗結果保存在被校驗入參對象之後的 BindingResult 或Errors 入參中。
? 常用方法:
– FieldError getFieldError(String field)
– List<FieldError> getFieldErrors()
– Object getFieldValue(String field)
– Int getErrorCount()
內置的驗證約束註解如下表所示(摘自hibernate validator reference):
驗證註解 |
驗證的數據類型 |
說明 |
@AssertFalse |
Boolean,boolean |
驗證註解的元素值是false |
@AssertTrue |
Boolean,boolean |
驗證註解的元素值是true |
@NotNull |
任意類型 |
驗證註解的元素值不是null |
@Null |
任意類型 |
驗證註解的元素值是null |
@Min(value=值) |
BigDecimal,BigInteger, byte, short, int, long,等任何Number或CharSequence(存儲的是數字)子類型 |
[email protected] |
@Max(value=值) |
[email protected] |
[email protected] |
@DecimalMin(value=值) |
[email protected] |
驗證註解的元素值大於等於@ DecimalMin指定的value值 |
@DecimalMax(value=值) |
[email protected] |
驗證註解的元素值小於等於@ DecimalMax指定的value值 |
@Digits(integer=整數位數, fraction=小數位數) |
[email protected] |
驗證註解的元素值的整數位數和小數位數上限 |
@Size(min=下限, max=上限) |
字符串、Collection、Map、數組等 |
驗證註解的元素值的在min和max(包含)指定區間之內,如字符長度、集合大小 |
@Past |
java.util.Date, java.util.Calendar; Joda Time類庫的日期類型 |
驗證註解的元素值(日期類型)比當前時間早 |
@Future |
[email protected] |
驗證註解的元素值(日期類型)比當前時間晚 |
@NotBlank |
CharSequence子類型 |
驗證註解的元素值不為空(不為null、去除首位空格後長度為0),[email protected],@[email protected]首位空格 |
@Length(min=下限, max=上限) |
CharSequence子類型 |
驗證註解的元素值長度在min和max區間內 |
@NotEmpty |
CharSequence子類型、Collection、Map、數組 |
驗證註解的元素值不為null且不為空(字符串長度不為0、集合大小不為0) |
@Range(min=最小值, max=最大值) |
BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型 |
驗證註解的元素值在最小值和最大值之間 |
@Email(regexp=正則表達式, flag=標誌的模式) |
CharSequence子類型(如String) |
驗證註解的元素值是Email,也可以通過regexp和flag指定自定義的email格式 |
@Pattern(regexp=正則表達式, flag=標誌的模式) |
String,任何CharSequence的子類型 |
驗證註解的元素值與指定的正則表達式匹配 |
@Valid |
任何非原子類型 |
指定遞歸驗證關聯的對象; 如用戶對象中有個地址對象屬性,如果想在驗證用戶對象時一起驗證地址對象的話,[email protected] |
nnotation-driven