springMVC接收前台传的日期

Posted yigedingzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springMVC接收前台传的日期相关的知识,希望对你有一定的参考价值。

  当前台传数据给spring的control时,如果后台方法的参数或参数对象的对应属性是基本类型或者string类型时,前台值自动的注入到后台方法参数或对象属性中。如果方法参数或对象属性不是基本类型或string,比如是date类型,则不能直接赋值。

解决方法有一下三种:

一、使用注解

  1、在springmvc配置文件中开启注解<mvc:annotation-driven />

  2、在参数或对象属性上添加注解

    如:如果是date类型可以添加@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

    @DateTimeFormat(pattern="yyyy-MM-dd") 可将形如1980-0-01的字符串转换到Date类 
    @NumberFormat(pattern="#,###.##") 可将形如4,500.00的字符串转换成long类型

    .  .  .

  此种方法缺点:如要在每一个参上加个注解,如果实体类改变,则注解可能也需要添加修改,比如通过mybatis逆向工程成的实体类是不带注解的,如果项目需要修改了表,重新生产实体类,则需要重新添加注解,比较麻烦,且容易出错。

二、Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作

 

  1、在springmvc配置文件中开启注解<mvc:annotation-driven />

  2、WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再set进去。 

 

  代码如下:在自己的Controller代码中加入:
  

1     @InitBinder
2     protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) {
3         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
4         simpleDateFormat.setLenient(false);
5         CustomDateEditor dateEditor = new CustomDateEditor(simpleDateFormat, true);
6         binder.registerCustomEditor(Date.class, dateEditor);
7     }  spring mvc在绑定表单之前,都会先注册这些编辑器,Spring自己提供了大量的实现类,诸如CustomDateEditor ,CustomBooleanEditor,CustomNumberEditor等许多,基本上够用。 

  spring mvc在绑定表单之前,都会先注册这些编辑器,Spring自己提供了大量的实现类,诸如CustomDateEditor ,CustomBooleanEditor,CustomNumberEditor等许多,基本上够用。 
  使用时候调用WebDataBinder的registerCustomEditor方法registerCustomEditor源码:
  

public void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor) {
    getPropertyEditorRegistry().registerCustomEditor(requiredType, propertyEditor);
}

  

  第一个参数requiredType是需要转化的类型。 
  第二个参数PropertyEditor是属性编辑器,它是个接口,以上提到的如CustomDateEditor等都是继承了实现了这个接口的PropertyEditorSupport类。 
我们也可以不使用他们自带的这些编辑器类。 
  我们可以构造自己的:

import org.springframework.beans.propertyeditors.PropertiesEditor;
 
public class DoubleEditor extends PropertyEditorSupport {
    @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();
    }
}

  

  此种方法作用预为本control,但是可以针对整个项目,像实例一样抽出公共BaseController,让所有的controller继承BaseController,即可

  

 1 @Controller
 2 public class BaseController {
 3     @InitBinder
 4     protected void initBinder(WebDataBinder binder) {
 5         binder.registerCustomEditor(Date.class, new MyDateEditor());
 6         /*
 7             从PropertyEditorSupport 实现的方法可以看出,这里的绑定是为了处理空和null的数据,
 8             开发者可根据实际情况绑定
 9         */
10         binder.registerCustomEditor(Double.class, new DoubleEditor());
11         binder.registerCustomEditor(Integer.class, new IntegerEditor());
12     }
13  
14     private class MyDateEditor extends PropertyEditorSupport {
15         @Override
16         public void setAsText(String text) throws IllegalArgumentException {
17             //通过两次异常的处理可以,绑定两次日期的格式
18             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
19             Date date = null;
20             try {
21                 date = format.parse(text);
22             } catch (ParseException e) {
23                 format = new SimpleDateFormat("yyyy-MM-dd");
24                 try {
25                     date = format.parse(text);
26                 } catch (ParseException e1) {
27                     log.error("系统异常:"+e1);
28                 }
29             }
30             setValue(date);
31         }
32     }
33  
34     public class DoubleEditor extends PropertiesEditor {
35         @Override
36         public void setAsText(String text) throws IllegalArgumentException {
37             try {
38                 if (text == null || text.equals("")) {
39                     text = "0";
40                 }
41             } catch (Exception e) {
42                 log.error("系统异常:"+e);
43             }
44  
45             setValue(Double.parseDouble(text));
46         }
47  
48         @Override
49         public String getAsText() {
50             return getValue().toString();
51         }
52     }
53  
54     public class IntegerEditor extends PropertiesEditor {
55         @Override
56         public void setAsText(String text) throws IllegalArgumentException {
57             try {
58                 if (text == null || text.equals("")) {
59                     text = "0";
60                 }
61             } catch (Exception e) {
62                 log.error("系统异常:"+e);
63             }
64  
65             setValue(Integer.parseInt(text));
66         }
67  
68         @Override
69         public String getAsText() {
70             return getValue().toString();
71         }
72     }
73 }

三、定义的类型转换类

  1、自定义类型转换规则

  SpringMvc提供了Converter接口,它支持从一个Object转换为另一个Object

  

 1 public class DateConvert implements Converter<String, Date> {
 2 
 3     @Override
 4     public Date convert(String stringDate) {
 5         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
 6         try {
 7             return simpleDateFormat.parse(stringDate);
 8         } catch (ParseException e) {
 9             e.printStackTrace();
10         }
11         return null;
12     }
13 
14 }

  2、注册自定义的类型转换类

  

 1     <!-- 第一步:  创建自定义日期转换规则 -->   
 2     <bean id="dateConvert" class="zpark.convert.DateConvert"/>
 3     <!-- 第二步: 创建convertion-Service ,并注入dateConvert-->
 4     <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
 5         <property name="converters">
 6             <set>
 7                 <ref bean="dateConvert"/>
 8             </set>
 9         </property>
10     </bean>
11     <!-- 第三步:注册处理器映射器/处理器适配器 ,添加conversion-service属性-->
12     <mvc:annotation-driven conversion-service="conversionService"/>

 

 

  

 

以上是关于springMVC接收前台传的日期的主要内容,如果未能解决你的问题,请参考以下文章

tomcat设置utf-8编码,springMVC后台接收参数反而乱码

springmvc表单提交日期格式,怎么搞

springMVC通过ajax传递参数list对象或传递数组对象到后台

Ajax从前台传json串给springmvc接收的一些坑

SpringMVC传值(对象或字符串)给前台js

SpringMVC @RequestBody接收Json对象字符串