Spring MVC 类型转换(type convert)例子及下载
作者:轻舞肥羊 日期:2013-11-26
spring 支持类型转换, 最常用的就是从字符串转换成一个对象的属性值。在配置spring <bean>时会经常用到。spring 采用了property editor方式对特定的类型进行转换, 并将这些properties editor 注入到spring 容器中去。在spring mvc 中,controller 层中绑定的 对象包含了其他多个对象,这个时候spring mvc 并不能根据你输入的字符串转换成你包含的其他对象,这个时候,就需要转换了,一个最简单的例子,日期字符串到 日期类型的转换。当然这些最基本的类型转换,spring 已经实现了,但也可以自己实现了,我自己做了一个小例子来测试:
场景:一群人约在一个地方见面。包含两个对象。
约会对象,里面包含了这个对象
程序代码
public class User {
private String name;
private String phone;
public User(){
}
public User(String name,String phone){
this.name=name;
this.phone=phone;
}
/*getter setter*/
}
public class Reservation {
public String address;
public Date dateToReserve;
public int hour;
public User user;
public Reservation(){
}
public Reservation(String address, Date date, int hour, User user) {
this.address = address;
this.dateToReserve = date;
this.hour = hour;
this.user = user;
}
public String getAddress() {
return address;
}
/*geter setter.*/
}
按照通常的做法,spring 应该如下配置:
程序代码
<bean id="dummyReservation" class="com.yihaomen.domain.Reservation">
<property name="address" value="guangdong zhuhai qingrenlu"/>
<property name="dateToReserve" value="11-11-2013"/>
<property name="hour" value="15"/>
<property name="user">
<bean class="com.yihaomen.domain.User">
<property name="name" value="summer"/>
<property name="phone" value="5201314"/>
</bean>
</property>
</bean>
上面的做法看上去很好吗?很直观吗?我不觉得,其实更直观的是如下方式:
程序代码
<bean id="dummyReservation" class="com.yihaomen.domain.Reservation">
<property name="address" value="guangdong zhuhai qingrenlu"/>
<property name="dateToReserve" value="11-11-2013"/>
<property name="hour" value="15"/>
<property name="user" value="summer,5201314"/>
</bean>
这种方式更直观,也更好看,但是要使这样的配置能正常工作,就需要用到自定义的类型转换. 这里我实现了两个类型转换,一个是用来转换时间的,另一个是用来转换 user 的。
程序代码
public class StringToDateTypeConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
Date date = null;
try{
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
date = sd.parse(dateStr);
} catch (Exception e) {
throw new ConversionFailedException(TypeDescriptor.valueOf(String.class),
TypeDescriptor.valueOf(Date.class), dateStr, null);
}
return date;
}
}
程序代码
public class StringToUserTypeConverter implements Converter<String, User> {
public User convert(String userString) {
User user = new User();
try{
String[] userInfo = userString.split(",");
if (userInfo.length>=1){
user.setName(userInfo[0]);
}
if (userInfo.length>=2){
user.setPhone(userInfo[1]);
}
} catch (Exception e) {
throw new ConversionFailedException(TypeDescriptor.valueOf(String.class),
TypeDescriptor.valueOf(User.class), userString, null);
}
return user;
}
}
如何能在 spring mvc 下工作呢? 需要在 spring-servlet.xml 中进行如下配置;
程序代码
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" >
<property name="converters">
<set>
<bean class="com.yihaomen.converter.StringToDateTypeConverter"/>
<bean class="com.yihaomen.converter.StringToUserTypeConverter"/>
</set>
</property>
</bean>

注册这谢自定义类型转换之后,spring 遇到相应的关系,就会自动转换。我自己做了一个测试列子,有如下页面:
程序代码
<form method="post" action="/springTypeConvert/rest/convert/save">
<table>
<tr>
<th>address</th>
<td><input type="text" name="address" /></td>
</tr>
<tr>
<th>Reservation Date</th>
<td><input type="text" name="dateToReserve" value="2012-01-01" /></td>
</tr>
<tr>
<th>Hour</th>
<td><input type="text" name="hour" value="10" /></td>
</tr>
<tr>
<th>User</th>
<td><input type="text" name="user" value="summer,130121233443" /></td>
</tr>
<tr>
<td colspan="3"><input type="submit" name="Submit" /></td>
</tr>
</table>
</form>
可以看到在 user 字段,输入是 "summer,130121233443 ", 提交之后,会自动转换成 Reservation对象中User 对象中的属性。

提交后看转换结果。

源码下载,省略了jar 包,用spring 相关jar包就可以了,我用的是3.2的。
spring type convert
通过这种类型转换,可以很方便的实现字符串和对象之间的转换,也许有人说,这不就是拆字符串吗?的确是,但如果很多地方需要这种绑定的时候,好处就体现出来了,如果单独偶尔一个确实没必要用。
另一种思考,起始现在 富客户端越来越流行,完全可以用js 生成 json 然后提交到 spring controller 层,然后将json 对象反序列换成 我们需要的object ,这种方式可能更流行了。
场景:一群人约在一个地方见面。包含两个对象。
约会对象,里面包含了这个对象

public class User {
private String name;
private String phone;
public User(){
}
public User(String name,String phone){
this.name=name;
this.phone=phone;
}
/*getter setter*/
}
public class Reservation {
public String address;
public Date dateToReserve;
public int hour;
public User user;
public Reservation(){
}
public Reservation(String address, Date date, int hour, User user) {
this.address = address;
this.dateToReserve = date;
this.hour = hour;
this.user = user;
}
public String getAddress() {
return address;
}
/*geter setter.*/
}
按照通常的做法,spring 应该如下配置:

<bean id="dummyReservation" class="com.yihaomen.domain.Reservation">
<property name="address" value="guangdong zhuhai qingrenlu"/>
<property name="dateToReserve" value="11-11-2013"/>
<property name="hour" value="15"/>
<property name="user">
<bean class="com.yihaomen.domain.User">
<property name="name" value="summer"/>
<property name="phone" value="5201314"/>
</bean>
</property>
</bean>
上面的做法看上去很好吗?很直观吗?我不觉得,其实更直观的是如下方式:

<bean id="dummyReservation" class="com.yihaomen.domain.Reservation">
<property name="address" value="guangdong zhuhai qingrenlu"/>
<property name="dateToReserve" value="11-11-2013"/>
<property name="hour" value="15"/>
<property name="user" value="summer,5201314"/>
</bean>
这种方式更直观,也更好看,但是要使这样的配置能正常工作,就需要用到自定义的类型转换. 这里我实现了两个类型转换,一个是用来转换时间的,另一个是用来转换 user 的。

public class StringToDateTypeConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
Date date = null;
try{
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
date = sd.parse(dateStr);
} catch (Exception e) {
throw new ConversionFailedException(TypeDescriptor.valueOf(String.class),
TypeDescriptor.valueOf(Date.class), dateStr, null);
}
return date;
}
}

public class StringToUserTypeConverter implements Converter<String, User> {
public User convert(String userString) {
User user = new User();
try{
String[] userInfo = userString.split(",");
if (userInfo.length>=1){
user.setName(userInfo[0]);
}
if (userInfo.length>=2){
user.setPhone(userInfo[1]);
}
} catch (Exception e) {
throw new ConversionFailedException(TypeDescriptor.valueOf(String.class),
TypeDescriptor.valueOf(User.class), userString, null);
}
return user;
}
}
如何能在 spring mvc 下工作呢? 需要在 spring-servlet.xml 中进行如下配置;

<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" >
<property name="converters">
<set>
<bean class="com.yihaomen.converter.StringToDateTypeConverter"/>
<bean class="com.yihaomen.converter.StringToUserTypeConverter"/>
</set>
</property>
</bean>

注册这谢自定义类型转换之后,spring 遇到相应的关系,就会自动转换。我自己做了一个测试列子,有如下页面:

<form method="post" action="/springTypeConvert/rest/convert/save">
<table>
<tr>
<th>address</th>
<td><input type="text" name="address" /></td>
</tr>
<tr>
<th>Reservation Date</th>
<td><input type="text" name="dateToReserve" value="2012-01-01" /></td>
</tr>
<tr>
<th>Hour</th>
<td><input type="text" name="hour" value="10" /></td>
</tr>
<tr>
<th>User</th>
<td><input type="text" name="user" value="summer,130121233443" /></td>
</tr>
<tr>
<td colspan="3"><input type="submit" name="Submit" /></td>
</tr>
</table>
</form>
可以看到在 user 字段,输入是 "summer,130121233443 ", 提交之后,会自动转换成 Reservation对象中User 对象中的属性。

提交后看转换结果。

源码下载,省略了jar 包,用spring 相关jar包就可以了,我用的是3.2的。

通过这种类型转换,可以很方便的实现字符串和对象之间的转换,也许有人说,这不就是拆字符串吗?的确是,但如果很多地方需要这种绑定的时候,好处就体现出来了,如果单独偶尔一个确实没必要用。
另一种思考,起始现在 富客户端越来越流行,完全可以用js 生成 json 然后提交到 spring controller 层,然后将json 对象反序列换成 我们需要的object ,这种方式可能更流行了。
除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
评论: 0 | 引用: 0 | 查看次数: -
发表评论