zoukankan      html  css  js  c++  java
  • springmvc(3)--数据类型转换

    springmvc 配置 中conversionService可以配置类型转换,springmvc 参数绑定 中各种绑定方式和注解就是使用的这些转换器

    一、先看下spring提供的内建类型转换器

    • 第一组:标量转换器
    1:StringToBooleanConverter :String----->Boolean
    如:true:true/on/yes/1; false:false/off/no/0
     
    2:ObjectToStringConverter :Object----->String ,调用toString方法转换
     
    3:StringToNumberConverterFactory :String----->Number(如Integer、Long等)
     
    4:NumberToNumberConverterFactory :Number子类型(Integer、Long、Double等)<——> Number子类型(Integer、Long、Double等)
     
    5:StringToCharacterConverter :String----->java.lang.Character,取字符串第一个字符
     
    6:NumberToCharacterConverter :Number子类型(Integer、Long、Double等)——> java.lang.Character
     
    7:CharacterToNumberFactory :java.lang.Character ——>Number子类型(Integer、Long、Double等)
     
    8:StringToEnumConverterFactory :String----->enum类型,通过Enum.valueOf将字符串转换为需要的enum类型
     
    9:EnumToStringConverter :enum类型----->String,返回enum对象的name()值
     
    10:StringToLocaleConverter :String----->java.util.Local
     
    11:PropertiesToStringConverter :java.util.Properties----->String,默认通过ISO-8859-1解码
     
    12:StringToPropertiesConverter :String----->java.util.Properties,默认使用ISO-8859-1编码
    • 第二组:集合、数组相关转换器
    1:ArrayToCollectionConverter :任意S数组---->任意T集合(List、Set)
     
    2:CollectionToArrayConverter :任意T集合(List、Set)---->任意S数组
     
    3:ArrayToArrayConverter :任意S数组<---->任意T数组
     
    4:CollectionToCollectionConverter :任意T集合(List、Set)<---->任意T集合(List、Set),即集合之间的类型转换
     
    5:MapToMapConverter :Map<---->Map之间的转换
     
    6:ArrayToStringConverter :任意S数组---->String类型
     
    7:StringToArrayConverter :String--->数组,默认“,”分割,且去除字符串的两边空格
     
    8:ArrayToObjectConverter :任意S数组---->任意Object的转换,(如果目标类型和源类型兼容,直接返回源对象;否则返回S数组的第一个元素并进行类型转换)
     
    9:ObjectToArrayConverter :Object----->单元素数组
     
    10:CollectionToStringConverter :任意T集合(List、Set)---->String类型
     
    11:StringToCollectionConverter :String----->集合(List、Set),默认通过“,”分割,且去除字符串的两边空格(trim)
     
    12:CollectionToObjectConverter :任意T集合---->任意Object的转换,(如果目标类型和源类型兼容,直接返回源对象;否则返回S数组的第一个元素并进行类型转换)
     
    13:ObjectToCollectionConverter :Object----->单元素集合
    • 第三组:默认转换器,以上转换器不能转换时调用
    1:ObjectToObjectConverter :Object(S)----->Object(T),首先尝试valueOf进行转换、没有则尝试new 构造器(S)
     
    2:IdToEntityConverter :Id(S)----->Entity(T),查找并调用public static T find[EntityName](S)获取目标对象,EntityName是T类型的简单类型
     
    3:FallbackObjectToStringConverter :Object----->String,ConversionService作为恢复使用,即其他转换器不能转换时调用(执行对象的toString()方法)
     
    这些转换器在<mvc:annotation-driven />时就自动注册了,所以不需关心
    二、自定义转换器
    • 在Controller范围,使用@InitBinder来注册customer propertyEditor
    @InitBinder
        public void initBinder(WebDataBinder binder) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            dateFormat.setLenient(false);
            binder.registerCustomEditor(Date.class, new CustomDateEditor(
                    dateFormat, false));
        }

    注册"yyyy-MM-dd"日期格式的转换器

    • 实现WebBindingInitializer 接口来实现全局注册
    public class CustomerBinding implements WebBindingInitializer {
        @Override
        public void initBinder(WebDataBinder binder, WebRequest request) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            dateFormat.setLenient(false);
            binder.registerCustomEditor(Date.class, new CustomDateEditor(
                    dateFormat, false));
    
        }
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="webBindingInitializer">
                <bean class="springtry.web.util.MyWebBindingInitializer" />
            </property>
    </bean>
    • 使用conversion-service来注册自定义的converter,同样是全局范围
    public class MyCustomerConverter implements Converter<String, Date> {
        @Override
        public Date convert(String source) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            dateFormat.setLenient(false);
            try {
                return dateFormat.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    <mvc:annotation-driven conversion-service="conversionService" />
    
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <property name="converters">
                <set>
                     <bean class="springtry.web.util.MyCustomerConverter" />
                </set>
            </property>
        </bean>

    三、着重讲下@RequestBody使用的转换器

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <ref bean="mappingJacksonHttpMessageConverter" /><!--json转换器-->
                </list>
            </property>
        </bean>
        <bean id="mappingJacksonHttpMessageConverter"
              class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="supportedMediaTypes"><!--response的Content-Typ-->
                <list>
                    <value>text/html;charset=UTF-8</value><!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
                    <value>application/json;charset=UTF-8</value>
                </list>
            </property>
        </bean>

    默认的messageConverters包含了以下几种

    • ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
    • StringHttpMessageConverter:   负责读取字符串格式的数据和写出二进制格式的数据;
    • ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据; 
    • FormHttpMessageConverter:       负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据; 
    • MappingJackson2HttpMessageConverter:  负责读取和写入json格式的数据;
    • SouceHttpMessageConverter:                   负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
    • Jaxb2RootElementHttpMessageConverter:  负责读取和写入xml 标签格式的数据;
    • AtomFeedHttpMessageConverter:              负责读取和写入Atom格式的数据;
    • RssChannelHttpMessageConverter:           负责读取和写入RSS格式的数据;
     根据Request对象header部分的Content-Type类型,逐一匹配合适的HttpMessageConverter来读取数据
     
     
     
     
     
  • 相关阅读:
    文件内容排名算法,输入排名函数,返回排名后的文件名
    线段树做大数据排序
    给字符排序-基类排序二分查找-JavaScript
    后缀数组、名次数组-JavaScript
    二分查找法、二分去重排序法,返回最接近的位置和实际位置
    用四叉树对图像分类,获取tag和key
    Linux显示所在Git分支
    Linux中设置Git显示颜色
    屏蔽网页广告
    tf.add_to_collection,tf.get_collection简介
  • 原文地址:https://www.cnblogs.com/yhzh/p/5425549.html
Copyright © 2011-2022 走看看