转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6832898.html
一:SpringMVC数据绑定机制
1:request到达SpringMVC框架时,框架会把request对象以及其映射的处理函数的参数实例,传递给 DataBinder;
2:DataBinder调用ConversionService组件,对request对象传过来的参数进行数据类型转换、数据格式化操作,然后把数据绑定到处理函数的参数实例;
3:然后调用Validator组件对绑定了值的参数对象进行数据校验,并生成数据绑定结果BindingResult。
4:SpringMVC抽取BindingResult中的函数参数对象以及校验结果对象,赋值给请求处理函数的相应参数。
二:数据转换
可以在SpringMVC的配置文件中,通过 org.springframework.context.support.ConversionServiceFactoryBean注册一个conversionService。SpringMVC在request对象中绑定的参数时,就会使用这个conversionService进行数据转换。
ConversionServiceFactoryBean默认内置了许多转换器,可以完成一般的数据类型转换,如:String类型参数转换为各种基本数据类型、包装类、Array、集合类等。
但是,稍微复杂的转换就不行了,比如:日期格式的字符串要求转换为Date类型,以及其他开发者自定义的格式的数据的转换。这个时候,可以自定义数据转换器,并注册到Spring中即可。
三:自定义数据转换器
实现Converter<S,T>接口:把S类型数据转换为T类型。
类中实现接口的唯一方法 convert(S sourse),该方法负责request参数中S类型对象的数据传进来,进行格式判断后,转换为T类型对象并返回。
public class ProcuctConverter implements Converter<String, Product>//把字符串提取,封装成为一个bean对象
{
public Product convert(String source)
{
if(source != null)
{
Product product = new Product();
String[] values = source.split("-");
if(values != null && values.length==4)
{
product.setName(values[0]);
product.setDescription(values[1]);
product.setPrice(Float.parseFloat(values[2]));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
product.setProductionDate(new Date());
System.out.println(source + "--converter"+product);
return product;
}
}
return null;
}
}
四:注册自定义数据转换器
有两种方式:
1:在springMVC配置文件中配置:
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">//注册自定义类型转换器到ConversionServiceFactoryBean的属性中
<property name="converters">
<set>
<bean class="路径.procuctConverter" p:成员变量名="注入变量值"(如果自定义类型转换器有全局变量,则通过配置进行注入值)/>
</set>
</property>
</bean> <mvc:annotation-driven conversion-service="conversionService" />//装配自定义类型转换器
2:如果希望在全局范围内(即:所以controller类都有效)使用自定义转换器,可以实现WebBindingInitializer接口,在实现类中实现initBinder方法把自定义类型转换器注册到全局范围。然后在springMVC配置文件中配置全局自定义转换器即可。
public class MyWebBindingInitializer implements WebBindingInitializer { public void initBinder(WebDataBinder binder, WebRequest request) { binder.registerCustomEditor(转换结果类型.class,new 自定义转换器(参数值));
}
}
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="路径.MyWebBindingInitializer"/>//配置自定义的全局转换器
</property>
</bean>
当使用了<mvc:annotation-driven />的时候,它会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean。
这时候第二种方式指定的全局属性编辑器就不会起作用了,解决办法是:手动的添加上面的配置,并把它们加在<mvc:annotation-driven/>的前面。
如果不生效,则将手动注册AnnotationMethodHandlerAdapter改为手动注册RequestMappingHandlerAdapter。