5:spring mvc 數據類型轉換

  1. SpringMVC如何實現數據類型轉換



    一、類型轉換:首先表單數據(所有是字符串)經過WebDataBinder進行綁定到命令對象,內部經過Converter SPI實現;
    二、數據驗證:使用JSR-303驗證框架進行驗證;
    三、格式化顯示:在表單頁面能夠經過以下方式展現經過內部經過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 目標類型的轉換方法
    
        } 


    二、GenericConverter 和ConditionalGenericConverter:GenericConverter 接口實現能在多種類型之間進行轉換,ConditionalGenericConverter 是有條件的在多種類型之間進行轉換。GenericConverter:java

    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 類型之間可否進行類型轉換。
    三、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 類型的子類型;
    
        }


    2、類型轉換器註冊器、類型轉換服務:提供類型轉換器註冊支持,運行時類型轉換API 支持,運行時類型轉換API 支持。

    一、ConverterRegistry:類型轉換器註冊支持,能夠註冊/刪除相應的類型轉換器。

    能夠註冊:Converter 實現,GenericConverter 實現,ConverterFactory 實現。

    二、ConversionService:運行時類型轉換服務接口,提供運行期類型轉換的支持。

    Spring 提供了兩個默認實現(其都實現了ConverterRegistry、ConversionService 接口):DefaultConversionService:默認的類型轉換服務實現;DefaultFormattingConversionService:帶數據格式化支持的類型轉換服務實現,通常使用該服務實現便可。

     

  3. Spring內建的數據類型轉換器
     

    1、標量轉換器spring

    StringToBooleanConverter String----->Boolean
    true:true/on/yes/1;false:false/off/no/0
    ObjectToStringConverter Object----->String調用toString方法轉換
    StringToNumberConverterFactory String----->Number(如Integer、Long 等)
    NumberToNumberConverterFactory Number 子類型(Integer、Long、Double 等)<——> Number 子類型(Integer、Long、Double 等)
    StringToCharacterConverter String----->java.lang.Character取字符串第一個字符
    NumberToCharacterConverter java.lang.Character——>Number 子類型(Integer、Long、Double 等)
    StringToEnumConverterFactory String----->enum類型經過Enum.valueOf將字符串轉換爲須要的enum類型
    EnumToStringConverter enum類型----->String返回enum對象的name()
    StringToLocaleConverter String----->java.util.Local
    PropertiesToStringConverter java.util.Properties----->String默認經過ISO-8859-1 解碼
    StringToPropertiesConverter String----->java.util.Properties默認使用ISO-8859-1 編碼


    2、集合、數組相關轉換器數組

    類名 說明
    ArrayToCollectionConverter 任意S 數組---->任意T 集合(List、Set)
    CollectionToArrayConverter 任意T 集合(List、Set)---->任意S 數組
    ArrayToArrayConverter 任意S 數組<---->任意T 數組
    CollectionToCollectionConverter 任意T 集合(List、Set)<---->任意T 集合(List、Set)即集合之間的類型轉換
    MapToMapConverter Map<---->Map 之間的轉換
    ArrayToStringConverter 任意S 數組---->String 類型
    StringToArrayConverter String----->數組默認經過「,」 分割,且去除字符串的兩邊空格(trim)
    ArrayToObjectConverter 任意S 數組---->任意Object 的轉換(若是目標類型和源類型兼容,直接返回源對象;不然返回S 數組的第一個元素並進行類型轉換)
    ObjectToArrayConverter Object----->單元素數組
    CollectionToStringConverter 任意T 集合(List、Set)---->String 類型
    StringToCollectionConverter String----->集合(List、Set)默認經過「,」 分割,且去除字符串的兩邊空格(trim)
    CollectionToObjectConverter 任意T 集合---->任意Object 的轉換(若是目標類型和源類型兼容,直接返回源對象;不然返回S 數組的第一個元素並進行類型轉換)
    ObjectToCollectionConverter Object----->單元素集合
  4. 自定義數據類型轉換器

    1、StringToDateConverter:自定義String類型轉Date類型的轉換類;
    2、StringToPhoneNumberConverter:自定義String類型轉PhoneNumberModel類型的轉換類安全




    一、註冊ConversionService 實現和自定義的類型轉換器

    二、經過ConfigurableWebBindingInitializer 註冊ConversionService

    三、註冊ConfigurableWebBindingInitializer 到RequestMappingHandlerAdapter

    若是是使用的<mvc:annotation-drive>的方式,那麼上面的第2和3步就不用作了,直接在<mvc:annotation-drive>裏面配置conversion-service屬性便可,示例:
    <mvc:annotation-driven conversion-service=「conversionService「 />

     

  5. 配置自定義的數據類型轉換器

         
相關文章
相關標籤/搜索