通過 SPRingMVC 的表單標簽可以實現將模型數據中的屬性和 HTML 表單元素相綁定,以實現表單數據更便捷編輯和表單值的回顯
<%@ taglibprefix="form"uri="http://www.springframework.org/tags/form"%>
一般情況下,通過 GET 請求獲取表單頁面,而通過POST 請求提交表單頁面,因此獲取表單頁面和提交表單頁面的 URL是相同的。只要滿足該最佳條件的契約,<form:form>標簽就無需通過 action 屬性指定表單提交的 URL
可以通過 modelAttribute 屬性指定綁定的模型屬性,若沒有指定該屬性,則默認從 request 域對象中讀取command 的表單 bean,如果該屬性值也不存在,則會發生錯誤。

優雅的 REST 風格的資源URL 不希望帶 .html 或 .do 等后綴
若將DispatcherServlet 請求映射配置為 /,
則 Spring MVC 將捕獲 WEB 容器的所有請求, 包括靜態資源的請求,SpringMVC 會將他們當成一個普通請求處理,
因找不到對應處理器將導致錯誤。
在 SpringMVC 的配置文件中配置<mvc:default-servlet-handler/>
<!-- 解決靜態資源 將在 SpringMVC 上下文中定義一個DefaultServletHttpRequestHandler, 它會對進入 DispatcherServlet 的請求進行篩查,如果發現是沒有經過映射的請求, 就將該請求交由 WEB 應用服務器默認的 Servlet 處理,如果不是靜態資源的請求, 才由DispatcherServlet 繼續處理 一般 WEB 應用服務器默認的 Servlet 的名稱都是 default。若所使用的WEB 服務器 的默認 Servlet 名稱不是 default,則需要通過 default-servlet-name 屬性顯式指定 --> <mvc:default-servlet-handler/> <mvc:annotation-driven></mvc:annotation-driven>3.數據轉換
(1)數據綁定流程
(2)內置轉換
(3)自定義類型轉換器—了解
ConversionService是 Spring 類型轉換體系的核心接口。
可以利用 ConversionServiceFactoryBean在 Spring 的IOC容器中定義一個ConversionService. Spring 將自動識別出IOC 容器中的 ConversionService,并在 Bean 屬性配置及SpringMVC 處理方法入參綁定等場合使用它進行數據的轉換
可通過 ConversionServiceFactoryBean的 converters 屬性注冊自定義的類型轉換器
<form action="testConversionServiceConverer" method="POST"><!-- lastname-email-gender-department.id例如: GG-gg@QQ.com-0-105--> 自定義轉換器:Employee: <input type="text"name="employee"/> <input type="submit"value="Submit"/> </form>@Controllerpublic class SpringMVCTest { @Autowired private EmployeeDao employeeDao; @RequestMapping("/testConversionServiceConverer") public String testConverter(@RequestParam("employee") Employee employee){ System.out.println("save" + employee); employeeDao.save(employee); return "redirect:/emps"; }}Spring定義了 3 種類型的轉換器接口,實現任意一個轉換器接口都可以作為自定義轉換器注冊到ConversionServiceFactroyBean 中:
Converter<S,T>:將 S 類型對象轉為 T 類型對象
ConverterFactory:將相同系列多個 “同質” Converter封裝在一起。如果希望將一種類型的對象轉換為另一種類型及其子類的對象(例如將String 轉換為Number 及Number 子類
(Integer、Long、Double 等)對象)可使用該轉換器工廠類
GenericConverter:會根據源類對象及目標類對象所在的宿主類中的上下文信息進行類型轉換
/** * 自定義類型轉換器 * @author Administrator * */@Componentpublic class EmployeeConverter implements Converter<String,Employee>{ @Override public Employee convert(String source) { if(source != null){ String [] vals = source.split("-"); //GG-gg@qq.com-0-105 if(vals != null && vals.length == 4){ String lastName = vals[0]; String email = vals[1]; Integer gender = Integer.parseInt(vals[2]); Department department = new Department(); department.setId(Integer.parseInt(vals[3])); Employee employee = new Employee(null, lastName,email, gender, department); System.out.println(source + "--convert--" + employee); return employee; } } return null; } }<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 配置 ConversionService --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="employeeConverter"/> </set> </property> </bean>(4) 關于 mvc:annotation-driven
<mvc:annotation-driven /> 會自動注冊RequestMappingHandlerMapping
、RequestMappingHandlerAdapter與ExceptionHandlerExceptionResolver三個bean。
還將提供以下支持:
支持使用 ConversionService實例對表單參數進行類型轉換
支持使用 @NumberFormatannotation、@DateTimeFormat注解完成數據類型的格式化
支持使用 @Valid注解對 javaBean 實例進行 JSR 303 驗證
支持使用 @RequestBody和 @ResponseBody注解
(5) @InitBinder
由 @InitBinder 標識的方法?,可以對 WebDataBinder 對象進行初始化。WebDataBinder 是 DataBinder 的子類,用于完成由表單字段到 JavaBean 屬性的綁定
@InitBinder方法不能有返回值,它必須聲明為void? 。
@InitBinder方法的參數通常是是WebDataBinder
4. 數據格式化
首先創建:<mvc:annotation-driven/>
<mvc:annotation-driven></mvc:annotation-driven>
(1) 日期格式化
(2)數值格式化
5.數據檢驗
(1) JSR 303
JSR 303 是 Java 為 Bean 數據合法性校驗提供的標準框架,它已經包含在 JavaEE 6.0 中 .
JSR 303 通過在 Bean屬性上標注類似于 @NotNull、@Max等標準的注解指定校驗規則,并通過標準的驗證接口對 Bean 進行驗證
(2) Hibernate Validator 擴展注解
Hibernate Validator 是 JSR 303 的一個參考實現,除支持所有標準的校驗注解外,它還支持以下的擴展注解
(3) 如何校驗 ? 注解 ?
①. 使用 JSR 303 驗證標準
②. 加入 hibernate validator 驗證框架的 jar 包
③. 在 SpringMVC 配置文件中添加 <mvc:annotation-driven />
④. 需要在 bean 的屬性上添加對應的注解
⑤. 在目標方法 bean 類型的前面添加@Valid 注解
(4) 驗證出錯
注意: 需校驗的 Bean 對象和其綁定結果對象或錯誤對象時成對出現的,它們之間不允許聲明其他的入參
Errors接口提供了獲取錯誤信息的方法,如getErrorCount() 或getFieldErrors(String field) BindingResult 擴展了 Errors 接口
@RequestMapping(value="emp" , method=RequestMethod.POST) public String save(@Valid Employee employee ,BindingResult result ,Map<String, Object> map){
if(result.getErrorCount()> 0){ System.out.println("出錯了!"); for(FieldError error:result.getFieldErrors()){ System.out.println(error.getField() + ":" +error.getDefaultMessage()); } //若驗證出錯, 則轉向定制的頁面 map.put("departments", departmentDao.getDepartments()); return "input"; }(5) 錯誤消息 ? 如何顯示
(6) 提示消息的國際化—了解
每個屬性在數據綁定和數據校驗發生錯誤時,都會生成一個對應的 FieldError 對象。
當一個屬性校驗失敗后,校驗框架會為該屬性生成 4 個消息代碼,這些代碼以校驗注解類名為前綴,結合modleAttribute、屬性名及屬性類型名生成多個對應的消息代碼:例如 User 類中的 passWord 屬性標準了一個 @Pattern 注解,當該屬性值不滿足 @Pattern 所定義的規則時, 就會產生以下 4個錯誤代碼:
Pattern.user.password ;Pattern.password ;
Pattern.java.lang.String ;Pattern
當使用 Spring MVC 標簽顯示錯誤? 消息時, Spring MVC 會查看WEB 上下文是否裝配了對應的國際化消息,如果沒有,則顯示默認的錯誤消息,否則使用國際化消息。
若數據類型轉換或數據格式轉換時發生錯誤,或該有的參數不存在,或調用處理方法時發生錯誤,都會在隱含模型中創建錯誤消息。其錯誤代碼前綴說明如下:
注冊國際化資源文件
<!-- 配置國際化資源文件 --><bean id="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename"value="i18n"></property> </bean>源代碼文件:http://download.csdn.net/detail/qq_26553781/9755197
新聞熱點
疑難解答