完成控制器方法获取参数-@RequestParam

文章目录

    • 1.将方法的request和response参数封装到参数数组
        • 1.SunDispatcherServlet.java
          • 1.根据方法信息,返回实参列表
          • 2.具体调用
        • 2.测试
    • 2.封装Http请求参数到参数数组
        • 1.自定义@RequestParam注解
        • 2.MonsterController.java 增加参数
        • 3.SunDispatcherServlet.java
          • 1.resolveMethodArguments 根据方法信息,返回实参列表
          • 2.测试

1.将方法的request和response参数封装到参数数组

1.SunDispatcherServlet.java
1.根据方法信息,返回实参列表
    /*** 根据方法信息,返回实参列表** @param request* @param method* @return*/private Object[] resolveMethodArguments(HttpServletRequest request, HttpServletResponse response, Method method) {// 1. 获取方法的参数列表Class<?>[] parameterTypes = method.getParameterTypes();// 2. 获取请求参数列表Object[] args = new Object[parameterTypes.length];// 3. 遍历参数列表,填充实参for (int i = 0; i < parameterTypes.length; i++) {Class<?> parameterType = parameterTypes[i];if (parameterType == HttpServletRequest.class) {args[i] = request;} else if (parameterType == HttpServletResponse.class) {args[i] = response;} else {// 其他参数类型}}return args;}
2.具体调用

CleanShot 2024-08-08 at 12.55.11@2x

2.测试

CleanShot 2024-08-08 at 12.55.21@2x

CleanShot 2024-08-08 at 12.55.31@2x

2.封装Http请求参数到参数数组

1.自定义@RequestParam注解
package com.sunxiansheng.springmvc.annotation;import java.lang.annotation.*;/*** Description: 自定义RequestParam注解* @Author sun* @Create 2024/8/6 16:09* @Version 1.0*/
@Retention(value = RetentionPolicy.RUNTIME) // 运行时生效
@Target(value = ElementType.PARAMETER) // 作用在参数上
@Documented // 生成文档
public @interface RequestParam {String name() default "";}
2.MonsterController.java 增加参数

CleanShot 2024-08-08 at 13.17.10@2x

3.SunDispatcherServlet.java
1.resolveMethodArguments 根据方法信息,返回实参列表
    /*** 根据方法信息,返回实参列表** @param request* @param method* @return*/private Object[] resolveMethodArguments(HttpServletRequest request, HttpServletResponse response, Method method) {// 1. 获取方法的参数列表Class<?>[] parameterTypes = method.getParameterTypes();// 2. 获取请求参数列表Object[] args = new Object[parameterTypes.length];// 3. 遍历参数列表,填充实参for (int i = 0; i < parameterTypes.length; i++) {Class<?> parameterType = parameterTypes[i];if (parameterType == HttpServletRequest.class) {args[i] = request;} else if (parameterType == HttpServletResponse.class) {args[i] = response;} else {// 查看是否有@RequestParam注解if (method.getParameters()[i].isAnnotationPresent(RequestParam.class)) {// 获取参数名String parameterName = method.getParameters()[i].getAnnotation(RequestParam.class).name();// 从请求参数中获取参数值,并填充到实参列表String parameter = request.getParameter(parameterName);args[i] = parameter;} else {// 没有注解,就取得参数名字,作为请求参数名String parameterName = method.getParameters()[i].getName();// 从请求参数中获取参数值,并填充到实参列表String parameter = request.getParameter(parameterName);// 判空if (parameter == null || parameter.isEmpty()) {log.error("参数名匹配失败:{}", parameter);}args[i] = parameter;}}}// 遍历实参列表统计参数个数int count = 0;for (Object arg : args) {if (arg != null) {count++;}}// 与参数列表长度比较,如果不相等,就返回nullif (count != parameterTypes.length) {throw new RuntimeException("参数个数不匹配");}return args;}
2.测试

CleanShot 2024-08-08 at 13.18.40@2x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式备查

一、常用 符号内容\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c;“n”匹配字符“n”。“\n”匹配换行符。序列“\”匹配“\”&#xff0c;“(”匹配“(”。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还…

ARM工作模式

ARM ARM架构ARM七个工作模式寄存器异常向量表存储格式&#xff08;内存大小端&#xff09;汇编指令 ARM架构 RAM&#xff1a;随机访问存储器 ROM&#xff1a;只读访问存储器 AHB&#xff1a;先进高速总线 APB&#xff1a;先进外设总线 USB&#xff1a;统一串行总线 norflash&am…

Python爬虫案例二:获取虎牙主播图片(动态网站)

爬虫流程&#xff1a;优先假设是JSON数据&#xff0c;抓包方式只能翻页JSON数据HTML数据1.异步数据&#xff08;即先返回HTML&#xff0c;再返回目标的数据&#xff0c;只是触发了JSON请求&#xff09;&#xff0c;不在HTML中2.不能刷新网页&#xff0c;直接翻页 测试链接&…

基于Vue.js+Express的夕阳红养老院管理系统的设计与实现--附源码98650

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 相关技术介绍 2.1 Express框架介绍 2.2 Vue.js 2.3 MySQL数据库 2.4 Node.js主要功能 3系统分析 3.1 可行性分析 3.2 系统流程分析 3.2.1 数据新增流程 3.2.2 数据修改流程 3.2.3数据删除…

【Android】Glide模块工作原理

Glide模块工作原理 每个Glide模块包含一个Decoder&#xff0c;和一个Transcoder Decoder负责将DataSource转换为对应的Resource Transcoder负责将对应的Resource&#xff0c;转换为Drawable GlideModule示例 这里以SVG为例&#xff0c;展示下GlideModule是如何定义的 cla…

Java中等题-完全平方数(力扣)

给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 不是。 示…

AWS SAM CLI 备忘单!

安装 AWS SAM CLI brew tap aws/tap brew 安装 aws-sam-cli 验证安装 $ sam --version 升级 SAM $ brew upgrade aws-sam-cli 您需要 AWS 凭证才能在 AWS 上工作。 构建并部署简单应用程序 $ sam init→ 下载示例应用程序 $ sam build→ 构建您的应用程序 $ sam deploy --guid…

记录自己的嵌入式学习之路

一、STM32软件编程 【STM32】C语言基础补充-CSDN博客 【STM32】写Keil程序的注意事项-CSDN博客 【STM32】一些外设通用内容-CSDN博客 二、嵌入式硬件设计 未完待续

go设计模式———适配器模式

适配器模式是一种设计模式&#xff0c;用来解决接口不兼容的问题。它的作用是让原本因为接口不兼容而无法一起工作的类能够协同工作。通俗地说&#xff0c;它就像是一种“转换器”&#xff0c;能够把一种接口转化为另一种接口&#xff0c;从而让不同的系统或组件可以一起使用。…

联合体成员的访问——真题讲解

【题目】 阅读下述代码&#xff0c;请问修改data的value成员以存储3.14&#xff0c;正确的方式是() union Data { int num; float value; char symbol; }; union Data data; A. data.value 3.14; B. value.data 3.14; C. data->value 3.14; D. value->data 3.1…

Java学习_18_Stream流

文章目录 前言一、不可变集合二、Stream流思想第一步&#xff1a;得到Stream流第二步&#xff1a;Stream流的中间方法Stream流的终结方法 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容&#xff1a;BV17F411T7Ao 一、不可变集合 不可变集合就是长度和内容都不可…

希尔排序,详细解析(附图解)

1.希尔排序思路 希尔排序是一种基于插入排序的算法&#xff0c;通过将原始数据分成若干个子序列&#xff0c;然后对子序列进行插入排序&#xff0c;逐渐减小子序列的间隔&#xff0c;最后对整个序列进行一次插入排序。 1.分组直接插入排序&#xff0c;目标接近有序--------…

transformers调用llama的方式

transformers调用llama的使用方式 不同版本llama对应的transformers库版本llama2llama3Meta-Llama-3-8B-InstructMeta-Llama-3-8B llama3.1Meta-Llama-3.1-8B-Instruct 不同版本llama对应的transformers库版本 # llama2 pip install torch1.13.1cu116 torchvision0.14.1cu116 …

C语言贪吃蛇之BUG满天飞

C语言贪吃蛇之BUG满天飞 今天无意间翻到了大一用C语言写的贪吃蛇&#xff0c;竟然还标注着BUG满天飞&#xff0c;留存一下做个纪念&#xff0c;可能以后就找不到了 /* 此程序 --> 贪吃蛇3.0 Sur_流沐 当前版本&#xff1a; Bug满天飞 */ #include<stdio.h> #includ…

【补充篇】AUTOSAR多核OS介绍(下)

文章目录 前文回顾1 AUTOSAR OS1.1 AUTSOAR OS元素1.1.1 操作系统对象1.1.2 操作系统应用程序1.1.3 AUTOSAR OS裁剪类型1.1.4 AUTOSAR OS软件分区1.2 AUTOSAR OS自旋锁1.3 AUTOSAR OS核间通信1.4 AUTOSAR OS多核调度前文回顾 在上篇文章【补充篇】AUTOSAR多核OS介绍(上)中,…

docker常见指令——镜像指令and容器指令

docker镜像指令 查看镜像 docker images 搜索镜像 docker search 镜像名 上传镜像 docker pull 镜像名 或 docker pull 镜像名&#xff1a;tag 注:不加:tag表示最新版本 &#xff0c;加:tag表示指定版本 运行镜像 docker run 镜像名 保存镜像 docker save 镜像名/镜像id -o 要…

OpenMax算法详解:深度学习中的高效开集识别技术

OpenMax算法详解&#xff1a;深度学习中的高效开集识别技术 在深度学习领域&#xff0c;模型的识别能力往往受限于其训练数据集的范畴。传统的分类模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;或循环神经网络&#xff08;RNN&#xff09;&#xff0c;通常被设计…

算法5:位运算

文章目录 小试牛刀进入正题 没写代码的题&#xff0c;其链接点开都是有代码的。开始前请思考下图&#xff1a; 小试牛刀 位1的个数 class Solution { public:int hammingWeight(int n) {int res 0;while (n) {n & n - 1;res;}return res;} };比特位计数 class Solution…

关于我的生信笔记开通《知识星球》

关于知识星球 1. 为什么到现在才开通《知识星球》 从很早关注我的同学应该了解小杜的知识分享历程&#xff0c;小杜是从2021年11月底开始进入此“坑”&#xff0c;一直坚持到现在&#xff0c;马上3年了&#xff08;24年11月底到期&#xff09;。自己也从一个小青年&#xff0…

什么是网页爬虫技术

网页爬虫技术&#xff08;Web Crawler Technology&#xff09;是一种自动化浏览互联网并收集信息的程序或脚本。这些程序模拟人类用户的行为&#xff0c;通过HTTP请求访问网页&#xff0c;并解析网页内容&#xff08;通常是HTML文档&#xff09;&#xff0c;从中提取出所需的数…