[springMVC学习]7、数据验证及其格式转换(debug源码解析)
  TEZNKK3IfmPf 2023年11月12日 16 0

简介

        springmvc支持数据验证及其格式转换,配置之后,底层会进行数据类型的自动转换和数据验证。


数据转换

        前端提交的数据为字符串,而我们获取数据的时候一般还有其他类型,如int,float,这是,springmvc就会进行自动的数据类型转换


字符串转基本数据类型

        我们需要什么参数,只需要在方法参数列表中写上即可,springmvc在注入的时候会进行自动的数据类型转换

    @RequestMapping("/f1")
    public String f1(Integer id, Double price) {
        System.out.println("id:" + id + "\tprice:" + price);
        return "success";
    }

         下面为测试信息

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         可以发现,确实进行了数据类型转换,下面就去debug下源码

源码debug 

         首先在InvocableHandlerMethod的invokeRequest方法中获取到请求参数,并判断是否为该方法需要的,类型转换和格式校验也会完成

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

        进入获取参数方法,查看如何实现的

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

 [springMVC学习]7、数据验证及其格式转换(debug源码解析)

         提供的参数为null是因为springmvc在反射时根本没有传这个参数,可能是为了扩展性来进行设置的吧

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         获取到支持该参数的解析器后就进行解析参数了

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

        下面就开始匹配参数了

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         进入类型转换,查看如何实现

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

 [springMVC学习]7、数据验证及其格式转换(debug源码解析)

         由于这里Sting可以转成Interger,所有就直接将其转换进行返回了,如果不能那么执行下面的逻辑,下面代码太多了,总之就是判断是否能够转换

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         到这里,debug就结束了,可以发现,参数的类型转换,先根据参数创建DataBinder,然年就是通过convert转换器来进行的类型转换的


 字符串和特殊类型的转换

        我们知道,日期和货币的格式是最特殊的,因为每个地区的格式都不一样,这是我们就可以通过2个注解来指定提交的数据类型格式,然后进行转换

@DateTimeFormat

        这个注解看名字就指定是进行日期格式化的,下面直接看源码 

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         注释的大概意思就是我们可以通过该注解来标识字段必须为日期格式,有默认的日期格式,也可以自定义日期格式。

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         通过注释可以指定默认格式就是iso的格式,下面看下如何自定义日期格式

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         可以知道自定义日期格式是和SimpleDateFromat一样的,就是y代表年,M代表月这种

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         下面发现还有一个备用匹配模式,也可以进行设置


@NumberFormat

        这个就是声明该字段为数字用的,还是直接看源码 

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         注释大概意思就是可以指定sytle样式,也可以自定义样式,自定义样式使用#来代表数字,例如###.#

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

        可以通过style设置该注解提供的样式,也可以自定义


基本使用

        下面的代码就要求了提交的日期格式和数字格式

    @RequestMapping("/f2")
    public String f2(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date,
                     @NumberFormat(pattern = "##.#") float price) {
        System.out.println("date:" + date);
        System.out.println("price:" + price);
        return "success";
    }

         注意:上面2个注解会先进行默认的转换,如果转换失败才会使用我们自定义的pattern进行转换


源码debug

          到现在,底层是如何转换的,还十分模糊,下面开始debug,前面部分和字符串基本类型转换相同,就不赘述了。 

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         由于大部分流程和上面是一样的,下面就直接跳到核心逻辑部分

[springMVC学习]7、数据验证及其格式转换(debug源码解析)[springMVC学习]7、数据验证及其格式转换(debug源码解析)

 [springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

        我们去看看是如何解析的  

[springMVC学习]7、数据验证及其格式转换(debug源码解析) [springMVC学习]7、数据验证及其格式转换(debug源码解析)

         上面就是@DateTimeFormat的转换,下面来看@NumberFormat的转换

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

[springMVC学习]7、数据验证及其格式转换(debug源码解析)

         可以发现,不管是那种方式,最终还是通过原生的javaAPI来进行转换的


总结

        通过这篇文章,我们知道了springmvc是如进行数据验证以及格式化的,springmvc会解析参数,然后查看是否需要参数类型转换,需要转换的化就获取对应转换器进行转换

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   19天前   43   0   0 java
TEZNKK3IfmPf