SpringMVC資料轉換
阿新 • • 發佈:2018-11-11
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。並設定相應的屬性。而使用基於註解方式則簡便許多。