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

转载请注明原文地址: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

原文地址:https://www.cnblogs.com/ygj0930/p/6832898.html