• 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

  • 相关阅读:
    Internet上的音频/视频概述
    防火墙
    数据链路层安全
    两类密码体制
    Windows Terminal 美化分享
    2019.11.14 启用了FlagCounter
    检测一个App是不是有UWP血统
    UWP 记一次x64平台无法单步调试的bug
    UWP 使用FontIcon
    Git和Github简单教程
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6832898.html
Copyright © 2020-2023  润新知