微头条项目实战:新增RequestHeader注解
1、RequestHeader
package com.csdn.mymvc.annotation; import java.lang.annotation.*; @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface RequestHeader { }2、DispatcherServlet
package com.csdn.mymvc.core; import com.csdn.mymvc.annotation.RequestBody; import com.csdn.mymvc.annotation.RequestHeader; import com.csdn.mymvc.util.RequestUtil; import com.csdn.mymvc.util.ResponseUtil; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import com.csdn.headline.common.Result; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.Arrays; import java.util.Map; @WebServlet("/*") public class DispatcherServlet extends HttpServlet {private final String BEAN_FACTORY = "beanFactory" ;private final String CONTROLLER_BEAN_MAP = "controllerBeanMap" ;@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String[] staticResourceSuffixes={".html",".jsp",".jpg",".png",".gif",".css",".js",".ico"};//index.htmlString uri = request.getRequestURI();if(Arrays.stream(staticResourceSuffixes).anyMatch(uri::endsWith)){RequestDispatcher defaultDispatcher = request.getServletContext().getNamedDispatcher("default");defaultDispatcher.forward(request,response);}else{// uri: /fruit/indexString[] arr = uri.split("/") ;if(arr==null || arr.length!=3){throw new RuntimeException(uri+"非法!");}// [, fruit, index]String requestMapping = "/"+arr[1] ; // /fruitString methodMapping = "/"+arr[2]; // /indexServletContext application = getServletContext();ControllerDefinition controllerDefinition = ((Map<String,ControllerDefinition>)application.getAttribute(CONTROLLER_BEAN_MAP)).get(requestMapping);if(controllerDefinition==null){throw new RuntimeException(requestMapping+"对应的controller组件不存在!");}//获取请求方式,例如:get或者postString requestMethodStr = request.getMethod().toLowerCase();//get_/indexMethod method = controllerDefinition.getMethodMappingMap().get(requestMethodStr+"_"+methodMapping) ;Object controllerBean = controllerDefinition.getControllerBean();try {//第1步:参数处理//获取method方法上的参数Parameter[] parameters = method.getParameters();Object[] parameterValues = new Object[parameters.length];for(int i = 0 ; i< parameters.length;i++){Parameter parameter = parameters[i];//获取参数名称//JDK8之前,通过反射获取到参数对象(Parameter对象)//然后通过parameter.getName()方法是得不到形参的名称的,返回的是arg0,arg1,arg2....//JDK8开始,反射技术得到的Class中可以包含方法形参的名称,不过需要做一个额外的设置:java compiler 中添加一个参数:-parametersString paramName = parameter.getName();Object parameterValue = null ;//获取当前这个参数上的所有注解Annotation[] annotations = parameter.getDeclaredAnnotations();if (Arrays.stream(annotations).anyMatch(annotation -> annotation instanceof RequestBody)) {parameterValue = RequestUtil.readObject(request,parameter.getType());} else if (Arrays.stream(annotations).anyMatch(annotation -> annotation instanceof RequestHeader)) {parameterValue = request.getHeader(paramName);} else{String paramValueStr = request.getParameter(paramName);if(paramValueStr!=null){//获取参数的类型,例如: java.lang.Integer,java.lang.StringString parameterTypeName = parameter.getType().getName();parameterValue = switch (parameterTypeName){case "java.lang.String"->paramValueStr;case "java.lang.Integer"->Integer.parseInt(paramValueStr);default -> null;};}}parameterValues[i]=parameterValue;}//第2步:方法调用//调用controllerBean对象中的method方法method.setAccessible(true);//第3步:结果集处理Object returnObj = method.invoke(controllerBean,parameterValues);if(returnObj!=null && returnObj instanceof Result){Result result = (Result) returnObj ;ResponseUtil.print(response,result);}} catch (IllegalAccessException e) {e.printStackTrace();throw new RuntimeException(e);} catch (InvocationTargetException e) {e.printStackTrace();throw new RuntimeException(e);}}} }
相关文章:
微头条项目实战:新增RequestHeader注解
1、RequestHeader package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.PARAMETER) Retention(RetentionPolicy.RUNTIME) Inherited public interface RequestHeader { }2、DispatcherServlet package com.csdn.mymvc.core; import com.csd…...
E云管家个微协议框架--新版本的利器
在互联网时代,高效、可靠的互联网协议对于实现稳定、安全的数据传输至关重要。E云管家作为一项创新性的IPAD协议构建工具,基于IPAD8.0.37协议为开发者提供了强大而灵活的功能,使他们能够轻松构建高效的通信协议。本文将介绍E云管家的主要特点…...
百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧
原创 | 文 BFT机器人 百度不愧是我国AI技术领域的先行者,每年致力于人工智能领域取得技术产品的突破和创新。据爆料称,百度的文心一言有突破了新境界,开创了文心大模型4.0会员版本。从线上的to C产品到试水商业化,百度都是争先走…...
代码随想录算法训练营第四十七天丨 动态规划part10
121. 买卖股票的最佳时机 思路 动态规划 动规五部曲分析如下: 确定dp数组(dp table)以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金 ,这里可能有疑惑,本题中只能买卖一次,持有股票之后哪还有…...
微前端:quankun
零: 前言 微前端可以将大应用拆分功能独立的微应用,可独立开发部署, 每个微应用可以采用自己的技术栈,这样更好维护和拓展。微前端也会存在跨域 权限控制 数据共享 性能(页面加载时间) 安全 多团队协作(一个团队负责一个页面或模…...
CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)
版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…...
XOR Construction
思路: 通过题目可以得出结论 b1^b2a1 b2^b3a2 ....... bn-1^bnan-1 所以就可以得出 (b1^b2)^(b2^b3)a1^a2 b1^b3a1^a2 有因为当确定一个数的时候就可以通过异或得到其他所有的数,且题目所求的是一个n-1的全排列 那么求出a的前缀异或和arr之后…...
K8S容器持续Terminating无法正常关闭(sider-car容器异常,微服务容器正常)
问题 K8S上出现大量持续terminating的Pod,无法通过常规命令删除。需要编写脚本批量强制删除持续temminating的Pod:contribution-xxxxxxx。 解决 获取terminating状态的pod名称的命令: # 获取media命名空间下,名称带contributi…...
Spring 循环依赖
文章目录 内容总结循环依赖 内容总结 循环依赖 循环依赖只存在于 Spring 中, 是因为 Spring 创建 Bean 的流程中, 依赖注入阶段, 会先从单例池中找, 没有再从定义池中找, 针对定义池中找到的候选项会通过 getBean 创建其单例并缓存到单例池, 此机制导致了存在循环依赖的问题.…...
MySQL 8.0.13升级到8.0.35记录 .NET
1、修改表结构的字符集 utf8 修改成 utf8mb4 utf8_general_ci 修改成 utf8mb4_0900_ai_ci 注:所有地方都要替换。 否则会报错误提示:Character set utf8mb3 is not supported 下面是.NET环境升级遇到的问题 2、MySQL Connector Net 8.0.13 在程…...
flink udtaf 常年不能用
[FLINK-32807] when i use emitUpdateWithRetract of udtagg,bug error - ASF JIRA flink1.18发布的时候 他都显示未解决 但是文档上一直有udtaf...
路由汇总的四要点
1.是基于链路级的还是进程级的? RIP和eigrp都是基于接口的链路级汇总,而OSPF是基于进程的 2.汇总路由什么时候消失? 最后一条明细路由消失的时候,汇总路由消失。 3.汇总之后,汇总路由被通告,本地是否会产生一条指向NULL接口的…...
HashMap存值、取值及哈希碰撞原理分析
HashMap中的put()和get()的实现原理: map.put(k,v)实现原理 首先将k,v封装到Node对象当中(节点)。 然后它的底层会调用K的hashCode()方法得出hash值。 通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上…...
【SVN】
SVN 1 svn使用1.1 主干合并到分支1.2 分支合并到主干1.3 分支建立1.4 创建分支1.5 切换分支1.6 合并分支1.7 删除分支 2 概念理解 1 svn使用 1.1 主干合并到分支 首先,在本地trunk中先update一下,有冲突的解决冲突,保证trunk和repository已…...
编程语言,脚本语言
脚本语言上手快,快速实现一个小应用如python;编程语言重型,需复杂的设计和较长时间的开发,如java、c...
探索双十一:从技术角度剖析电商狂欢节
每年的11月11日,全球最大的在线购物狂欢节“双十一”在中国掀起了一场规模空前的消费风暴。以阿里巴巴为代表的电商平台和众多品牌商家,不仅为消费者提供了数以亿计的优惠商品,同时也将这一活动打造成了一个科技与商业完美结合的标志事件。本…...
Ubuntu LTS 坚持 10 年更新不动摇
Linux 内核开发者 Jonathan Corbet 此前在欧洲开源峰会上宣布,LTS 内核的支持时间将从六年缩短至两年,原因在于缺乏使用和缺乏支持。稳定版内核维护者 Greg Kroah-Hartman 也表示 “没人用 LTS 内核”。 近日,Ubuntu 开发商 Canonical 发表博…...
Python将多个相同格式的变量存储到列表中
在日常写代码过程中往往会遇到多个相同格式名称的变量需要存储到一个list。 怎么优雅地写出来呢 首先定义变量,然后使用列表推导式存储到列表中 # 定义变量 a_1, a_2 , # 列表推导式完成 a_list [globals()[fa_{i}] for i in range(1, 3)]...
前端字符串转数组对象实现方式-开发bug总结6
问题描述: 后台管理系统,这次投产完线上出现了个问题!element-ui组件下拉选项框打开全部都是无数据,而且控制台报错,但是新添加的数据是正常显示的。对比了原因之后发现,新的数据前端传给后端的格式&#…...
99 颜色分类
颜色分类 题解1 双指针题解2 单指针 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在…...
经验分享:国产嵌入式实时操作系统reworks.elf 镜像固化与启动(飞腾E2000Q/龙芯3A3000/Zynq、复旦微7045平台通用)
📖 封面摘要 本文详细整理龙芯(LS2K/3A/2K派)、飞腾E2000、Zynq/复旦微7045三大主流嵌入式平台,启动国产嵌入式实时操作系统reworks.elf镜像的网络引导、本地固化、自动启动完整流程,包含规范命令、操作步骤、速查表、问题排查,命令可直接复制用于开发调试,适合嵌入式…...
从ADR445到MC1403:四种电压基准芯片的温漂实测与选型指南
1. 电压基准芯片的江湖地位与选型痛点 在精密测量设备的设计中,电压基准芯片就像武侠世界里的定海神针——它输出的电压值直接决定了整个系统的测量精度。我十年前设计第一台工业温控仪时,就曾因为选错基准源导致整批产品返工,那次教训让我深…...
TrollInstallerX终极指南:在iOS 14.0-16.6.1设备上轻松安装TrollStore
TrollInstallerX终极指南:在iOS 14.0-16.6.1设备上轻松安装TrollStore 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是一款专为iOS 14.0至…...
Blender MMD Tools实战:打通二次元创作与三维动画的桥梁
Blender MMD Tools实战:打通二次元创作与三维动画的桥梁 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools …...
我的第一个MobileViT项目翻车实录:从数据集坑到评估指标,PyTorch训练避坑指南
MobileViT实战避坑指南:从数据预处理到模型评估的深度复盘 第一次接触MobileViT时,我信心满满地以为能像其他CNN模型一样轻松驾驭。然而从数据集准备到最终评估,几乎每个环节都让我栽了跟头。这篇文章不是标准教程,而是一个真实项…...
G-Helper终极指南:3步修复华硕笔记本屏幕色彩失真问题
G-Helper终极指南:3步修复华硕笔记本屏幕色彩失真问题 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sc…...
这才是全网500多万粉丝都在学的MIT公开课最配套的线性代数教材!
Gilbert Strang教授的《线性代数》(Introduction to Linear Algebra)第六版上市,有同学对比图灵出版的《斯特朗线性代数(第四版)》(Linear Algebra and Its Applications)的不同,从内…...
别再只写同步回调了!聊聊SpringBoot整合支付宝沙箱时,异步通知(notify_url)的那点事儿
深入解析SpringBoot与支付宝沙箱异步通知的实战设计 支付系统作为现代互联网应用的核心模块,其稳定性和可靠性直接影响用户体验和业务连续性。许多开发者在对接支付宝支付时,往往只关注同步回调(return_url)的实现,却忽视了异步通知(notify_…...
【C# 14 原生 AOT 安全部署黄金标准】:Dify 客户端零信任交付的 7 大不可绕过实践
第一章:C# 14 原生 AOT 安全部署 Dify 客户端的战略定位与威胁建模战略定位:轻量、可信、边缘就绪的 AI 交互终端 C# 14 原生 AOT 编译能力使 Dify 客户端摆脱运行时依赖,生成单一、无托管堆、无 JIT 的可执行文件。该模式显著降低攻击面&…...
