SpringMVC数据绑定的流程
Spring MVC数据绑定流程
SpringMVC将ServletRequest对象及目标方法的形参实例传给WebDataBinderFactory实例,以创建DataBinder实例对象。DataBinder调用装配在SpringMVC上下文中的ConversionService组件进行类型转换和数据格式化工作,将Servlet请求信息填充到形参对象中。调用Validator组件对已经绑定了请求信息的形参对象进行数据有效性验证,并最终生成数据绑定结果BindingData对象。SpringMVC抽取BindingResult中的形参对象和校检错误对象,将他们赋给处理方法的相应参数。
Spring支持的转换器
Spring定义了3种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactoryBean中。 Converter<S,T>:将S类型转换为T类型。 ConverterFactory:将相同系列的多个“同质”Converter封装在一起,如果希望一种类型转换成另一种类型及其子类对象(例如String转换为Number及Number的子类(Integer,Long,Double等)),可以使用该转换器工厂。 GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。
配置xml
//自定义类型转换器对象
<bean id="myDateConverter" class="com.znsd.springmvc.converter.DateConverter"></bean>
<bean id="myconverter" class="org.springframework.context.support.ConversionServiceFactoryBean">
//name里的值是固定的
<property name="converters">
<set>
//引用自定义类型转换器对象
<ref bean="myDateConverter"/>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="myconverter" />
<mvc:default-servlet-handler/>
添加自定义类型转换器
当碰到一些特殊场合,有可能需要我们自己定义类型转换器。
@Component
public class DateConverter implements Converter<String, Date> {
@Override
public Date
convert(String text
) {
Date date
= null
;
try {
if (text
.contains("-")) {
SimpleDateFormat sf
= new SimpleDateFormat("yyyy-MM-dd");
date
= sf
.parse(text
);
} else {
SimpleDateFormat sf
= new SimpleDateFormat("dd/MM/yyyy");
date
= sf
.parse(text
);
}
} catch (Exception e
) {
e
.printStackTrace();
}
return date
;
}
}
这个类会在执行操作之前获取到值转换成你所需要的格式和类型。