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。并设置相应的属性。而使用基于注解方式则简便许多。