SpringMVC 转换器

表单数据和JavaBean的属性值可能不对应,表单中需要输入时间,JavaBean中的属性是Date类型,但是表单数据设置到Bean的值是String类型,这就导致类型不同抛出异常。 所以有必要进行类型的转化。(默认的转换器已经能满足大部分需求)
Spring提供了3种转换器接口:
1. Converter<S,T>
2. ConverterFactory<S,R>
3. GenericConverter
下面实现Converter接口。
JavaBean:

public class User implements Serializable {
    private String loginname;
    private Date birthday;

    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;
    }
}

表单:

    <form action="/register" method="post">
        <table>
            <tr>
                <td><label>登录名: </label></td>
                <td><input type="text" name="loginname"></td>
            </tr>
            <tr>
                <td><label>生日: </label></td>
                <td><input type="text" name="birthday"></td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="登录">
                </td>
            </tr>
        </table>
    </form>

控制器:

@Controller
public class UserController {
    private static final Log logger = LogFactory.getLog(UserController.class);
    @RequestMapping(value = "/{formName}")
    public String loginForm(
            @PathVariable(value = "formName") String formName) {
        return formName;
    }

    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public String register(
            @ModelAttribute User user, Model model) {
        logger.info(user.getBirthday() + "-------------------");
        model.addAttribute("user", user);
        return "success";
    }
}

到现在为止还没有添加自定义的转换器,如果此时提交表单,会发生错误。所以需要添加必须的转换器:

public class StringToDateConverter implements Converter<String, Date> {

    private String datePattern;

    public StringToDateConverter() {}

    public StringToDateConverter(String datePattern) {
        this.datePattern = datePattern;
    }

    public void setDatePattern(String datePattern) {
        this.datePattern = datePattern;
    }

    @Override
    public Date convert(String s) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(datePattern);
            return dateFormat.parse(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

通过转化器将String类型转化为Date类型数据。将转化器添加到配置文件中:

    <mvc:annotation-driven conversion-service="conversionService"/>
    <!-- 自定义的类型转换器 -->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="converter.StringToDateConverter" p:datePattern="yyyy-MM-dd"></bean>
            </set>
        </property>
    </bean>

有了转换器就能成功将String类型转化为Date

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值