代码分析步骤:
1.设置断点

2.启动DEBUG模式
2.1数据绑定

选中上面的行,代码如下:
public void bind(ServletRequest request) {
MutablePropertyValues mpvs = new ServletRequestParameterPropertyValues(request);
MultipartRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartRequest.class);
if (multipartRequest != null) {
bindMultipart(multipartRequest.getMultiFileMap(), mpvs);
}
addBindValues(mpvs, request);
doBind(mpvs);
}
MutablePropertyValues mpvs = new ServletRequestParameterPropertyValues(request);
这一行代码做的事情就是将request的parameters转换成一个List<PropertyValue>,PropertyValue具有name和value属性,也就是参数名和参数值

final Method writeMethod = (pd instanceof GenericTypeAwarePropertyDescriptor ?
((GenericTypeAwarePropertyDescriptor) pd).getWriteMethodForActualAccess() :
pd.getWriteMethod());
得到Method
writeMethod.invoke(this.object, value);
实现将参数值绑定到POJO的属性上
2.2 数据类型转换
a.日期格式化-@DateTimeFormat 注解
对java.util.Date、java.util.Calendar、java.long.Long 时间类型进行标注:
– pattern 属性:类型为字符串。指定解析/格式化字段数据的模式,
如:”yyyy-MM-dd hh:mm:ss”
– iso 属性:类型为 DateTimeFormat.ISO。指定解析/格式化字段数据的ISO模式,包括四种:ISO.NONE(不使用) -- 默认、ISO.DATE(yyyy-MM-dd) 、ISO.TIME(hh:mm:ss.SSSZ)、ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ)
– style 属性:字符串类型。通过样式指定日期时间的格式,由两位字符组成,第一位表示日期的格式,第二位表示时间的格式:S:短日期/时间格式、M:中日期/时间格式、L:长日期/时间格式、F:完整日期/时间格式、-:忽略日期或时间格式
数值格式化-@NumberFormat 注解
对类似数字类型的属性进行标注,它拥有两个互斥的属性:
– style:类型为 NumberFormat.Style。用于指定样式类型,包括三种:Style.NUMBER(正常数字类型)、Style.CURRENCY(货币类型)、 Style.PERCENT(百分数类型)
– pattern:类型为 String,自定义样式,如patter="#,###";
日期格式举例:

源码分析:
数据类型转换发生setPropertyValue()当中,SpringMVC提供了很多默认的数据类型转换类

这些转换类存放在一个以LinkedHashSet为核心的Converts类中,使用时以ConverterCacheKey(以转换的源类型(String)和目标类型(Date)为参数实例化对象)为KEY,在Converts中找到对应的转换类型
然后将待转换的对象、源类型、目标类型传入到转换类型的convert方法中得到最终结果

3324

被折叠的 条评论
为什么被折叠?



