mvc:annotation-driven
<mvc:annotation-driven /> 會自動註冊java
RequestMappingHandlerMappingmvc
RequestMappingHandlerAdapter app
ExceptionHandlerExceptionResolver 三個bean。
• 還將提供如下支持:
– 支持使用 ConversionService 實例對錶單參數進行類型轉換
– 支持使用 @NumberFormat annotation、@DateTimeFormat註解完成數據類型的格式化
– 支持使用 @Valid 註解對 JavaBean 實例進行 JSR 303 驗證
– 支持使用 @RequestBody 和 @ResponseBody 註解框架
@InitBinder
• 由 @InitBinder 標識的方法,能夠對 WebDataBinder對象進行初始化。WebDataBinder 是 DataBinder 的子類,用於完成由表單字段到 JavaBean 屬性的綁定
• @InitBinder方法不能有返回值,它必須聲明爲void。
• @InitBinder方法的參spa
數一般是是 WebDataBinderhibernate
數據格式化
• 對屬性對象的輸入/輸出進行格式化,從其本質上講依然屬於 「類型轉換」 的範疇。
• Spring 在格式化模塊中定義了一個實現ConversionService 接口的FormattingConversionService 實現類,該實現類擴展了 GenericConversionService,所以它既具備類型轉換的功能,又具備格式化的功能
• FormattingConversionService 擁有一個FormattingConversionServiceFactroyBean 工廠類後者用於在 Spring 上下文中構造前者code
FormattingConversionServiceFactroyBean 內部已經註冊了 :
– NumberFormatAnnotationFormatterFactroy:支持對數字類型的屬性使用 @NumberFormat 註解
– JodaDateTimeFormatAnnotationFormatterFactroy:支持對日期類型的屬性使用 @DateTimeFormat 註解orm
日期格式化
對象
@DateTimeFormat 註解可對java.util.Date、java.util.Calendar、java.long.Long 時間類型進行標註:
– pattern 屬性:類型爲字符串。指定解析/格式化字段數據的模式,如:」yyyy-MM-dd hh:mm:ss」
– iso 屬性:類型爲 DateTimeFormat.ISO。指定解析/格式化字段數據的ISO模式,包括四種:ISO.NONE(不使用) -- 默認、ISO.DATE(yyyy-MM-dd) 、ISO.TIME(hh:mm:ss.SSSZ)、ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ)
– style 屬性:字符串類型。經過樣式指定日期時間的格式,由兩位字符組成,第一位表示日期的格式,第二位表示時間的格式:S:短日期/時間格式、M:中日期/時間格式、L:長日期/時間格式、F:完整日期/時間格式、-:忽略日期或時間格式blog
@DateTimeFormat(pattern="yyyy-MM-dd") private Date birth;
數值格式化
@NumberFormat 可對相似數字類型的屬性進行標註,它擁有兩個互斥的屬性:
– style:類型爲 NumberFormat.Style。用於指定樣式類型,包括三種:Style.NUMBER(正常數字類型)、Style.CURRENCY(貨幣類型)、 Style.PERCENT(百分數類型)
– pattern:類型爲 String,自定義樣式,如patter="#,###";
@NumberFormat(pattern="#,###,###.#") private Float salary;
數據校驗
JSR 303 是 Java 爲 Bean 數據合法性校驗提供的標準框架,它已經包含在 JavaEE 6.0 中 .
• JSR 303 經過在 Bean 屬性上標註相似於 @NotNull、@Max等標準的註解指定校驗規則,並經過標準的驗證接口對 Bean進行驗證
Hibernate Validator 擴展註解
• Hibernate Validator 是 JSR 303 的一個參考實現,除支持全部標準的校驗註解外,它還支持如下的擴展註解
1).如何校驗:
①. 使用 JSR 303 驗證標準
②. 加入 hibernate validator 驗證框架的 jar 包
③. 在 SpringMVC 配置文件中添加 <mvc:annotation-driven />
④. 須要在 bean 的屬性上添加對應的註解
⑤. 在目標方法 bean 類型的前面添加 @Valid 註解
2). 驗證出錯轉向到哪個頁面 ?
注意: 需校驗的 Bean 對象和其綁定結果對象或錯誤對象時成對出現的,它們之間不容許聲明其餘的入參
/*保存新添加的員工信息*/ @RequestMapping(value="/emp", method = RequestMethod.POST) public String save(@Valid Employee employee, BindingResult bindingResult, Map<String, Object> map) { System.out.println("add" + employee); if(bindingResult.getErrorCount() > 0){ System.out.println("出錯了"); for(FieldError error: bindingResult.getFieldErrors()){ System.out.println(error.getField() + ": " + error.getDefaultMessage()); } //若驗證出錯, 則轉向定製的頁面 map.put("departments", departmentDao.getDepartments()); return "input"; }
3). 在頁面上顯示錯誤
• Spring MVC 除了會將表單/命令對象的校驗結果保存到對應的 BindingResult 或 Errors 對象中外,還會將全部校驗結果保存到 「隱含模型」
• 即便處理方法的簽名中沒有對應於表單/命令對象的結果入參,校驗結果也會保存在 「隱含對象」 中。
• 隱含模型中的全部數據最終將經過 HttpServletRequest 的屬性列表暴露給 JSP 視圖對象,所以在 JSP 中能夠獲取錯誤信息
• 在 JSP 頁面上可經過 <form:errors path=「userName」>顯示錯誤消息