`

spring mvc使用@InitBinder标签对表单数据绑定

阅读更多

        在SpringMVC中,bean中定义了Date,double等类型,如果没有做任何处理的话,日期以及double都无法绑定。

        解决的办法就是使用spring mvc提供的@InitBinder标签。

        在我的项目中是在BaseController中增加方法initBinder,并使用注解@InitBinder标注,那么spring mvc在绑定表单之前,都会先注册这些编辑器,当然你如果不嫌麻烦,你也可以单独的写在你的每一个controller中。剩下的控制器都继承该类。spring自己提供了大量的实现类,诸如CustomDateEditor ,CustomBooleanEditor,CustomNumberEditor等许多,基本上够用。

        当然,我们也可以不使用他自己自带这些编辑器类,下面我们自己去构造几个。

import org.springframework.beans.propertyeditors.PropertiesEditor;

public class DoubleEditor extends PropertiesEditor {  
    @Override  
    public void setAsText(String text) throws IllegalArgumentException {  
        if (text == null || text.equals("")) {  
            text = "0";  
        }  
        setValue(Double.parseDouble(text));  
    }  
  
    @Override  
    public String getAsText() {  
        return getValue().toString();  
    }  
}
import org.springframework.beans.propertyeditors.PropertiesEditor;

public class IntegerEditor extends PropertiesEditor {  
    @Override  
    public void setAsText(String text) throws IllegalArgumentException {  
        if (text == null || text.equals("")) {  
            text = "0";  
        }  
        setValue(Integer.parseInt(text));  
    }  
  
    @Override  
    public String getAsText() {  
        return getValue().toString();  
    }  
}
import org.springframework.beans.propertyeditors.PropertiesEditor;

public class FloatEditor extends PropertiesEditor {  
    @Override  
    public void setAsText(String text) throws IllegalArgumentException {  
        if (text == null || text.equals("")) {  
            text = "0";  
        }  
        setValue(Float.parseFloat(text));  
    }  
  
    @Override  
    public String getAsText() {  
        return getValue().toString();  
    }  
}
import org.springframework.beans.propertyeditors.PropertiesEditor;

public class LongEditor extends PropertiesEditor {  
    @Override  
    public void setAsText(String text) throws IllegalArgumentException {  
        if (text == null || text.equals("")) {  
            text = "0";  
        }  
        setValue(Long.parseLong(text));  
    }  
  
    @Override  
    public String getAsText() {  
        return getValue().toString();  
    }  
}
import java.beans.PropertyEditorSupport;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.util.StringUtils;

public class CustomDateEditorWapper extends PropertyEditorSupport {
    private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private final boolean allowEmpty;

    /**
     * 是否允许为空
     * @param allowEmpty
     */
    public CustomDateEditorWapper(boolean allowEmpty) {
        this.allowEmpty = allowEmpty;
    }

    /**
     * 根据格式绑定数据
     */
    public void setAsText(String text) throws IllegalArgumentException {
        if (this.allowEmpty && !StringUtils.hasText(text)) {
            setValue(null);
        } else if (text.indexOf("1") == 0 && text.length() == 13 && text.indexOf("-") < 0) {
            //日期传Long的转换
            setValue(new Date(Long.parseLong(text)));
        } else {
            setValue(DateUtils.parseTime(text));
        }
    }

    public String getAsText() {
        Date value = (Date) getValue();
        return (value != null ? this.dateFormat.format(value) : "");
    }
}

        在BaseController中。

@InitBinder
protected final void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
    // 在这里注册自定义的PropertyEditor
//    binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));
    binder.registerCustomEditor(java.util.Date.class, new CustomDateEditorWapper(true));
//      binder.registerCustomEditor(int.class, new CustomNumberEditor(int.class, true));  
    binder.registerCustomEditor(int.class, new IntegerEditor());  
    binder.registerCustomEditor(long.class, new LongEditor());  
    binder.registerCustomEditor(double.class, new DoubleEditor());  
    binder.registerCustomEditor(float.class, new FloatEditor()); 
}

@InitBinder
public void initBinder(WebDataBinder binder) {
    // 设置List的最大长度
    binder.setAutoGrowCollectionLimit(5000);
}

        看到这里的CustomDateEditorWapper没?编辑器类直接继承PropertyEditorSupport也可以的。

 

        附上日志处理的工具类DateUtils:

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 日期工具类 
 */
public class DateUtils {

    private static java.util.Date formatDate(String split, String date, SimpleDateFormat df, int length)
            throws ParseException {
        
        String formatStr = "yyyy-MM-dd";
        if (length == 5) {
            if (date.indexOf(split) == length - 1) {// 2008-
                formatStr = "yyyy";
                date = date.substring(0, 4);
            } else {
                formatStr = "yyyy-MM";// 2008-01
            }
        } else if (length >= 6 && length <= 7) {// 2008-1 -- 2008-01
            formatStr = "yyyy-MM";
        } else if (length >= 8 && length <= 9) {
            if (date.lastIndexOf(split) == length - 1) { // 2008-12-
                formatStr = "yyyy-MM";
                date = date.substring(0, length - 1);
            } else {
                formatStr = "yyyy-MM-dd";// 2008-1-1 -- 2008-01-01
            }
        } else if (length >= 10 && length <= 11) {
            if (date.indexOf(" ") > -1 && date.indexOf(" ") < length - 1) {
                formatStr = "yyyy-MM-dd HH";// 2008-1-1 1 --
            } else {
                formatStr = "yyyy-MM-dd";// "2008-01-01"中间无空格
            }
        } else if (length >= 12 && length <= 13) {
            if (date.indexOf(":") > -1 && date.indexOf(":") < length - 1) {
                formatStr = "yyyy-MM-dd HH:mm";// 2008-1-1 1:1 --
                                               // 2008-1-1 1:01
            } else {
                formatStr = "yyyy-MM-dd HH";// 2008-01-01 01 中间有空格
            }
        } else if (length >= 14 && length <= 16) {
            int lastIndex = date.lastIndexOf(":");
            if (date.indexOf(":") > -1 && lastIndex < length - 1 && date.indexOf(":") != lastIndex) {
                formatStr = "yyyy-MM-dd HH:mm:ss";// 2008-1-1 1:1:1
                                                  // -- 2008-01-01
                                                  // 1:1:1 中间有两个冒号
                if (lastIndex < length - 1 - 2) {
                    date = date.substring(0, lastIndex + 3);
                }
            } else if (date.indexOf(":") > -1 && lastIndex < length - 1 && date.indexOf(":") == lastIndex) {
                formatStr = "yyyy-MM-dd HH:mm";// 2008-01-01 1:1 --
                                               // 2008-01-01
                                               // 01:01中间只有一个冒号
            } else if (date.indexOf(":") > -1 && lastIndex == length - 1 && date.indexOf(":") == lastIndex) {
                formatStr = "yyyy-MM-dd HH";// 2008-01-01 01:
                                            // 只有一个冒号在末尾
                date = date.substring(0, length - 1);
            }
        } else if (length == 17) {
            int lastIndex = date.lastIndexOf(":");
            if (lastIndex < length - 1) {
                formatStr = "yyyy-MM-dd HH:mm:ss";// 2008-1-1 1:1:1
                                                  // -- 2008-01-01
                                                  // 1:1:1 中间有两个冒号
                if (lastIndex < length - 1 - 2) {
                    date = date.substring(0, lastIndex + 3);
                }
            } else if (lastIndex == length - 1) {
                formatStr = "yyyy-MM-dd HH:mm";// 2008-01-01 1:1 --
                                               // 2008-01-01
                                               // 01:01中间只有一个冒号
                date = date.substring(0, length - 1);
            }
        } else if (length >= 18) {
            formatStr = "yyyy-MM-dd HH:mm:ss";// 2008-1-1 1:1:1 --
                                              // 2008-01-01
                                              // 01:01:01 有两个冒号
            int lastIndex = date.lastIndexOf(":");
            if (lastIndex < length - 1 - 2) {
                date = date.substring(0, lastIndex + 3);
            }
        }

        formatStr = formatStr.replace("-", split);
        df.applyPattern(formatStr);

        return df.parse(date);
    }
    
    /**
     * 将常用时间字符串转换为时间对象
     * @param String
     * @return java.util.Date
     * @throws Exception 
     */
    public static java.util.Date parseTime(String date) throws Exception {
        SimpleDateFormat df = new SimpleDateFormat();
        java.util.Date rtnDate = null;
        if (date == null || date.trim().equals("") || date.trim().equals("null"))
            return rtnDate;
        try {
            date = date.trim();
            int length = date.length();
            if (date.indexOf("-") != -1) {
                if (length == 5) {
                    if (date.indexOf("-") == length - 1) {//2008- 
                        df.applyPattern("yyyy");
                        date = date.substring(0, 4);
                        rtnDate = df.parse(date);
                    } else {
                        df.applyPattern("yyyy-MM");//2008-01
                        rtnDate = df.parse(date);
                    }
                } else if (length >= 6 && length <= 7) {//2008-1 -- 2008-01
                    df.applyPattern("yyyy-MM");
                    rtnDate = df.parse(date);
                } else if (length >= 8 && length <= 9) {
                    if (date.lastIndexOf("-") == length - 1) { //2008-12-
                        df.applyPattern("yyyy-MM");
                        date = date.substring(0, length - 1);
                        rtnDate = df.parse(date);
                    } else {
                        df.applyPattern("yyyy-MM-dd");//2008-1-1 -- 2008-01-01
                        rtnDate = df.parse(date);
                    }
                } else if (length >= 10 && length <= 11) {
                    if (date.indexOf(" ") > -1 && date.indexOf(" ") < length - 1) {
                        df.applyPattern("yyyy-MM-dd HH");//2008-1-1 1 -- 2008-1-1 11 中间有空格
                        rtnDate = df.parse(date);
                    } else {
                        df.applyPattern("yyyy-MM-dd");//"2008-01-01"中间无空格
                        rtnDate = df.parse(date);
                    }
                } else if (length >= 12 && length <= 13) {
                    if (date.indexOf(":") > -1 && date.indexOf(":") < length - 1) {
                        df.applyPattern("yyyy-MM-dd HH:mm");//2008-1-1 1:1  -- 2008-1-1 1:01 中间有冒号
                        rtnDate = df.parse(date);
                    } else {
                        df.applyPattern("yyyy-MM-dd HH");//2008-01-01 01 中间有空格
                        rtnDate = df.parse(date);
                    }
                } else if (length >= 14 && length <= 16) {
                    int lastIndex = date.lastIndexOf(":");
                    if (date.indexOf(":") > -1 && lastIndex < length - 1 && date.indexOf(":") != lastIndex) {
                        df.applyPattern("yyyy-MM-dd HH:mm:ss");//2008-1-1 1:1:1  -- 2008-01-01 1:1:1 中间有两个冒号
                        if (lastIndex < length - 1 - 2) {
                            date = date.substring(0, lastIndex + 3);
                        }
                        rtnDate = df.parse(date);
                    } else if (date.indexOf(":") > -1 && lastIndex < length - 1 && date.indexOf(":") == lastIndex) {
                        df.applyPattern("yyyy-MM-dd HH:mm");//2008-01-01 1:1  -- 2008-01-01 01:01中间只有一个冒号
                        rtnDate = df.parse(date);
                    } else if (date.indexOf(":") > -1 && lastIndex == length - 1 && date.indexOf(":") == lastIndex) {
                        df.applyPattern("yyyy-MM-dd HH");//2008-01-01 01: 只有一个冒号在末尾
                        date = date.substring(0, length - 1);
                        rtnDate = df.parse(date);
                    }
                } else if (length == 17) {
                    int lastIndex = date.lastIndexOf(":");
                    if (lastIndex < length - 1) {
                        df.applyPattern("yyyy-MM-dd HH:mm:ss");//2008-1-1 1:1:1  -- 2008-01-01 1:1:1 中间有两个冒号
                        if (lastIndex < length - 1 - 2) {
                            date = date.substring(0, lastIndex + 3);
                        }
                        rtnDate = df.parse(date);
                    } else if (lastIndex == length - 1) {
                        df.applyPattern("yyyy-MM-dd HH:mm");//2008-01-01 1:1  -- 2008-01-01 01:01中间只有一个冒号
                        date = date.substring(0, length - 1);
                        rtnDate = df.parse(date);
                    }
                } else if (length >= 18) {
                    df.applyPattern("yyyy-MM-dd HH:mm:ss");//2008-1-1 1:1:1  -- 2008-01-01 01:01:01 有两个冒号
                    int lastIndex = date.lastIndexOf(":");
                    if (lastIndex < length - 1 - 2) {
                        date = date.substring(0, lastIndex + 3);
                    }
                    rtnDate = df.parse(date);
                }
            //对时间格式中以/为分隔符的日期做处理
            } else if (date.indexOf("/") != -1) {
                rtnDate = formatDate("/", date, df, length);
            } else if (length == 4) {
                df.applyPattern("yyyy");
                rtnDate = df.parse(date);
            } else if (length >= 5 && length <= 6) {
                df.applyPattern("yyyyMM");
                rtnDate = df.parse(date);
            } else if (length >= 7 && length <= 8) {
                df.applyPattern("yyyyMMdd");
                rtnDate = df.parse(date);
            } else if (length >= 9 && length <= 10) {
                df.applyPattern("yyyyMMddHH");
                rtnDate = df.parse(date);
            } else if (length >= 11 && length <= 12) {
                df.applyPattern("yyyyMMddHHmm");
                rtnDate = df.parse(date);
            } else if (length >= 13 && length <= 14) {
                df.applyPattern("yyyyMMddHHmmss");
                rtnDate = df.parse(date);
            } else if (length >= 15) {
                df.applyPattern("yyyyMMddHHmmss");
                date = date.substring(0, 14);
                rtnDate = df.parse(date);
            }
        } catch (Exception ex) {
            throw ex;
        }
        return rtnDate;
    }
}

 

参考资料:http://blog.csdn.net/axin66ok/article/details/17938095

分享到:
评论

相关推荐

    spring mvc使用@InitBinder标签对表单数据绑定的方法

    主要介绍了spring mvc使用@InitBinder标签对表单数据绑定的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    [免费]Spring MVC学习指南(高清)

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    大优惠 Spring MVC学习指南(第2版)2017.pdf

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    Spring MVC---数据绑定和表单标签详解

    本篇文章主要介绍了Spring MVC---数据绑定和表单标签详解,具有一定的参考价值,有兴趣的可以了解一下。

    使用Spring MVC表单标签_IT168文库.doc

    在低版本的Spring中,你必须通过JSTL或...不过这一情况已经一去不复返了,从Spring 2.0开始,Spring MVC开始全面支持表单标签,通过Spring MVC表单标签,我们可以很容易地将控制器相关的表单对象绑定到HTML表单元素中。

    Spring MVC学习指南

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    Spring MVC 3.0实战指南.ppt

    使用命令/表单对象绑定 使用Servlet API对象作为入参 使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南.rar

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    Spring3MVC注解教程.ppt

    使用命令/表单对象绑定 使用Servlet API对象作为入参 使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody ...

    Spring MVC学习指南 第2版 高清版

    全书共包括13章和5个附录,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、转换器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件以及应用测试等多个角度介绍...

    Spring In Action MVC 提交表单(2)-数据绑定和数据校验

    NULL 博文链接:https://wujiu.iteye.com/blog/2012877

    Spring MVC注解与数据绑定(含源码及结果图)

    1、有如下一个订单信息页面order.jsp(置于/WEB-INF/jsp目录下),按以下步骤实现一个使用POJO类型完成表单数据传输的SpringMVC数据绑定项目。 (1) 创建一个Order类来封装上述订单信息,其中各个属性的名称和数据类型...

    spring mvc 3.2 参考文档

    在Spring Web MVC 中,您可以使用任何对象作为命令对象(command orject)或表单对象 ;您不需要实现框架特定接口或基类。Spring的数据绑定是高度灵活的: 例如,它把类型不匹配当做验证错误,这样就可以算作应用程序...

    Extjs5.0从入门到实战开发信息管理系统(Extjs基础、Extjs5新特性、Spring、Spring mvc)

    本教程从Extjs5的开发环境搭建开始,讲解了Extjs5的项目结构(包括核心文件的作用),Extjs类的一些基本概念,布局、事件、MVVM和MVC架构、路由器,数据绑定等的概念和实际使用,同时讲解了开发中常用的extjs UI...

    SpringMVC实现数据绑定及表单标签

    主要为大家详细介绍了SpringMVC实现数据绑定及表单标签的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 ...

Global site tag (gtag.js) - Google Analytics