记住debug的思路就可以了,大概的记一下,其余的只要变换类型,都是一个debug分析的思路。因此这篇是(一)Servlet API参数解析。
此篇针对这个请求(localhost:8080/goto)的参数类型。
ServletAPI的原生请求对应的参数属于ServletRequestMethodArgumentResolver处理的参数类型中的其中一种:
WebRequest.class.isAssignableFrom(paramType) -》》ServletRequest.class.isAssignableFrom(paramType) MultipartRequest.class.isAssignableFrom(paramType) HttpSession.class.isAssignableFrom(paramType) pushBuilder != null && pushBuilder.isAssignableFrom(paramType) Principal.class.isAssignableFrom(paramType) && !parameter.hasParameterAnnotations() InputStream.class.isAssignableFrom(paramType) Reader.class.isAssignableFrom(paramType) HttpMethod.class == paramType Locale.class == paramType TimeZone.class == paramType ZoneId.class == paramType
下面分别判断paramType是否为WebRequest类型、ServletRequest类型、MultipartRequest(上传下载文件)的(请求):
这里我们讨论的是Servlet API原生的request,因此执行else中三元判断符的后面一段:
进入resolveNativeRequest方法,该方法解析处理原生的请求:
此处的nativeRequest变量是原生请求。
因此,可知Servlet的原生请求是ServletRequestMethodArgumentResolver这个参数解析器来处理:
附上ServletRequestMethodArgumentResolver类的supportsParameter方法源码:
public boolean supportsParameter(MethodParameter parameter) {
Class<?> paramType = parameter.getParameterType();
return WebRequest.class.isAssignableFrom(paramType) ||
ServletRequest.class.isAssignableFrom(paramType) ||
MultipartRequest.class.isAssignableFrom(paramType) ||
HttpSession.class.isAssignableFrom(paramType) ||
pushBuilder != null && pushBuilder.isAssignableFrom(paramType) ||
Principal.class.isAssignableFrom(paramType) && !parameter.hasParameterAnnotations() ||
InputStream.class.isAssignableFrom(paramType) ||
Reader.class.isAssignableFrom(paramType) ||
HttpMethod.class == paramType ||
Locale.class == paramType ||
TimeZone.class == paramType ||
ZoneId.class == paramType;
}
注意:同理可以推得,多debug,试下传递不同类型的参数,前两篇文章提到27中参数解析器那么多,debug了就知道不同的参数解析器对应负责处理的参数是不同的。
下面一篇文章将会介绍Model、Map类型参数的处理。