Spring MVC 类型转换(type convert)例子及下载

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 ,这种方式可能更流行了。


除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: spring
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.