SpringMVC之日期类型参数传递

谁践踏了优雅 2024-03-27 11:55 179阅读 0赞

目录

步骤1:编写方法接收日期数据

步骤2:启动Tomcat服务器

步骤3:使用PostMan发送请求

步骤4:查看控制台

步骤5:更换日期格式

步骤6:携带时间的日期


前面我们处理过简单数据类型、POJO数据类型、数组和集合数据类型以及JSON数据类型,接下来我们还得处理一种开发中比较常见的一种数据类型,日期类型

日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如:

  • 2088-08-18
  • 2088/08/18
  • 08/18/2088
  • ……

针对这么多日期格式,SpringMVC该如何接收,它能很好的处理日期类型数据么?

步骤1:编写方法接收日期数据

在UserController类中添加方法,把参数设置为日期类型

  1. @RequestMapping("/dataParam")
  2. @ResponseBody
  3. public String dataParam(Date date)
  4. System.out.println("参数传递 date ==> "+date);
  5. return "{'module':'data param'}";
  6. }

步骤2:启动Tomcat服务器

查看控制台是否报错,如果有错误,先解决错误。

步骤3:使用PostMan发送请求

使用PostMan发送GET请求,并设置date参数

b1b73394fad24814afa47ad2aaf662a7.png

步骤4:查看控制台

4657c93b335445e884432321c12e9f09.png

通过打印,我们发现SpringMVC可以接收日期数据类型,并将其打印在控制台。

这个时候,我们就想如果把日期参数的格式改成其他的,SpringMVC还能处理么?

步骤5:更换日期格式

为了能更好的看到程序运行的结果,我们在方法中多添加一个日期参数

  1. @RequestMapping("/dataParam")
  2. @ResponseBody
  3. public String dataParam(Date date,Date date1)
  4. System.out.println("参数传递 date ==> "+date);
  5. return "{'module':'data param'}";
  6. }

使用PostMan发送请求,携带两个不同的日期格式,

http://localhost/dataParam?date=2088/08/08&date1=2088-08-08

57924e1d3f8c418891cb9a69bd6e9064.png

发送请求和数据后,页面会报400,控制台会报错一个错误

Resolved [org.springframework.web.method.annotation.==MethodArgumentTypeMismatchException==: Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’; nested exception is org.springframework.core.convert.==ConversionFailedException==: Failed to convert from type [java.lang.String] to type [java.util.Date] for value ‘2088-08-08’; nested exception is java.lang.IllegalArgumentException]

从错误信息可以看出,错误的原因是在将2088-08-08转换成日期类型的时候失败了,原因是SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd,而我们现在传递的不符合其默认格式,SpringMVC就无法进行格式转换,所以报错。

解决方案也比较简单,需要使用@DateTimeFormat

  1. @RequestMapping("/dataParam")
  2. @ResponseBody
  3. public String dataParam(Date date,
  4. @DateTimeFormat(pattern="yyyy-MM-dd") Date date1)
  5. System.out.println("参数传递 date ==> "+date);
  6. System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
  7. return "{'module':'data param'}";
  8. }

重新启动服务器,重新发送请求测试,SpringMVC就可以正确的进行日期转换了

07044ef361f44901894ede0f5a05451d.png

#

步骤6:携带时间的日期

接下来我们再来发送一个携带时间的日期,看下SpringMVC该如何处理?

先修改UserController类,添加第三个参数

  1. @RequestMapping("/dataParam")
  2. @ResponseBody
  3. public String dataParam(Date date,
  4. @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
  5. @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2)
  6. System.out.println("参数传递 date ==> "+date);
  7. System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
  8. System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
  9. return "{'module':'data param'}";
  10. }

使用PostMan发送请求,携带两个不同的日期格式,

http://localhost/dataParam?date=2088/08/08&date1=2088-08-08&date2=2088/08/08 8:08:08

e217fd3c81b9454c9fa440164580ad5a.png

重新启动服务器,重新发送请求测试,SpringMVC就可以将日期时间的数据进行转换

4bb7b87f9dc642c1a2952f2debfe1714.png

知识点1:@DateTimeFormat


























名称 @DateTimeFormat
类型 ==形参注解==
位置 SpringMVC控制器方法形参前面
作用 设定日期时间型数据格式
相关属性 pattern:指定日期时间格式字符串

内部实现原理

讲解内部原理之前,我们需要先思考个问题:

  • 前端传递字符串,后端使用日期Date接收
  • 前端传递JSON数据,后端使用对象接收
  • 后台需要的数据类型有很多中
  • 前端传递字符串,后端使用Integer接收
  • 在数据的传递过程中存在很多类型的转换

问:谁来做这个类型转换?

答:SpringMVC

问:SpringMVC是如何实现类型转换的?

答:Converter接口

在框架中,有一个类型转换接口

  • Converter接口

    /**

    • S: the source type
    • T: the target type
      */
      public interface Converter {
      @Nullable
      //该方法就是将从页面上接收的数据(S)转换成我们想要的数据类型(T)返回
      T convert(S source);
      }

注意:Converter所属的包为org.springframework.core.convert.converter

  • Converter接口的实现类

5bd98b6c72a247b9a143454a4cbcf6e1.png

框架中有提供很多对应Converter接口的实现类,用来实现不同数据类型之间的转换。前面咱们其实一直在使用这个类型转换,如:

  • 请求参数年龄数据(String→Integer)
  • json数据转对象(json → POJO)
  • 日期格式转换(String → Date)

==注意:SpringMVC的配置类把@EnableWebMvc当做标配配置上去,不要省略==

发表评论

表情:
评论列表 (有 0 条评论,179人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springMVC参数传递

    本文是本人在学习网络视屏springMVC的过程中的学习笔记。 为了更便于理解我决定从实际使用的角度解释。 我们在浏览器输入地址 http://localhost:808