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

news2024/9/23 5:28:48

文章目录

    • 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++;
            }
        }
        // 与参数列表长度比较,如果不相等,就返回null
        if (count != parameterTypes.length) {
            throw new RuntimeException("参数个数不匹配");
        }
        return args;
    }
2.测试

CleanShot 2024-08-08 at 13.18.40@2x

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

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

相关文章

软件架构的发展经历了从单体结构、垂直架构、SOA架构到微服务架构的过程剖析

1.单体架构 特点: 1、所有的功能集成在一个项目工程中。 2、所有的功能打一个war包部署到服务器。 3、应用与数据库分开部署。 4、通过部署应用集群和数据库集群来提高系统的性能。 优点: 1、项目架构简单,前期开发成本低,周期短,小型项目的首选。 缺点: 1、全部…

c++实现mysql关系型数据库连接与增删改查操作

最近老师让我实现这个功能&#xff0c;顺便发个东西&#xff0c;我感觉mysql从入门到精通这本书写的蛮好的&#xff0c;其实连接数据库就是调用mysql-c-api库里面的函数mysql_real_connect,下来的增删改查&#xff0c;也无非就是cmd命令台里面的语句&#xff0c;插入&#xff1…

Javaweb学习之Vue实践小界面(四)

目录 前情回顾 本期介绍 效果图 第一步&#xff1a;前期工作 第二步&#xff1a;建立页眉 效果图 第三步&#xff1a;建立导航栏 效果图 第四步&#xff1a;主要内容放置 效果图 第五步&#xff1a;建立页脚 效果图 综合&#xff1a;将文字和背景更改成自己喜欢的…

PEM燃料电池启停控制策略优化的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 PEM燃料电池启停控制策略优化的simulink建模与仿真。 1.燃料电池提供是燃料转换为电能和热能的装置。 2.功率的输出的改变通过很多因素&#xff0c;如温度&#xff0c;压力…

谷歌、火狐及Edge等浏览器如何使用allWebPlugin中间件响应ActiveX插件事件

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

模型 OGSM(战略规划)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。目标引领&#xff0c;策略驱动&#xff0c;量化衡量。 1 OGSM模型的应用 1.1 电商企业年度增长战略 某电商企业面临激烈的市场竞争&#xff0c;决定运用OGSM模型来规划其年度战略&#xff0c;以实现…

代码随想录Day 25|回溯篇完结,题目:491.递增子序列、46、全排列、47.全排列Ⅱ

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 第七章 回溯算法part05一、题目题目一&#xff1a;491.递增子序列解题思路&#xff1a;回溯三部曲优化 题目二&#xff1a;46.全排列[46. 全排列](https://leetcode.cn/problems/permutations/)解…

日撸Java三百行(day34:图的深度优先遍历)

目录 一、深度优先搜索 二、图的深度优先遍历 三、代码实现 总结 一、深度优先搜索 深度优先搜索&#xff08;Depth First Search&#xff1a;DFS&#xff09;是一种用于遍历树或图的算法&#xff0c;具体来说就是从起始节点开始&#xff0c;沿某一分支路径不断深入&#…

Linux内核定时器、阻塞_非阻塞IO

一.内核时间管理 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率…

吴恩达谈AI未来:Agentic Workflow、推理成本下降与开源的优势

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域的发展势如破竹&#xff0c;然而随着技术的普及&#xff0c;市场也开始出现对AI泡沫的质疑声。2024年8月&#xff0c;AI领域的权威专家吴恩达&#xff08;Andrew Ng&#xff09;在与ARK Invest的对谈中&#xff0c;分…

利用Matlab求解高阶微分方程(ode45)

1、高阶微分方程的基本概念 二阶以及二阶以上的微分方程称之为高阶微分方程&#xff0c;一般来说&#xff0c;微分方程的阶数越高&#xff0c;求解的难度也就越大。求高阶方程的一个常用方法就是降低阶数。对二阶方程 &#xff0c;如果能用变量代换把它化成一阶方程&#xff0c…

【Tesla FSD V12的前世今生】从模块化设计到端到端自动驾驶技术的跃迁

自动驾驶技术的发展一直是全球汽车行业的焦点&#xff0c;Tesla的Full-Self Driving&#xff08;FSD&#xff09;系统凭借其持续的技术革新和强大的数据支持&#xff0c;在这个领域独占鳌头。本文将深入介绍Tesla FSD V12的演进历史&#xff0c;从自动驾驶的基础概念入手&#…

【XML详解】

XML基本概念 XML&#xff08;全称EXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;&#xff1a;是一种用于存储和传输数据的标记语言&#xff0c;通过标签&#xff08;tags&#xff09;来定义数据的结构和含义。数据格式&#xff1a;XML本质上是一种数据的格…

【异常错误】pycharm可以在terminal中运行,但是无法在run中运行(没有输出错误就停止了)

问题&#xff1a; pycharm的命令可以在terminal中运行&#xff0c;但是复制到无法在run中运行&#xff08;没有输出错误就停止了&#xff09; run中运行后什么错误提示都没有 搞不懂为什么 解决&#xff1a; 降低run中batch-size的大小&#xff0c;即可以运行 我并没有观察到…

视频在线去水印解析相册怎么弄,轻松掌握五大技巧

在当前短视频流行的时代&#xff0c;我们常常需要下载一些短视频来进行剪辑或分享&#xff0c;但视频中的水印却成了一个不小的烦恼。为了帮助大家解决这个问题&#xff0c;本文将介绍五款高效的短视频去水印免费软件&#xff0c;让你轻松告别水印烦恼。 工具一&#xff1a;奈…

在VB.net中,LINQ有什么方法与属性

标题 在VB.net中&#xff0c;LINQ有什么方法与属性 正文 在VB.NET中使用LINQ&#xff08;Language Integrated Query&#xff09;&#xff0c;你可以利用一系列的方法和属性来查询和操作内存中的集合&#xff08;如数组、列表等&#xff09;以及数据库等数据源。LINQ提供了丰富…

Python相关系数导图

&#x1f3af;要点 量化变量和特征关联绘图对比皮尔逊相关系数、斯皮尔曼氏秩和肯德尔秩汽车性价比相关性矩阵热图大流行病与资产波动城镇化模型预测交通量宝可梦类别特征非线性依赖性捕捉向量加权皮尔逊相关系数量化图像相似性 Python皮尔逊-斯皮尔曼-肯德尔 皮尔逊相关系…

QcomboBox 组件

在记事本项目中&#xff0c;有一个问题&#xff0c;字体的编码格式是写死的。我们要建一个 组件提供这样的功能&#xff1a;通过点击&#xff0c;获得 不同的格式编码 定义它的槽 首先 把ui里面的comboBox组件与槽关联起来 connect(ui->comboBox,SIGNAL(currentIndexChange…

cesium加载矢量切片数据(mvt)全网方案总结

引言:Cesium是一款开源的3D地球可视化引擎,支持全球范围的数据展示,包括高分辨率地形、卫星图像和建筑模型等,允许用户创建交互式的3D地图,并提供了一系列的工具和API来处理地理空间数据。 Cesium支持加载多数据源的栅格切片数据,例如ArcGIS、BingMaps、WMTS、WMS等等。栅…

Qt 线程与窗体之间的传值

QThread 和窗口之间的通信通常通过信号和槽机制来实现 也可以直接通过调用线程中的值 效果图(Dialog To hello; TextLabel To hello) 在主窗口类中创建线程实例&#xff0c;并连接线程发出的信号到主窗口的槽函数。 .h #ifndef TESTAPP_H #define TESTAPP_H#include <QD…