当前位置:网站首页>六、请求处理—获取请求参数系列注解是怎样工作的?
六、请求处理—获取请求参数系列注解是怎样工作的?
2022-08-05 05:16:00 【呆比特】
六、请求处理—获取请求参数系列注解是怎样工作的?
在Spring MVC中,有许多常用的注解,我们给方法的参数前边标注这些注解,Spring MVC就会帮我们按照要求,在调用目标方法的时候,帮这些参数确定好值,我们就可以在下边使用了,总结如下:
@PathVariable -->(获取路径变量)
@RequestHeader -->(获取请求头)
@RequestParam -->(获取请求参数)
@CookieValue -->(获取cookie值)
@RequestBody -->(获取请求体[POST])
@RequestAttribute -->(获取request域属性)
@MatrixVariable -->(矩阵变量)
我们已经很熟练的使用这些注解了,但是,这其中的原理是什么,你知道吗?
同样,来到处理所有请求的入口 DispatcherServlet 的 doDispatch() 方法
这里是上一片看过的请求映射部分,找到了这个请求对应的handler,这里就不在赘述了,继续往下看
找到适配器以后,看他要干什么
再往下走,来到 handle 这个关键方法,这个方法传入了request、response和我们的目标方法,它来帮我们执行目标方法,如下
继续点击step into,就会来到 RequestMappingHandlerAdapter 类的 handleInternal() 方法,然后来到这个方法的 invokeHandlerMethod() 调用,来执行目标方法
进入这个方法
参数解析器是一个接口,里边有两个方法,作用如下
参数解析器下边还有一个返回值处理器,默认15种
Spring mvc提前帮我们把这些解析器、处理器都放到了 ServletInvocableHandlerMethod 里边,继续往下走,跳过中间一些不重要的,直接来到真正执行目标方法的方法
进入这个方法,如下
我们来看这一行代码里边做了什么,如何执行目标方法的
protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
//获取方法上所有参数的详细信息
MethodParameter[] parameters = this.getMethodParameters();
//判空,没有参数列表就直接返回
if (ObjectUtils.isEmpty(parameters)) {
return EMPTY_ARGS;
} else {
//这里new了一个参数个数长度的Object数组
Object[] args = new Object[parameters.length];
//挨个遍历
for(int i = 0; i < parameters.length; ++i) {
//拿到第i个参数
MethodParameter parameter = parameters[i];
//初始化
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
args[i] = findProvidedArgument(parameter, providedArgs);
if (args[i] == null) {
//判断当前解析器是不是支持这种参数类型
//就是遍历前边的那26个参数解析器,看谁支持当前参数
//找到之后放入缓存
if (!this.resolvers.supportsParameter(parameter)) {
throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));
}
try {
//从缓存拿对应的解析器,进行解析
args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
} catch (Exception var10) {
if (this.logger.isDebugEnabled()) {
String exMsg = var10.getMessage();
if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) {
this.logger.debug(formatArgumentError(parameter, exMsg));
}
}
throw var10;
}
}
}
return args;
}
}
接下来接没有必要再跟进去了,里边就到我们的反射工具类了。
经过一步一步的debug,我们终于搞明白那些参数注解是怎样获取值的,其实原理也很简单,就是找到自己匹配的参数解析器,解析出请求参数而且,多debug几遍也就轻车熟路了。
边栏推荐
- SQL(1) - Add, delete, modify and search
- CVPR 2020 - 频谱正则化
- [Pytorch study notes] 9. How to evaluate the classification results of the classifier - using confusion matrix, F1-score, ROC curve, PR curve, etc. (taking Softmax binary classification as an example)
- spark-DataFrame数据插入mysql性能优化
- 【ts】typescript高阶:模版字面量类型
- 常见的 PoE 错误和解决方案
- IJCAI 2022|边界引导的伪装目标检测模型BGNet
- 【ts】typescript高阶:typeof使用
- 华科提出首个用于伪装实例分割的一阶段框架OSFormer
- 面向小白的深度学习代码库,一行代码实现30+中attention机制。
猜你喜欢
[Pytorch study notes] 9. How to evaluate the classification results of the classifier - using confusion matrix, F1-score, ROC curve, PR curve, etc. (taking Softmax binary classification as an example)
关于存储IOPS你必须了解的概念
【数据库和SQL学习笔记】6.SELECT查询4:嵌套查询、对查询结果进行操作
AIDL详解
CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
【数据库和SQL学习笔记】8.SQL中的视图(view)
SQL(1) - Add, delete, modify and search
SQL (2) - join window function view
【ts】typescript高阶:模版字面量类型
【Pytorch学习笔记】10.如何快速创建一个自己的Dataset数据集对象(继承Dataset类并重写对应方法)
随机推荐
CVPR2021 - Inception Convolution with Efficient Dilation Search
[Database and SQL study notes] 8. Views in SQL
2022年中总结关键词:裁员、年终奖、晋升、涨薪、疫情
通过Flink-Sql将Kafka数据写入HDFS
原来何恺明提出的MAE还是一种数据增强
【论文精读】R-CNN 之预测框回归(Bounding box regression)问题详述
Tensorflow踩坑笔记,记录各种报错和解决方法
CVPR 2022 | 70% memory savings, 2x faster training
MaskDistill - Semantic segmentation without labeled data
Mysql-连接https域名的Mysql数据源踩的坑
[Kaggle project actual combat record] Steps and ideas sharing of a picture classification project - taking leaf classification as an example (using Pytorch)
【Promise高级用法】实现并行和串行API
dataframe 常用操作
【ts】typescript高阶:typeof使用
网络信息安全运营方法论 (上)
flink部署操作-flink on yarn集群安装部署
《基于机器视觉测量系统的工业在线检测研究》论文笔记
【Pytorch学习笔记】9.分类器的分类结果如何评估——使用混淆矩阵、F1-score、ROC曲线、PR曲线等(以Softmax二分类为例)
[Go through 9] Convolution
基于Flink CDC实现实时数据采集(一)-接口设计