news 2026/7/13 4:28:39

自己动手写一个spring之MVC_1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自己动手写一个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 。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 4:59:21

AI Skills技能系统,让 Agent 自动变强

什么是 Skill Skill&#xff08;技能&#xff09;是一种可复用的功能单元&#xff0c;用于扩展 Agent 的任务执行能力。每个 Skill 封装了特定领域的指令、脚本和参考资料&#xff0c;使 Agent 能够胜任各类专业任务。 这种设计的核心思想是模块化。就像给手机安装 App 一样&a…

作者头像 李华
网站建设 2026/7/13 4:59:42

如何选择一家值得信赖的流水线贴标机供应商?

在现代制造业中&#xff0c;流水线贴标机是提高生产效率和产品包装质量的关键设备之一。然而&#xff0c;在众多供应商中选择一家值得信赖的合作伙伴并非易事。本文将从多个方面探讨如何选择一家可靠的流水线贴标机供应商&#xff0c;并介绍东莞市万志自动化科技有限公司&#…

作者头像 李华
网站建设 2026/7/13 4:59:39

Android 模拟器开启关闭网络

Android 模拟器断网有几种常用方法&#xff0c;取决于你用的是 Android Studio Emulator 还是命令行启动的模拟器。方法 1&#xff1a;模拟器界面直接断网&#xff08;最简单&#xff09;打开模拟器点击右侧工具栏的 “…”&#xff08;Extended controls&#xff09;进入&…

作者头像 李华
网站建设 2026/7/13 4:59:38

SpaceX造富神话点燃资本热情,卫星通信产业在MWC26上海展现新图景

在2026年世界移动通信大会&#xff08;MWC26上海&#xff09;上&#xff0c;卫星通信行业人士热议上市、融资话题。SpaceX的造富神话让全球资本涌入商业航天&#xff0c;我国也在“空天地海”一体化建设发力&#xff0c;卫星物联网和终端发展亮点颇多。SpaceX引发资本热潮 Spac…

作者头像 李华
网站建设 2026/7/13 4:59:41

Wand-Enhancer:免费解锁游戏修改器完整功能的终极指南

Wand-Enhancer&#xff1a;免费解锁游戏修改器完整功能的终极指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer Wand-Enhancer是一款专为Wand&#xf…

作者头像 李华
网站建设 2026/7/12 11:25:35

计算机毕业设计之基于深度学习的复杂场景下船舶目标检测

本研究针对复杂场景下的船舶目标检测问题&#xff0c;设计并实现了一种基于YOLOv11深度学习模型的检测系统。该系统通过多尺度检测、路径聚合网络和自注意力机制等关键技术&#xff0c;有效提升了船舶检测的精度和速度。实验结果表明&#xff0c;该系统在复杂环境恶劣天气、夜间…

作者头像 李华