在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; } }
相关推荐
Spring MVC 使用 @InitBinder 标签对表单数据绑定的方法 Spring MVC 框架中, Bean 中定义了 Date、double 等类型,如果没有做任何处理的话,日期以及 double 都无法绑定。这是因为 Spring MVC 框架中的数据绑定...
在需要日期转换的 Controller 中使用 SpringMVC 的注解 @InitBinder 和 Spring 自带的 WebDataBinder 类来操作。 @InitBinder 注解的作用是初始化 WebDataBinder,用于绑定请求参数到指定的属性编辑器。...
在Spring MVC中,数据绑定是一项核心功能,它允许开发者将用户输入的数据与控制器中的对象属性进行关联,简化了数据处理的复杂性。本文将详细介绍Spring MVC中的数据绑定,并提供实例帮助初学者理解。 1. **模型...
`@ModelAttribute`在表单绑定、数据校验和分页等场景中都有着广泛的应用。通过它,我们可以实现模型和视图之间的数据共享,简化了数据处理的流程,提高了代码的可读性和可维护性。 总的来说,`@ModelAttribute`是...
本篇文章将深入探讨Spring MVC中的表单标签库,以及如何在实际项目中使用它们来创建动态、交互式的表单。 1. **表单标签库介绍** Spring MVC的表单标签库是JSP的一部分,它可以生成HTML表单元素,并且能够自动绑定...
`@RequestParam`用于从请求参数中获取值,`@PathVariable`用于处理URL路径变量,`@ModelAttribute`则常用于绑定表单数据到模型对象。 此外,Spring MVC提供了ModelAndView类,它可以将处理结果(模型数据)和视图名...
在实际开发中,我们可能使用诸如IntelliJ IDEA或Eclipse等IDE,它们提供了对Spring MVC数据绑定和校验的强大支持,包括代码提示、错误检测和自动修复。 综上所述,Spring MVC的数据绑定和数据校验机制为开发者提供...
这些标签是Spring Web MVC模块的一部分,能够与Spring的模型绑定机制无缝集成,简化了前端到后端的数据传递。 113.9.1. **配置** 在使用Spring的表单标签库之前,需要在JSP页面中引入Spring的Taglib。这通常在页面...
Spring MVC还支持数据绑定,自动将请求参数绑定到Java对象,这极大地简化了表单提交的处理。对于验证,Spring MVC提供了BindingResult和Validator接口,用于校验模型数据的正确性。 另外,Spring MVC与Spring框架的...
总的来说,"Mastering Spring MVC 4(2015.09)源码"提供了深入学习Spring MVC的机会,你可以通过阅读和分析源码来了解如何配置DispatcherServlet、怎样编写控制器、如何进行数据绑定与验证,以及如何利用拦截器等特性...
Spring MVC支持自动的数据绑定,可以将请求参数直接绑定到Controller方法的参数上,也可以将表单数据绑定到Java对象。此外,@Valid用于验证模型数据,配合Validator接口实现自定义校验规则。 7. **异常处理** ...
`@InitBinder`可以自定义数据绑定规则,`@Valid`可以配合JSR-303/JSR-349的Bean Validation进行表单验证。 此外,Spring MVC支持RESTful风格的URL设计,这使得API更易于理解和使用。通过`@RestController`注解,...
6. **数据绑定与验证**:Spring MVC提供了数据绑定和验证功能,允许将表单数据自动绑定到Java对象,并进行校验,简化了业务逻辑处理。 7. **视图解析**:Spring MVC 4.0支持多种视图技术,如JSP、FreeMarker、...
在Spring MVC框架中,数据绑定和表单标签是开发Web应用程序时非常重要的组成部分。它们简化了控制器和视图之间的数据交换,并提供了强大的表单渲染功能。以下是对这两个概念的详细解释。 **数据绑定**: 数据绑定是...
例如,使用jQuery的`validate()`插件可以对表单输入进行验证,同时Spring MVC服务器端可以进行二次验证。 5. **异常处理**:Spring MVC通过`@ExceptionHandler`注解处理异常,可以返回定制的错误页面。配合jQuery,...
全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...
这本书深入浅出地介绍了如何有效地使用Spring MVC进行开发,以下是一些核心知识点的详细说明: 1. **Spring MVC基本概念**:首先,了解Spring MVC的基本架构,包括DispatcherServlet、Controller、Model、View和...
7. **Form Handling**: Spring MVC 提供了强大的表单处理能力,包括自动数据绑定、数据校验等功能。通过@Valid可以进行数据验证,@RequestParam和@PathVariable用于获取请求参数。 8. **Interceptors**: 拦截器是...
全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...