数据绑定流程

1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象
2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中
3. 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象
4. Spring MVC 抽取 BindingResult 中的入参对象和校验错误对象,将它们赋给处理方法的响应入参

Spring MVC 通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是 DataBinder,运行机制如下:

SpringMVC 数据转换 & 数据格式化 & 数据校验

数据转换

Spring MVC 上下文中内建了很多转换器,可完成大多数 Java 类型的转换工作。

自定义类型转换器

ConversionService 是 Spring 类型转换体系的核心接口。

可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService. Spring 将自动识别出IOC 容器中的 ConversionService,并在 Bean 属性配置及
Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器

<mvc:annotation-driven conversion-service=“conversionService”/> 会将自定义的 ConversionService 注册到Spring MVC 的上下文中

	<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>	
	
	<!-- 配置 ConversionService -->
	<bean 
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<ref bean="employeeConverter"/>
			</set>
		</property>	
	</bean>

Spring 支持的转换器

Spring 定义了 3 种类型的转换器接口,实现任意一个转换 器接口都可以作为自定义转换器注册到ConversionServiceFactroyBean 中:
Converter<S,T>:将 S 类型对象转为 T 类型对象
ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类
GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换

 1 @Component
 2 public class EmployeeConverter implements Converter<String, Employee> {
 3 
 4     @Override
 5     public Employee convert(String source) {
 6         if(source != null){
 7             String [] vals = source.split("-");
 8             //GG-gg@atguigu.com-0-105
 9             if(vals != null && vals.length == 4){
10                 String lastName = vals[0];
11                 String email = vals[1];
12                 Integer gender = Integer.parseInt(vals[2]);
13                 Department department = new Department();
14                 department.setId(Integer.parseInt(vals[3]));
15                 
16                 Employee employee = new Employee(null, lastName, email, gender, department);
17                 System.out.println(source + "--convert--" + employee);
18                 return employee;
19             }
20         }
21         return null;
22     }
23 
24 }
View Code

相关文章: