SpringMvc之資料繫結流程
在SpringMvc中會將來自web頁面的請求和響應資料與controller中對應的處理方法的入參進行繫結,即資料繫結。流程如下:
-1.SpringMvc主框架將ServletRequest物件及目標方法的入參例項傳遞給WebDataBinderFactory例項,以建立DataBinder例項物件
-2.DataBinder物件呼叫裝配在SpringMvc上下文中的ConversionService元件進行資料型別轉換,資料格式化工作,將Servlet中的請求資訊填充到入參物件中。
-3.呼叫Validator元件對已經綁定了請求訊息的入參物件進行資料合法性校驗,並最終生成資料繫結結果BindingData物件
-4.SpringMvc抽取BindingResult中的入參物件和校驗錯誤物件,將它們賦給處理方法的相應入參。
總結起來:大致流程是 繫結(bindingResult)--》資料轉換(conversionService)--》校驗(validators)
資料轉換
SpringMvc上下文中內建了很多轉換器,可以完成大多數Java型別轉換工作。但是如果就要轉換成我們自定義的型別時,那麼我們就要自定義型別轉換器,並將其加入到conversionService中去,conversionService中包含了很多SpringMvc內建的轉換器。
ConversionService是SpringMvc型別轉換體系的核心介面,可以利用ConversionServiceFactoryBean在Spring的IOC容器中定義一個ConversionService,Spring將自動識別出IOC容器中的ConversionService,並在bean屬性配置及SpringMvc處理方法入參繫結等場合使用它進行資料轉換。
首先,定義一個轉換器:
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頁面傳遞過來的字串
* 如:[email protected] 姓名-郵件-性別-部門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註解