`

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 框架中, Bean 中定义了 Date、double 等类型,如果没有做任何处理的话,日期以及 double 都无法绑定。这是因为 Spring MVC 框架中的数据绑定...

    详解SpringMVC注解@initbinder解决类型转换问题

    在需要日期转换的 Controller 中使用 SpringMVC 的注解 @InitBinder 和 Spring 自带的 WebDataBinder 类来操作。 @InitBinder 注解的作用是初始化 WebDataBinder,用于绑定请求参数到指定的属性编辑器。...

    spring MVC数据绑定大全

    在Spring MVC中,数据绑定是一项核心功能,它允许开发者将用户输入的数据与控制器中的对象属性进行关联,简化了数据处理的复杂性。本文将详细介绍Spring MVC中的数据绑定,并提供实例帮助初学者理解。 1. **模型...

    Spring MVC 之@ModelAttribute使用.rar

    `@ModelAttribute`在表单绑定、数据校验和分页等场景中都有着广泛的应用。通过它,我们可以实现模型和视图之间的数据共享,简化了数据处理的流程,提高了代码的可读性和可维护性。 总的来说,`@ModelAttribute`是...

    Spring MVC表单标签库

    本篇文章将深入探讨Spring MVC中的表单标签库,以及如何在实际项目中使用它们来创建动态、交互式的表单。 1. **表单标签库介绍** Spring MVC的表单标签库是JSP的一部分,它可以生成HTML表单元素,并且能够自动绑定...

    Spring MVC使用Demo

    `@RequestParam`用于从请求参数中获取值,`@PathVariable`用于处理URL路径变量,`@ModelAttribute`则常用于绑定表单数据到模型对象。 此外,Spring MVC提供了ModelAndView类,它可以将处理结果(模型数据)和视图名...

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

    在实际开发中,我们可能使用诸如IntelliJ IDEA或Eclipse等IDE,它们提供了对Spring MVC数据绑定和校验的强大支持,包括代码提示、错误检测和自动修复。 综上所述,Spring MVC的数据绑定和数据校验机制为开发者提供...

    spring mvc标签使用指南

    这些标签是Spring Web MVC模块的一部分,能够与Spring的模型绑定机制无缝集成,简化了前端到后端的数据传递。 113.9.1. **配置** 在使用Spring的表单标签库之前,需要在JSP页面中引入Spring的Taglib。这通常在页面...

    最全最经典spring-mvc教程

    Spring MVC还支持数据绑定,自动将请求参数绑定到Java对象,这极大地简化了表单提交的处理。对于验证,Spring MVC提供了BindingResult和Validator接口,用于校验模型数据的正确性。 另外,Spring MVC与Spring框架的...

    Mastering Spring MVC 4(2015.09)源码

    总的来说,"Mastering Spring MVC 4(2015.09)源码"提供了深入学习Spring MVC的机会,你可以通过阅读和分析源码来了解如何配置DispatcherServlet、怎样编写控制器、如何进行数据绑定与验证,以及如何利用拦截器等特性...

    spring MVC_快速入门

    Spring MVC支持自动的数据绑定,可以将请求参数直接绑定到Controller方法的参数上,也可以将表单数据绑定到Java对象。此外,@Valid用于验证模型数据,配合Validator接口实现自定义校验规则。 7. **异常处理** ...

    spring MVC之一

    `@InitBinder`可以自定义数据绑定规则,`@Valid`可以配合JSR-303/JSR-349的Bean Validation进行表单验证。 此外,Spring MVC支持RESTful风格的URL设计,这使得API更易于理解和使用。通过`@RestController`注解,...

    spring mvc 4.0

    6. **数据绑定与验证**:Spring MVC提供了数据绑定和验证功能,允许将表单数据自动绑定到Java对象,并进行校验,简化了业务逻辑处理。 7. **视图解析**:Spring MVC 4.0支持多种视图技术,如JSP、FreeMarker、...

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

    在Spring MVC框架中,数据绑定和表单标签是开发Web应用程序时非常重要的组成部分。它们简化了控制器和视图之间的数据交换,并提供了强大的表单渲染功能。以下是对这两个概念的详细解释。 **数据绑定**: 数据绑定是...

    Spring MVC跟jQuery和Twitter Bootstrap的结合

    例如,使用jQuery的`validate()`插件可以对表单输入进行验证,同时Spring MVC服务器端可以进行二次验证。 5. **异常处理**:Spring MVC通过`@ExceptionHandler`注解处理异常,可以返回定制的错误页面。配合jQuery,...

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

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

    Spring MVC Cookbook(PACKT,2016).pdf

    这本书深入浅出地介绍了如何有效地使用Spring MVC进行开发,以下是一些核心知识点的详细说明: 1. **Spring MVC基本概念**:首先,了解Spring MVC的基本架构,包括DispatcherServlet、Controller、Model、View和...

    spring mvc

    7. **Form Handling**: Spring MVC 提供了强大的表单处理能力,包括自动数据绑定、数据校验等功能。通过@Valid可以进行数据验证,@RequestParam和@PathVariable用于获取请求参数。 8. **Interceptors**: 拦截器是...

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

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

Global site tag (gtag.js) - Google Analytics