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

代码分析步骤:

1.设置断点

103634_W6yS_3049601.png

2.启动DEBUG模式

2.1数据绑定

103807_ZUL6_3049601.png

选中上面的行,代码如下:

	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属性,也就是参数名和参数值

104724_xHwb_3049601.png

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="#,###";

 

日期格式举例:

094522_lKFY_3049601.png

 

源码分析:

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

093445_C0Op_3049601.png

这些转换类存放在一个以LinkedHashSet为核心的Converts类中,使用时以ConverterCacheKey(以转换的源类型(String)和目标类型(Date)为参数实例化对象)为KEY,在Converts中找到对应的转换类型

然后将待转换的对象、源类型、目标类型传入到转换类型的convert方法中得到最终结果

 

 

转载于:https://my.oschina.net/u/3049601/blog/1516618

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值