java建一个conversion_Spring数据转换(一)--ConversionService

一般情况下MVC中的V在用户的客户端,而C则在服务端,当客户端向服务端提交数据时,不能再以java中的对象形式进行传输了,这时候就需要序列化和反序列化来帮助实现了。in this blog, 我们着重介绍一下springMVC中的数据转换。ConversionService是类型转换的核心接口,而ConversionServiceFactoryBean提供了一个创建ConversionService的工厂

SpringMVC中主要有3种数据转换的实现方式,下面我将一一介绍。

Converter

Spring在convert.converter中定义了3中类型的转换器接口,实现其中任何一个接口,然后将其注入到ConversionServiceFactoryBean当中就可以使用。

Converter,是Spring中最简单的接口,该接口中只有一个方法:T convert(S source)。该方法负责将S类型的对象转换为T类型的对象。

ConverterFactory 如果希望将一种类型的对象转换为另一种类型及其子类对象,比如将String 转换为Number以及Number的子类Integer,Double等类型,就需要一系列的Converter。ConverterFactory接口的作用就是将相同系列多个Converter封装在一起,该接口中只有一个方法:Converter getConverter(Class targetType)。其中S为转换的源类型,R为目标类型的基类,T为R的子类,即为要转换目标类。

GenericConverter接口会根据源类对象以及目标对象的上下文信息进行类型转换。

下面以Converter接口为例讲解其使用方法,假设定义了domain类User,其有一个Date 类型的成员变量birthday。

public class User implements Serializable{

private String loginname;

private Date birthday;

public User() {

super();

}

public String getLoginname() {

return loginname;

}

public void setLoginname(String loginname) {

this.loginname = loginname;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

@Override

public String toString() {

return "User [loginname=" + loginname + ", birthday=" + birthday + "]";

}

}

当客户端向服务端Controller发送User对象时,最常用的序列化方法就是拼接成json串,那么birthDay转换为String类型才会传到服务端。而在服务端就需要正确的转换器将String类型的birthDay转换为Date类型的。这时候我们就要编写一个Converter了

public class StringToDateConverter implements Converter{

// 日期类型模板:如yyyy-MM-dd,通过配置时注入

private String datePattern;

public void setDatePattern(String datePattern) {

this.datePattern = datePattern;

}

// Converter接口的类型转换方法

@Override

public Date convert(String date) {

try {

SimpleDateFormat dateFormat = new SimpleDateFormat(this.datePattern);

// 将日期字符串转换成Date类型返回

return dateFormat.parse(date);

} catch (Exception e) {

e.printStackTrace();

System.out.println("日期转换失败!");

return null;

}

}

}

在完成Converter后就需要将其添加到Spring容器中,以备在使用时可以直接调用,我们的配置也很简单,在springmvc-config.xml中添加如下代码:

class="org.springframework.context.support.ConversionServiceFactoryBean">

p:datePattern="yyyy-MM-dd">

从上面的例子可以看出,可以在这里配置多个Converter。如果使用mvc:annotation-driven/ SpringMVC会默认注册一个默认的ConversionService,即FormattingConversionServiceBean,可以满足大部分时候转换。

上面介绍了3个Converter发现都是接口,而且没有任何继承关系,这使得我很纳闷,他们3个接口没有共同的父接口如何放到一个集合中呢?于是去查看ConversionServiceFactorybean的源码:

/**

* Configure the set of custom converter objects that should be added:

* implementing {@link org.springframework.core.convert.converter.Converter},

* {@link org.springframework.core.convert.converter.ConverterFactory},

* or {@link org.springframework.core.convert.converter.GenericConverter}.

*/

public void setConverters(Set> converters) {

this.converters = converters;

}

发现其中有一个Set> 类型的集合,这样就可以存放多种类型的转换器了。

在完成以上配置后,就可以在Controller中使用了,但是我们不用显示的调用,Spring会帮我们完成这件事。我们只需正常使用就可以。

@Controller

public class UserController{

@RequestMapping(value="/register",method=RequestMethod.POST)

public String register(

@ModelAttribute User user,

Model model) {

logger.info(user);

model.addAttribute("user", user);

return "success";

}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值