【springboot】√Servlet API参数解析(一)及Model、Map类型源码分析(二)及自定义参数(三)

记住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类型参数的处理。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值