5:spring mvc 数据类型转换

  1. SpringMVC如何实现数据类型转换



    1、类型转换:首先表单数据(全部是字符串)通过WebDataBinder进行绑定到命令对象,内部通过Converter SPI实现;
    2、数据验证:使用JSR-303验证框架进行验证;
    3、格式化显示:在表单页面可以通过如下方式展示通过内部通过Converter SPI格式化的数据和错误信息;
     
  2. 数据类型转换

    SpringMVC数据转换包括两部分

    一、类型转换器:提供类型转换的实现支持;


    1、Converter:类型转换器,用于转换S 类型到T 类型,此接口的实现必须是线程安全的且可以被共享。
    package org.springframework.core.convert.converter;
    
        public interface Converter<S, T> { 
    
            // S 是源类型T 是目标类型T convert(S source); 
    
            // 转换S 类型的source 到T 目标类型的转换方法
    
        } 
    
    


    2、GenericConverter 和ConditionalGenericConverter:GenericConverter 接口实现能在多种类型之间进行转换,ConditionalGenericConverter 是有条件的在多种类型之间进行转换。GenericConverter:

    package org.springframework.core.convert.converter;
    
        public interface GenericConverter {
    
            Set<ConvertiblePair> getConvertibleTypes();
    
            Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);
    
        } 

    getConvertibleTypes:指定了可以转换的目标类型对;convert:在sourceType 和targetType 类型之间进行转换。
    ConditionalGenericConverter:
    package org.springframework.core.convert.converter;
    
        public interface ConditionalGenericConverter extends GenericConverter {
    
            boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType);
    
            
    
        }  
    matches:用于判断sourceType 和targetType 类型之间能否进行类型转换。
    3、ConverterFactory:工厂模式的实现,用于选择将一种S 源类型转换为R 类型的子类型T 的转换器的工厂接口。
    package org.springframework.core.convert.converter;
    
        public interface ConverterFactory<S, R> {
    
            <T extends R> Converter<S, T> getConverter(Class<T> targetType);
    
            //S:源类型;R 目标类型的父类型;T:目标类型,且是R 类型的子类型;
    
        }


    二、类型转换器注册器、类型转换服务:提供类型转换器注册支持,运行时类型转换API 支持,运行时类型转换API 支持。

    1、ConverterRegistry:类型转换器注册支持,可以注册/删除相应的类型转换器。

    可以注册:Converter 实现,GenericConverter 实现,ConverterFactory 实现。

    2、ConversionService:运行时类型转换服务接口,提供运行期类型转换的支持。

    Spring 提供了两个默认实现(其都实现了ConverterRegistry、ConversionService 接口):DefaultConversionService:默认的类型转换服务实现;DefaultFormattingConversionService:带数据格式化支持的类型转换服务实现,一般使用该服务实现即可。

     

  3. Spring内建的数据类型转换器
     

    一、标量转换器

    StringToBooleanConverterString----->Boolean
    true:true/on/yes/1;false:false/off/no/0
    ObjectToStringConverterObject----->String调用toString方法转换
    StringToNumberConverterFactoryString----->Number(如Integer、Long 等)
    NumberToNumberConverterFactoryNumber 子类型(Integer、Long、Double 等)<——> Number 子类型(Integer、Long、Double 等)
    StringToCharacterConverterString----->java.lang.Character取字符串第一个字符
    NumberToCharacterConverterjava.lang.Character——>Number 子类型(Integer、Long、Double 等)
    StringToEnumConverterFactoryString----->enum类型通过Enum.valueOf将字符串转换为需要的enum类型
    EnumToStringConverterenum类型----->String返回enum对象的name()
    StringToLocaleConverterString----->java.util.Local
    PropertiesToStringConverterjava.util.Properties----->String默认通过ISO-8859-1 解码
    StringToPropertiesConverterString----->java.util.Properties默认使用ISO-8859-1 编码


    二、集合、数组相关转换器

    类名说明
    ArrayToCollectionConverter任意S 数组---->任意T 集合(List、Set)
    CollectionToArrayConverter任意T 集合(List、Set)---->任意S 数组
    ArrayToArrayConverter任意S 数组<---->任意T 数组
    CollectionToCollectionConverter任意T 集合(List、Set)<---->任意T 集合(List、Set)即集合之间的类型转换
    MapToMapConverterMap<---->Map 之间的转换
    ArrayToStringConverter任意S 数组---->String 类型
    StringToArrayConverterString----->数组默认通过“,” 分割,且去除字符串的两边空格(trim)
    ArrayToObjectConverter任意S 数组---->任意Object 的转换(如果目标类型和源类型兼容,直接返回源对象;否则返回S 数组的第一个元素并进行类型转换)
    ObjectToArrayConverterObject----->单元素数组
    CollectionToStringConverter任意T 集合(List、Set)---->String 类型
    StringToCollectionConverterString----->集合(List、Set)默认通过“,” 分割,且去除字符串的两边空格(trim)
    CollectionToObjectConverter任意T 集合---->任意Object 的转换(如果目标类型和源类型兼容,直接返回源对象;否则返回S 数组的第一个元素并进行类型转换)
    ObjectToCollectionConverterObject----->单元素集合
  4. 自定义数据类型转换器

    一、StringToDateConverter:自定义String类型转Date类型的转换类;
    二、StringToPhoneNumberConverter:自定义String类型转PhoneNumberModel类型的转换类




    1、注册ConversionService 实现和自定义的类型转换器

    2、通过ConfigurableWebBindingInitializer 注册ConversionService

    3、注册ConfigurableWebBindingInitializer 到RequestMappingHandlerAdapter

    如果是使用的<mvc:annotation-drive>的方式,那么上面的第2和3步就不用做了,直接在<mvc:annotation-drive>里面配置conversion-service属性即可,示例:
    <mvc:annotation-driven conversion-service=“conversionService“ />

     

  5. 配置自定义的数据类型转换器

     
     
     

 

转载于:https://my.oschina.net/coder1234/blog/1553051

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值