您的位置:首页 > 编程语言 > Java开发

SpringMVC学习笔记五:使用converter进行参数数据转换

2017-05-09 21:52 477 查看
转载请注明原文地址: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐