微头条项目实战:新增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 分别表示红色、白色和蓝色。 必须在…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...