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

自己动手写一个spring之MVC_1

写在前面

本文看下如何定义MVC部分内容。

1:正文

首先定义requestmapping注解,映射url->处理方法

@Target(value={ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public@interfaceRequestMapping{Stringvalue()default"";}

简单期间,这里暂时只支持用在方法上,spring mvc是支持同时用在类和方法上的,知道即可。接着我们还要定义DispatcherServlet作为拦截web请求的入口(只保留核心代码)

// com.hc.minispring.web.v2.DispatcherServletpublicclassDispatcherServletextendsHttpServlet{@Overridepublicvoidinit(ServletConfigconfig)throwsServletException{super.init(config);sContextConfigLocation=config.getInitParameter("contextConfigLocation");URLxmlPath=null;try{xmlPath=this.getServletContext().getResource(sContextConfigLocation);}catch(MalformedURLExceptione){e.printStackTrace();}// 获取所有要扫描的包this.packageNames=XmlScanComponentHelper.getNodeValue(xmlPath);// 刷新beanRefresh();}protectedvoidRefresh(){// 扫描包,获取所有的controller 实例initController();// 初始化url和对应method的映射initMapping();}protectedvoidinitController(){this.controllerNames=scanPackages(this.packageNames);for(StringcontrollerName:this.controllerNames){Objectobj=null;Class<?>clz=null;try{clz=Class.forName(controllerName);this.controllerClasses.put(controllerName,clz);}catch(ClassNotFoundExceptione){e.printStackTrace();}try{obj=clz.newInstance();this.controllerObjs.put(controllerName,obj);}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}}}protectedvoidinitMapping(){for(StringcontrollerName:this.controllerNames){// ...if(methods!=null){for(Methodmethod:methods){// 判断方法上是否使用了@RequestMapping注解,使用了则获取映射的url,以及对应的方法,存储备用booleanisRequestMapping=method.isAnnotationPresent(RequestMapping.class);if(isRequestMapping){StringmethodName=method.getName();Stringurlmapping=method.getAnnotation(RequestMapping.class).value();// ...// 存储请求web路径和处理该web路径的方法,将会在doGet方法中使用this.mappingMethods.put(urlmapping,method);}}}}}protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{StringsPath=request.getServletPath();// ...try{// 根据请求路径获取处理方法,反射执行,并返回结果Methodmethod=this.mappingMethods.get(sPath);obj=this.mappingObjs.get(sPath);objResult=method.invoke(obj);}catch(SecurityExceptione){// ...}response.getWriter().append(objResult.toString());}}

配置component-scan的配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?><components><component-scanbase-package="com.hc.minispring.web.v2.test"/></components>

在com.hc.minispring.web.v2.test包中我配置了两个类:

publicclassHelloWorldBean{@RequestMapping("/test")publicStringdoTest(){return"hello world for doGet!";}}publicclassHelloWorldBean1{@RequestMapping("/test1")publicStringdoTest(){return"1hello world for doGet!";}}

最后配置下web.xml就行了:

<?xml version="1.0" encoding="UTF-8"?><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID"><servlet><servlet-name>minisMVC</servlet-name><servlet-class>com.hc.minispring.web.v2.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/v2/minisMVC-servletv2.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>minisMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

启动后访问:

C:\Users\dell9020>curl http://localhost:8080/minispring_Web_exploded/test hello world for doGet! C:\Users\dell9020>curl http://localhost:8080/minispring_Web_exploded/test1 1hello world for doGet! C:\Users\dell9020>

这样一个简单的mini springmvc就完成了。这样,应用程序开发人员就不需要关心servlet啥的了,只需要提供一个类似于/WEB-INF/v2/minisMVC-servletv2.xml的配置文件,然后在自定义的component scan路径下写对应的业务代码就可以了。

写在后面

参考文章列表

手把手带你写一个 MiniSpring 。

http://www.cnnetsun.cn/news/3057313.html

相关文章:

  • AI Skills技能系统,让 Agent 自动变强
  • 如何选择一家值得信赖的流水线贴标机供应商?
  • Android 模拟器开启关闭网络
  • SpaceX造富神话点燃资本热情,卫星通信产业在MWC26上海展现新图景
  • Wand-Enhancer:免费解锁游戏修改器完整功能的终极指南
  • 计算机毕业设计之基于深度学习的复杂场景下船舶目标检测
  • AutoCAD2027免费版下载安装教程(附安装包)AutoCAD 2027 保姆级安装教程
  • 豆包专业版实测:从对话AI到桌面Agent的能力升级
  • 【新版本首发】Claude Code v2.1.195 发布:无空格语言(中/日/泰)语音免敲击直出、一键锁定鼠标流、大修权限逃逸漏洞!
  • SERL:让真机强化学习从“难用”走向“可复现”的强化学习框架 ----(3)算法篇(RLPD)
  • 电容降额实战指南:从规范到选型
  • py每日spdier案例之某website文字转音频接口加密参数解密(难度一般)
  • 大模型招聘疯了吧?128万年薪背后,到底谁在抢人
  • 认知循环架构与六种算法的关系
  • 计算机Java毕设实战-基于 SpringBoot 的教职工上下班考勤统计系统设计 校园教职工考勤信息化管理平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java毕设选题推荐:基于 SpringBoot 的教职工请假考勤一体化管理系统 智能化校园教师考勤登记管理系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设项目:基于 SpringBoot 的教师月度考勤汇总管理系统设计 (源码+文档,讲解、调试运行,定制等)
  • STM32 FIR滤波器实战避坑指南:从MATLAB到CMSIS-DSP的高效实现
  • 主流MES系统哪个好:「可自主生长」的MES生产管理系统是趋势
  • Linux 彻底且安全地删除文件
  • Edera革新Xen虚拟化:揭秘NUMA原理与解决方案,提升性能稳定性
  • 用Node.js的child_process模块执行系统命令
  • DLSS Swapper终极指南:免费游戏性能优化工具完整解决方案
  • 世界人工智能大会推出首份刊物《WAIC UP!》,邀全球先锋探究AI时代无限可能
  • 评估板安全使用与工程实践指南:从硬件验证到产品设计
  • SubtitleEdit语音转文字实战指南:3步解决字幕制作效率瓶颈
  • 短剧AI配音实战指南:从选音色到批量出片
  • 多智能体系统实战:从AI Agent原理到投资分析自动化
  • 前端SM2国密算法实战:从sm-crypto封装到前后端联调指南
  • PS-b-PDMS聚苯乙烯-嵌段-聚二甲基硅氧烷二嵌段共聚物