在日常的web开发中,数据类型转换再常见不过了。通过http向服务器发送的数据都是字符串,但是不论是VO、BO还是DO都不可能只有字符串。
Spring是一个强大的集成框架,尤其是加入SpringMVC以后,所有类型转换器对于Spring来说就像“马云也需要吃米饭”一样,必不可少。
Spring提供了两种类型的类型转换器:
一种是Converter<S, T>
,另一种是Formatter<T>
。
这两种类型转换器的共同点是:都可以进行数据类型的转换(废话O(∩_∩)O),但两者大有不同。
1)Converter<S, T>
能将任意类型转成任意类型(只要你能做到!),从字面上来看也很容易明白吧,从S(Source)转成T(Target)。这个接口的签名是这样的
package org.springframework.core.convert.converter;
public interface Converter<S, T> {
T convert(S source);
}
它适用于系统的各个层面,Controller、Service、Dao、Util等等,因为它对你的任性做了很好的支持。
2)Formatter<T>
就不一样了,它严格限制了你的自由,只能从String转成T,是的,可以把他理解为Converter<S,T>
的子集,但是,但是才是重点,它被广泛应用在SpringMVC中,因为我们的浏览器太笨,它只会传递字符串,如果你能开发出一个支持Java对象的html-n,那我跪!
说了这么多废话,这两个东东到底怎么用呢?Come On!
首先,Converter<S, T>
闪亮登场。
1)编写一个实现了Converter<S, T>
接口的类,实现接口中的全部方法(记得要对你的任性负责哦),就像下面这样
public class StringToDateConverter implements Converter<String, Date>{
private Logger logger = Logger.getLogger(StringToDateConverter.class);
private String datePattern;
public StringToDateConverter(String datePattern){
this.datePattern = datePattern; System.out.println("instantiating...converter with pattern : " + datePattern);
}
@Override
public Date convert(String source) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
sdf.setLenient(false);
return sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
logger.info("date parse exception.");
}
return null;
}
}
2)然后,把他交给Spring统一管理。怎么交?我来教。
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.springmvc.test.convertor.StringToDateConverter">
<constructor-arg type="java.lang.String" value="MM-dd-yyyy"/>
</bean>
</list>
</property>
</bean>
你可以把ConversionServiceFactoryBean
理解成Spring大容器(大锅)里的一个小容器(小碗),大容器(大锅)用来管理系统对象,小碗用来成米饭(类型转换器)。
3)最后,把他加入到springmvc,如果你不打算在web层应用的话,请忽略。
<mvc:annotation-driven conversion-service="conversionService"/>
结束,还不是很复杂。
下面该Formatter<T>
表演了。
1)编写一个实现了Formatter<T>
接口的类。
public class DateFormatter implements Formatter<Date>{
private String datePattern;
private SimpleDateFormat dateFormat;
public DateFormatter(String datePattern){
this.datePattern = datePattern;
dateFormat = new SimpleDateFormat(datePattern);
dateFormat.setLenient(false);
}
@Override
public String print(Date object, Locale locale) {
return dateFormat.format(object);
}
@Override
public Date parse(String text, Locale locale) throws ParseException {
return dateFormat.parse(text);
}
}
2)然后,上面的差不多,就那个意思。
<bean id="conversionService2" class="org.springframework.formate.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<bean class="com.springmvc.test.formatter.DateFormatter">
<constructor-arg type="java.lang.String" value="MM-dd-yyyy"/>
</bean>
</property>
</bean>
但是要注意,FormattingConversionServiceFactoryBean
是另一个饭碗了o(╯□╰)o。
3)把他扔给springmvc使用
<mvc:annotation-driven conversion-service="conversionService2"/>
4)还有最后一步,不要忘记,添加类扫描。
<context:component-scan base-package="com.spirng.mvc.formatter"/>
Over…..