当前位置: 首页 > 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);}}}
}

http://www.lryc.cn/news/224721.html

相关文章:

  • E云管家个微协议框架--新版本的利器
  • 百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧
  • 代码随想录算法训练营第四十七天丨 动态规划part10
  • 微前端:quankun
  • CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)
  • XOR Construction
  • K8S容器持续Terminating无法正常关闭(sider-car容器异常,微服务容器正常)
  • Spring 循环依赖
  • MySQL 8.0.13升级到8.0.35记录 .NET
  • flink udtaf 常年不能用
  • 路由汇总的四要点
  • HashMap存值、取值及哈希碰撞原理分析
  • 【SVN】
  • 编程语言,脚本语言
  • 探索双十一:从技术角度剖析电商狂欢节
  • Ubuntu LTS 坚持 10 年更新不动摇
  • Python将多个相同格式的变量存储到列表中
  • 前端字符串转数组对象实现方式-开发bug总结6
  • 99 颜色分类
  • 计算机视觉与深度学习 | 基于GPS/BDS多星座加权图因子优化的行人智能手机导航
  • 低代码平台,业务开发的“银弹”
  • 补偿 FIR 滤波器引入的延迟
  • 图数据库Neo4j详解
  • 系列一、Shiro概述
  • SpringCloudAlibaba——Sentinel
  • Java编写简易rabbitmq生产者与消费者
  • 3.0.3版vsftpd所支持的FTP命令
  • OTA包添加自定义内容
  • Luatos Air700 改变BL0942串口波特率
  • 不可忽视的国外服务器地址IP选择指南