当前位置: 首页 > news >正文

微头条项目实战:新增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云管家个微协议框架--新版本的利器

在互联网时代&#xff0c;高效、可靠的互联网协议对于实现稳定、安全的数据传输至关重要。E云管家作为一项创新性的IPAD协议构建工具&#xff0c;基于IPAD8.0.37协议为开发者提供了强大而灵活的功能&#xff0c;使他们能够轻松构建高效的通信协议。本文将介绍E云管家的主要特点…...

百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧

原创 | 文 BFT机器人 百度不愧是我国AI技术领域的先行者&#xff0c;每年致力于人工智能领域取得技术产品的突破和创新。据爆料称&#xff0c;百度的文心一言有突破了新境界&#xff0c;开创了文心大模型4.0会员版本。从线上的to C产品到试水商业化&#xff0c;百度都是争先走…...

代码随想录算法训练营第四十七天丨 动态规划part10

121. 买卖股票的最佳时机 思路 动态规划 动规五部曲分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金 &#xff0c;这里可能有疑惑&#xff0c;本题中只能买卖一次&#xff0c;持有股票之后哪还有…...

微前端:quankun

零&#xff1a; 前言 微前端可以将大应用拆分功能独立的微应用&#xff0c;可独立开发部署&#xff0c; 每个微应用可以采用自己的技术栈&#xff0c;这样更好维护和拓展。微前端也会存在跨域 权限控制 数据共享 性能(页面加载时间) 安全 多团队协作(一个团队负责一个页面或模…...

CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)

版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…...

XOR Construction

思路&#xff1a; 通过题目可以得出结论 b1^b2a1 b2^b3a2 ....... bn-1^bnan-1 所以就可以得出 (b1^b2)^(b2^b3)a1^a2 b1^b3a1^a2 有因为当确定一个数的时候就可以通过异或得到其他所有的数&#xff0c;且题目所求的是一个n-1的全排列 那么求出a的前缀异或和arr之后…...

K8S容器持续Terminating无法正常关闭(sider-car容器异常,微服务容器正常)

问题 K8S上出现大量持续terminating的Pod&#xff0c;无法通过常规命令删除。需要编写脚本批量强制删除持续temminating的Pod&#xff1a;contribution-xxxxxxx。 解决 获取terminating状态的pod名称的命令&#xff1a; # 获取media命名空间下&#xff0c;名称带contributi…...

Spring 循环依赖

文章目录 内容总结循环依赖 内容总结 循环依赖 循环依赖只存在于 Spring 中, 是因为 Spring 创建 Bean 的流程中, 依赖注入阶段, 会先从单例池中找, 没有再从定义池中找, 针对定义池中找到的候选项会通过 getBean 创建其单例并缓存到单例池, 此机制导致了存在循环依赖的问题.…...

MySQL 8.0.13升级到8.0.35记录 .NET

1、修改表结构的字符集 utf8 修改成 utf8mb4 utf8_general_ci 修改成 utf8mb4_0900_ai_ci 注&#xff1a;所有地方都要替换。 否则会报错误提示&#xff1a;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都是基于接口的链路级汇总&#xff0c;而OSPF是基于进程的 2.汇总路由什么时候消失? 最后一条明细路由消失的时候&#xff0c;汇总路由消失。 3.汇总之后&#xff0c;汇总路由被通告&#xff0c;本地是否会产生一条指向NULL接口的…...

HashMap存值、取值及哈希碰撞原理分析

HashMap中的put()和get()的实现原理&#xff1a; map.put(k,v)实现原理 首先将k,v封装到Node对象当中&#xff08;节点&#xff09;。 然后它的底层会调用K的hashCode()方法得出hash值。 通过哈希表函数/哈希算法&#xff0c;将hash值转换成数组的下标&#xff0c;下标位置上…...

【SVN】

SVN 1 svn使用1.1 主干合并到分支1.2 分支合并到主干1.3 分支建立1.4 创建分支1.5 切换分支1.6 合并分支1.7 删除分支 2 概念理解 1 svn使用 1.1 主干合并到分支 首先&#xff0c;在本地trunk中先update一下&#xff0c;有冲突的解决冲突&#xff0c;保证trunk和repository已…...

编程语言,脚本语言

脚本语言上手快&#xff0c;快速实现一个小应用如python&#xff1b;编程语言重型&#xff0c;需复杂的设计和较长时间的开发&#xff0c;如java、c...

探索双十一:从技术角度剖析电商狂欢节

每年的11月11日&#xff0c;全球最大的在线购物狂欢节“双十一”在中国掀起了一场规模空前的消费风暴。以阿里巴巴为代表的电商平台和众多品牌商家&#xff0c;不仅为消费者提供了数以亿计的优惠商品&#xff0c;同时也将这一活动打造成了一个科技与商业完美结合的标志事件。本…...

Ubuntu LTS 坚持 10 年更新不动摇

Linux 内核开发者 Jonathan Corbet 此前在欧洲开源峰会上宣布&#xff0c;LTS 内核的支持时间将从六年缩短至两年&#xff0c;原因在于缺乏使用和缺乏支持。稳定版内核维护者 Greg Kroah-Hartman 也表示 “没人用 LTS 内核”。 近日&#xff0c;Ubuntu 开发商 Canonical 发表博…...

Python将多个相同格式的变量存储到列表中

在日常写代码过程中往往会遇到多个相同格式名称的变量需要存储到一个list。 怎么优雅地写出来呢 首先定义变量&#xff0c;然后使用列表推导式存储到列表中 # 定义变量 a_1, a_2 , # 列表推导式完成 a_list [globals()[fa_{i}] for i in range(1, 3)]...

前端字符串转数组对象实现方式-开发bug总结6

问题描述&#xff1a; 后台管理系统&#xff0c;这次投产完线上出现了个问题&#xff01;element-ui组件下拉选项框打开全部都是无数据&#xff0c;而且控制台报错&#xff0c;但是新添加的数据是正常显示的。对比了原因之后发现&#xff0c;新的数据前端传给后端的格式&#…...

99 颜色分类

颜色分类 题解1 双指针题解2 单指针 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...