Spring学习笔记-类型转换器

在日常的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…..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值