您的位置:首页 > 编程语言 > Java开发

SpringMVC数据绑定与转换代码分析

2017-08-19 00:00 369 查看
代码分析步骤:

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方法中得到最终结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: