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"/>

 

  

原文地址:https://www.cnblogs.com/yigedingzi/p/10827407.html

时间: 2024-10-05 04:45:54

springMVC接收前台传的日期的相关文章

springmvc接收前台(如ajax)传来的数组list,set等图文详解

ref:https://blog.csdn.net/wabiaozia/article/details/50803581 前言: 相信很人都被springmvc接收数组问题折磨过,查过几个解决方案,都不能很好的解决.那些方法一般存在一个问题:把接收到的数据结构转换成你想要的结构时,不好处理.为什么说不好处理下文有具体例子介绍(见1.2). 1  本文springmvc版本为3.1 ,ecplise:月神(luna),tomcat:7.0,jdk:1.6,maven:3.0. 2  我博客所有文章

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

加班是为了不加班. 从前台传了两个参数过去,包装成: {"user":{"name":"asd","age":22}} springmvc形参这样: public void test(@RequestBody User user){ ...... } 接收不到,属性总是显示为空,后来这样 {"name":"asd","age":22} 解决问题.看来User类中没有其

关于springmvc怎么自动把前台string类型日期字段转换成date类型

关于springmvc怎么把前台string类型日期字段转换成date类型字段,小狼想了好久,阅读spring源代码,发现一个很好玩的注解@DateTimeFormat(pattern="yyyy-MM-dd") 对,就是他,小狼是这么使用的 @Controller public class Login { @RequestMapping("/login") public String login(String username,@DateTimeFormat(pa

【HTML】Jquery前台传参及接收

在一些网页应用中,有的时候需要前台之间传递参数,通过JS语法来做一些判断处理. 发送端:(a页面) <a href="b.html?Show=true" id="toPageB">跳转到b页面</a> PS:其中的问号后面的 show=true就是传递的参数名称及值. 接收端:(b页面) //通过准则表达式来获取对用的值 function getURLParameter(name) { return decodeURIComponent((n

ajax传数组到后台,后台springmvc接收数组参数

var   ids= new Array();  $("input[class='detailCheck']:checked").each(function(i,k){   var itemId=$(this).attr("itemId");   ids[i]=itemId;  });    $.ajax({   url : ctx + "/test/setNoProcess.do",   type : "get",   da

【SpringMVC学习09】SpringMVC与前台的json数据交互

json数据格式在接口调用中.html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍.在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springmvc中如何和前台交互json数据. 1. 两种交互形式 springmvc和前台交互主要有两种形式,如下图所示: 可以看出,前台传过来的方式有两种,一种是传json格式的数据过来,另一种就是在url的末尾传普通的key/value串过来,针对这两种方式,在controller中会有不同的解析,但是在

springMVC接受前台传值

今天,用ajax向springMVC的控制器传参数,是一个json对象.({"test":"test","test1":"test1""test2":"test2"})开始的想法是用一个对象来接收这个json对象.但是又不知道具体用什么对象,开始用了一个Object,名字和json对象属性名相同,但是得不到 @RequestMapping("/test") publi

springmvc文件上传及表单数据封装

补充: form表单需要提交时间,springmvc封装到实体类的Date字段时,丢失时分秒,可以在controller中添加     @InitBinder     public void initBinder(WebDataBinder binder) {         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");         dateFormat.setLenient(f

SpringMVC学习(十)——SpringMVC与前台的json数据交互

json数据格式在接口调用中.html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍.在SpringMVC中,也支持对json数据的解析和转换,这篇文章主要总结一下在SpringMVC中如何和前台交互json数据. 两种交互形式 SpringMVC和前台交互主要有两种形式,如下图所示: 可以看出,前台传过来的方式有两种,一种是传json格式的数据过来,另一种就是在url的末尾传普通的key/value串过来,针对这两种方式,在Controller类中会有不同的解析,但是在C