在SpringMvc中會未來自web頁面的請求和響應數據與controller中對應的處理方法的入參進行綁定,即數據綁定。流程以下:html
-1.SpringMvc主框架將ServletRequest對象及目標方法的入參實例傳遞給WebDataBinderFactory實例,以建立DataBinder實例對象java
-2.DataBinder對象調用裝配在SpringMvc上下文中的ConversionService組件進行數據類型轉換,數據格式化工做,將Servlet中的請求信息填充到入參對象中。web
-3.調用Validator組件對已經綁定了請求消息的入參對象進行數據合法性校驗,並最終生成數據綁定結果BindingData對象spring
-4.SpringMvc抽取BindingResult中的入參對象和校驗錯誤對象,將它們賦給處理方法的相應入參。spring-mvc
總結起來:大體流程是 綁定(bindingResult)--》數據轉換(conversionService)--》校驗(validators)mvc
數據轉換app
SpringMvc上下文中內建了不少轉換器,能夠完成大多數Java類型轉換工做。可是若是就要轉換成咱們自定義的類型時,那麼咱們就要自定義類型轉換器,並將其加入到conversionService中去,conversionService中包含了不少SpringMvc內建的轉換器。框架
ConversionService是SpringMvc類型轉換體系的核心接口,能夠利用ConversionServiceFactoryBean在Spring的IOC容器中定義一個ConversionService,Spring將自動識別出IOC容器中的ConversionService,並在bean屬性配置及SpringMvc處理方法入參綁定等場合使用它進行數據轉換。dom
首先,定義一個轉換器:jsp
public class Department { private Integer id; private String departmentName; ........... }
public class Employee { private Integer id; private String name; private String email; private Integer gender; private Department department; private Date birth; private double salary; ...... }
package com.seven.converts; import com.seven.domain.Department; import com.seven.domain.Employee; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; /** * Created by hu on 2016/4/3. */ @Component //該類的主要目的是將字符串轉換爲一個Employee對象 public class EmployeeConverts implements Converter<String,Employee> { @Override /* * source就是前臺web頁面傳遞過來的字符串 * 如:gg-gg@qq.com-0-105 姓名-郵件-性別-部門ID * */ public Employee convert(String source) { if(source!=null){ String[] vals=source.split("-"); //得到僱員的姓名 String name=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,department,gender,email,name); return employee; } //若是字符串爲空,就不生成僱員對象 return null; } }
在SpringMvc的配置文件中配置轉換器:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置自動掃描的包--> <context:component-scan base-package="com.seven"></context:component-scan> <!--配置視圖解析器,將視圖邏輯名解析爲/WEB-INF/pages/<viewName>.jsp--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!--將自定義的轉換器加入到框架中--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.seven.converts.EmployeeConverts"/> </set> </property> </bean> <mvc:annotation-driven/> <mvc:default-servlet-handler/> </beans>
Spring支持三種類型的轉換器接口,實現任意一個轉換器接口均可以做爲自定義轉換器註冊ConversionServiceFactoryBean中:
-Converter<S,T>:將S類型的對象轉爲T類型對象
-ConverterFactory:將相同系列多個"同質"Converter封裝在儀器,若是但願將一種類型的對象轉換爲一種類型及其子類的對象(例如將String轉化爲Number及Number的子類)
-GenericConverter:會根據源類對象與目標類對象所在的宿主類中的上下文信息進行類型轉換。<mvc:annotation-driven conversion-service="conversionService"/>會將自定義的ConversionService註冊到SpringMvc的上下文中去。
關於mvc:annotation-driven
<mvc:annotation-driven/>會自動註冊ReuqestMappingHandlerMapping、ReuqestMappingHandlerHandler、ExceptionHanderExceptionResolver三個bean。還提供如下支持:
-支持使用ConversionService實例對錶單參數進行類型轉換
-支持使用@NumberFormat annotation @DateTimeFormat 註解完成數據類型的格式化
-支持使用@Valid註解對JavaBean實例進行JSR303驗證
-支持使用@RequestBody 和@ResponseBody註解