Spring MVC通过反射机制对目标处理方法的签名进行分析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是DataBinder,运行机制如下:
1、SpringMVC主框架将ServletRequest对象及处理方法的入参对象实例传递给DataBinder。
2、DataBinder调用ConversionService组件进行数据类型转换、数据格式化等操作,将ServletRequest中的信息填充到入参对象中。
3、DataBinder调用Validator组件对已经绑定了请求消息数据的入参对象进行数据合法性校验。
4、最终生成数据绑定结果BindingResult对象。该对象既包括已完成数据绑定的入参对象,还包含相应的校验错误对象。
一、ConversionService
ConversionService是Spring类型转换体系的核心接口,可以利用ConversionServiceFactoryBean在Spring的上下文中定义一个ConversionService。Spring将自动识别出上下文中的ConversionService,并在Bean属性配置及SpringMVC处理方法入参绑定等场合使用它进行数据转换。
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"/>
该FactoryBean创建ConversionService内建的很多转换器,包括String、Number、Array、Collection、Map、Properties及Object之间的转换器。
也可以自定义转换器,但是需要实现3种不同的转换器接口,实现任意一个转化器接口都可以作为自定义转化器注册到ConversionServiceFactoryBean中:
1、Converter<\S,T>接口
将S类型的对象转换为T类型的对象
2、ConverterFactory<\S,R>接口
将一种类型的对象转换为另一种类型及其子类的对象。比如,将String类型转换为Number及Number子类(Integer/Long/Double等)对象。
3、GenericConverter接口
根据源对象及目标类对象所在宿主类的上下文信息进行类型转换工作。它有一个实现类ConditionalGenericConverter,有一个方法可以根据宿主类的上下文信息决定是否进行类型转换。
1、自定义一个转化器
//实现Converter<S,T>接口
public class StringToUserConverter implements Converter<String,User> {
public User convert(String source){
User user=new User();
if(source!=null){
String [] items=source.split(":");
user.setUserName(items[0]);
user.setPassword(items[1]);
}
return user;
}
}
2、在Spring上下文中装配该自定义的转换器
<!--该标签会默认创建RequestMappingHandlerMapping和RequestMappingHandlerAdapter-->
<!--也会默认创建ConversionService,也就是FormattingConversionServiceFactoryBean-->
<!--如果有自定义,会覆盖默认的。因为要使用自定义的ConversionService,需要显式定义一个ConversionService覆盖默认的设置-->
<mvc:annotation-driven conversion-service="conversionService" />
<!--converters属性可以接受Converter/ConverterFactory/GenericConverter/ConditionGenericConverter接口的实现类-->
<bean