1、DispatcherServlet
javapackage com.csdn.mymvc.core; import com.csdn.fruit.dto.Result; import com.csdn.fruit.util.RequestUtil; import com.csdn.fruit.util.ResponseUtil; import com.csdn.mymvc.annotation.RequestBody; 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 org.junit.Test; import java.io.IOException; 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"; @Test public void uri() { String uri = "/fruit/index"; String[] arr = uri.split("/"); System.out.println(Arrays.toString(arr));//[, fruit, index] } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String[] staticResourceSuffixes = {".html", ".jsp", ".jpg", ".png", ".gif", ".css", ".js", ".ico"}; String uri = req.getRequestURI(); if (Arrays.stream(staticResourceSuffixes).anyMatch(uri::endsWith)) { RequestDispatcher defaultDispatcher = req.getServletContext().getNamedDispatcher("default"); defaultDispatcher.forward(req, resp); } else { String[] arr = uri.split("/"); if (arr == null || arr.length != 3) { throw new RuntimeException(uri + "非法!"); } //[, fruit, index] String requestMapping = "/" + arr[1]; String methodMapping = "/" + arr[2]; ServletContext application = getServletContext(); ControllerDefinition controllerDefinition = ((Map<String, ControllerDefinition>) application.getAttribute(CONTROLLER_BEAN_MAP)) .get(requestMapping); if (controllerDefinition == null) { throw new RuntimeException(requestMapping + "对应的controller组件不存在!"); } //获取请求方式,例如:get或者post String requestMethodStr = req.getMethod().toLowerCase(); //get_/index Method 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]; RequestBody requestBodyAnnotation = parameter.getDeclaredAnnotation(RequestBody.class); Object parameterValue = null; if (requestBodyAnnotation != null) { parameterValue = RequestUtil.readObject(req, parameter.getType()); } else { //获取参数名称 //JDK8之前,通过反射获取到参数对象(Parameter对象) //然后通过parameter.getName()方法是得不到形参的名称的,返回的是arg0,arg1,arg2.... //JDK8开始,反射技术得到的Class中可以包含方法形参的名称,不过需要做一个额外的设置: //java compiler中添加一个参数:-parameters String paramName = parameter.getName(); String paramValueStr = req.getParameter(paramName); if (paramValueStr != null) { //获取参数的类型 String 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); Object returnObj = method.invoke(controllerBean, parameterValues); if (returnObj != null && returnObj instanceof Result) { Result result= (Result) returnObj; ResponseUtil.print(resp,result); } } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (InvocationTargetException e) { e.printStackTrace(); throw new RuntimeException(e); } } } }2、FruitController
javapackage com.csdn.fruit.controller; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import com.csdn.fruit.dto.Result; import com.csdn.fruit.pojo.Fruit; import com.csdn.fruit.service.FruitService; import com.csdn.mymvc.annotation.*; @Controller @RequestMapping("/fruit") public class FruitController { @Autowire private FruitService fruitService; @GetMapping("/index") public Result index(Integer pageNo,String keyword) { if (pageNo == null) { pageNo = 1; } if (keyword == null) { keyword = ""; } PageQueryParam pageQueryParam = new PageQueryParam(pageNo, 5, keyword); PageInfo<Fruit> pageInfo = fruitService.getFruitPageInfo(pageQueryParam); return Result.OK(pageInfo); } @PostMapping("/add") public Result add(@RequestBody Fruit fruit) { fruitService.addFruit(fruit); return Result.OK(); } @GetMapping("/del") public Result del(Integer fid){ fruitService.delFruit(fid); return Result.OK(); } @GetMapping("/edit") public Result edit(Integer fid){ Fruit fruit = fruitService.getFruitById(fid); return Result.OK(fruit); } @GetMapping("/getFname") public Result getFname(String fname){ //fname是请求参数 Fruit fruit = fruitService.getFruitByFname(fname); return fruit == null ? Result.OK() : Result.Fail(); } @PostMapping("/update") public Result update(@RequestBody Fruit fruit){ //fruit是请求体参数 fruitService.updateFruit(fruit); return Result.OK(); } }
项目实战:中央控制器实现(4)-实现RequestBody注解的功能-获取请求体参数
丁总学Java2023-11-10 21:28
相关推荐
Miraitowa_cheems8 分钟前
LeetCode算法日记 - Day 81: 最大子数组和CodeCraft Studio14 分钟前
国产化Word处理控件Spire.Doc教程:用Java实现TXT文本与Word互转的完整教程徐子童21 分钟前
数据结构---优先级队列(堆)滑水滑成滑头26 分钟前
**标题:发散创新:智能交通系统的深度探究与实现**摘要:本文将详细siriuuus39 分钟前
Maven 核心概念及生命周期闭着眼睛学算法44 分钟前
【双机位A卷】华为OD笔试之【哈希表】双机位A-跳房子I【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解孔明兴汉1 小时前
Cursor MCP 第一章-第一节-MCP协议简介.md信仰_2739932431 小时前
枚举类Enum反编译后效果TDengine (老段)1 小时前
TDengine 数学函数 LOG 用户手册青皮桔1 小时前
Java+OpenCV实现图片切割