您的位置:首页 > 编程语言 > Java开发

Spring学习笔记-类型转换器

2015-08-07 10:31 351 查看
在日常的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…..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: