简介
springmvc支持数据验证及其格式转换,配置之后,底层会进行数据类型的自动转换和数据验证。
数据转换
前端提交的数据为字符串,而我们获取数据的时候一般还有其他类型,如int,float,这是,springmvc就会进行自动的数据类型转换
字符串转基本数据类型
我们需要什么参数,只需要在方法参数列表中写上即可,springmvc在注入的时候会进行自动的数据类型转换
@RequestMapping("/f1")
public String f1(Integer id, Double price) {
System.out.println("id:" + id + "\tprice:" + price);
return "success";
}
下面为测试信息
可以发现,确实进行了数据类型转换,下面就去debug下源码
源码debug
首先在InvocableHandlerMethod的invokeRequest方法中获取到请求参数,并判断是否为该方法需要的,类型转换和格式校验也会完成
进入获取参数方法,查看如何实现的
提供的参数为null是因为springmvc在反射时根本没有传这个参数,可能是为了扩展性来进行设置的吧
获取到支持该参数的解析器后就进行解析参数了
下面就开始匹配参数了
进入类型转换,查看如何实现
由于这里Sting可以转成Interger,所有就直接将其转换进行返回了,如果不能那么执行下面的逻辑,下面代码太多了,总之就是判断是否能够转换
到这里,debug就结束了,可以发现,参数的类型转换,先根据参数创建DataBinder,然年就是通过convert转换器来进行的类型转换的
字符串和特殊类型的转换
我们知道,日期和货币的格式是最特殊的,因为每个地区的格式都不一样,这是我们就可以通过2个注解来指定提交的数据类型格式,然后进行转换
@DateTimeFormat
这个注解看名字就指定是进行日期格式化的,下面直接看源码
注释的大概意思就是我们可以通过该注解来标识字段必须为日期格式,有默认的日期格式,也可以自定义日期格式。
通过注释可以指定默认格式就是iso的格式,下面看下如何自定义日期格式
可以知道自定义日期格式是和SimpleDateFromat一样的,就是y代表年,M代表月这种
下面发现还有一个备用匹配模式,也可以进行设置
@NumberFormat
这个就是声明该字段为数字用的,还是直接看源码
注释大概意思就是可以指定sytle样式,也可以自定义样式,自定义样式使用#来代表数字,例如###.#
可以通过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,前面部分和字符串基本类型转换相同,就不赘述了。
由于大部分流程和上面是一样的,下面就直接跳到核心逻辑部分
我们去看看是如何解析的
上面就是@DateTimeFormat的转换,下面来看@NumberFormat的转换
可以发现,不管是那种方式,最终还是通过原生的javaAPI来进行转换的
总结
通过这篇文章,我们知道了springmvc是如进行数据验证以及格式化的,springmvc会解析参数,然后查看是否需要参数类型转换,需要转换的化就获取对应转换器进行转换