springmvc @InitBinder 的用法

  1. 在实际操作中经常会碰到表单中的日期 字符串和Javabean中的日期类型的属性自动转换, 而springMVC默认不支持这个格式的转换,所以必须要手动配置, 自定义数据类型的绑定才能实现这个功能。

    比较简单的可以直接应用springMVC的注解@initbinder和spring自带的WebDataBinder类和操作

  2. ps:字符串是2017-10-31 15:01:31这种格式    才能自动封装成Date 类型

  3. @Controller
  4. @RequestMapping("/initbind")
  5. public class UserController{     
  6.     
  7.     @InitBinder
  8.     public void initBinder(WebDataBinder binder) {
  9.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  10.         //页面的日期字符串 2017-10-31 15:01:31 --->yyyy-MM-dd           ok
  11.         //页面的日期字符串 2017-10-31 ------------>yyyy-MM-dd HH:mm:ss  400报错
  12.   // 设置lenient为false
            // 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
  13.         dateFormat.setLenient(false);
  14.         binder.registerCustomEditor(Date.classnew CustomDateEditor(dateFormat, false));//true:允许输入空值,false:不能为空值
  15.     }     
  16.     
  17.     // ...     
  18. }

  19.        

使用以下方法改造
@InitBinder  
public void initBinder(WebDataBinder binder){  
    binder.registerCustomEditor(Date.class, new DateEditor());  
}  
public class DateEditor extends PropertyEditorSupport {  
    @Override  
    public void setAsText(String text) throws IllegalArgumentException {  
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        Date date = null;  
        try {  
            date = format.parse(text);  
        } catch (ParseException e) {  
            format = new SimpleDateFormat("yyyy-MM-dd");  
            try {  
                date = format.parse(text);  
            } catch (ParseException e1) {  
                e1.printStackTrace();  
            }  
        }  
        setValue(date);  
    }
     @Override
     public String getAsText() {
	  return getValue().toString();
     }  
} 

这里我们将DateEditor提出来封装成一个类方便重用。

另外这里有个try...catch的小妙用,就是首先以"yyyy-MM-dd HH:mm:ss"的形式来解析用户输入的参数,若解析失败则转以"yyyy-MM-dd"的形式来解析。这样的逻辑就可以同时处理"yyyy-MM-dd HH:mm:ss"和"yyyy-MM-dd"形式的日期数据,我想在一般的中文系统中,这两种形式应该是最常用的了吧

添加如上代码之后,@InitBinder所在的Controller就可以自动绑定日期类型的数据了,不过这仅仅是在该Controller中生效,若想在全局范围内生效的话,可以将@InitBinder注解所在的Controller定义为一个BaseController,其余Controller都继承这个Controller。当然还有另外的方法,若你有兴趣的话,请看2。

2、自定义WebBindingInitializer

复制代码
public class MyWebBindingInitializer implements WebBindingInitializer {  
      
    @Override  
    public void initBinder(WebDataBinder binder, WebRequest request) {  
        binder.registerCustomEditor(Date.class, new DateEditor());  
    }  
}  
复制代码

还是前面写的DateEditor,这么快又见面了,只不过注册的位置改变了,在WebBindingInitializer中注册的PropertyEditor是在全局范围内共享的。

不过光这样还不够,还要将WebBindingInitializer注入到AnnotationMethodHandlerAdapter中。

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="webBindingInitializer">
            <bean class="com.**.**.**.MyWebBindingInitializer" />
        </property>
    </bean>
    

完美解决问题提

测试代码

复制代码
@Controller
@RequestMapping(value="/")
public class BaseController {
    
    @RequestMapping(value="index")
    public String indexJsp(String username,Date date,Date ddate){
        System.out.println(username);
        System.out.println(date);
        System.out.println(ddate);
        return "index";
    }
}
复制代码

测试参数

index?username=fasdf&date=2012-12-03&ddate=2013-03-06

输出结果:

fasdf
Mon Dec 03 00:00:00 CST 2012
Wed Mar 06 00:00:00 CST 2013

参考文档:http://blog.csdn.net/u012345283/article/details/43268081

 

第二种方式使用Converter

代码如下

复制代码
public class MyConverter implements Converter<String, Date> {

    @Override
    public Date convert(String source) {
        // TODO Auto-generated method stub
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");

        try {
            // 转成直接返回
            return simpleDateFormat.parse(source);
        } catch (ParseException e) {

            simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            try {
                return simpleDateFormat.parse(source);
            } catch (ParseException e1) {

                System.out.println("日期转换失败->" + this.getClass().getName());
            }
        }
        // 如果参数绑定失败返回null
        return null;
    }

}
复制代码

XML配置如下

复制代码
<!-- 日期时间数据绑定 需要放在mvc:annotation-driven 之前 防止未扫描注入容器总- -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="****.MyConverter" />
            </list>
        </property>
    </bean>
复制代码

 很轻松的解决问题,

3,当然Spring是非常强大的还可以使用Formatter,Formatter比Converter更适合Converter是处理任意两类型间的转换,而Formatter是处理字符串和另一类型之间的转换的。

复制代码
public class MyDateFormatter implements Formatter<Date> {

    @Override
    public String print(Date object, Locale locale) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Date parse(String text, Locale locale) throws ParseException {
        // TODO Auto-generated method stub
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(text);
        } catch (Exception e) {
            format = new SimpleDateFormat("yyyy-MM-dd");
            date = format.parse(text);
        }
        return date;
    }

}
复制代码

XML配置如下:

复制代码
<mvc:annotation-driven conversion-service="conversionService"/>
 <bean id="conversionService"  
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
    <property name="formatters">  
        <set>  
            <bean class="com.ivlo.crm.extend.MyDateFormatter"></bean>  
        </set>  
    </property>  
</bean>  

原文转至: https://www.cnblogs.com/JNUX/p/6848311.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值