1. 程式人生 > >SpringMVC資料轉換

SpringMVC資料轉換

SpringMVC支援三種方式轉換資料,分別是Converter,Formatter和基於註解方式。
1. Converter
可以將一種型別轉為另外一種型別(如將日期轉字串)。若想建立 Converter,必須實現org.springframework.core.convert.converter.Converter這個介面。這個介面的宣告如下:

public interface converter<S,T>//s為源型別,T為目標型別

1.1 實現Converter介面

/**
*@since 1.8+
*/
public class StringToLocaleDateConverter
implements Converter<String,LocalDate> {
//將String轉為LocalDate型別 private String datePattern; public StringToLocaleDateConverter(String datePattern){ this.datePattern=datePattern; } public LocalDate convert(String s) { try { return LocalDate.parse(s, DateTimeFormatter.ofPattern(datePattern)); }catch
(DateTimeParseException e){ throw new IllegalArgumentException("invalid date format.Please use this pattern\""+datePattern+"\""); } } }

1.2 spring-context.xml檔案的編寫

//配置conversionService
<mvc:annotation-driven conversion-service="conversionService"/>//必加
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">//應用程式中所使用的所有定製的Converter <list> <bean class="common.StringToLocaleDateConverter"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd"/> </bean> </list> </property> </bean>

2. Formatter
將String型別轉為另外一種型別,更適合Web程式。
建立Formatter,需要實現org.springframework.format.Formatter介面。介面的生命如下:

public interface Formatter<T>//T為轉換後的目標型別

該介面有parse和print兩個方法,其中parse用於資料轉換,print用於資料格式化。

T parse(String text,java.util.Locale locale)
String print(T object,java.util.Locale locale)

2.1 實現Format介面

/**
*@since 1.8+
*/
 public class StringToLocalDateFormatter implements Formatter<LocalDate> {
    private String datePartten;
    private DateTimeFormatter formatter;
    public StringToLocalDateFormatter(String datePartten){
        this.datePartten=datePartten;
        formatter=DateTimeFormatter.ofPattern(datePartten);
    }
    public LocalDate parse(String text, Locale locale) throws ParseException {
        try{
            return LocalDate.parse(text,DateTimeFormatter.ofPattern(datePartten));
        }catch(DateTimeParseException e){
            throw new IllegalArgumentException("Invalid date format.Please user this pattern \""+datePartten+"\"");
        }
    }
    public String print(LocalDate object, Locale locale) {
        return object.format(formatter);
    }
}

2.2 spring-context.xml檔案的編寫

<context:component-scan base-package="common"/>//小心遺忘
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatters">
        <set>//這裡是set不是list
            <bean class="common.StringToLocalDateFormatter">
                <constructor-arg type="java.lang.String" value="yyyy-MM-dd"/>
            </bean>
        </set>
    </property>
</bean>

1.3 基於註解
在編寫JavaBean時,可以在屬性前加上註解,而不用配置其他屬性。

public class User{
@DateTimeFormat(pattern="yyyy-MM-dd")//可以將"1999-11-10"的字串轉到Date型別的birthday屬性中
private Date birthday;
@NumberFormat(pattern="#,###.##")//可以將4,5000.00的字串轉換為long型別的salary屬性中
private long salary;
/*Getter and Setter*/
}

總結:使用Converter和Formatter時,要實現相應的介面,同時要在spring配置檔案中配置conversionService屬性,其中Converter對應的載入類為org.springframework.context.support.ConversionServiceFactoryBean,而Formatter對應的類為org.springframework.format.support.FormattingConversionServiceFactoryBean。並設定相應的屬性。而使用基於註解方式則簡便許多。