SpringMVC原理分析(如何实现一个自己的SpringMVC)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

SpringMVC简介 

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

SpringMVC的优势

1、清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象(Command  请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。

2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要;

3、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象;

4、和Spring 其他框架无缝集成,是其它Web框架所不具备的;

5、可适配,通过HandlerAdapter可以支持任意的类作为处理器;

6、可定制性,HandlerMapping、ViewResolver等能够非常简单的定制;

7、功能强大的数据验证、格式化、绑定机制;

8、利用Spring提供的Mock对象能够非常简单的进行Web层单元测试;

9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。

10、强大的JSP标签库,使JSP编写更容易。

………………

还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等。


SpringMVC原理和运行流程

废话不多说,我们进入今天的正题,在Web应用程序设计中,MVC模式已经被广泛使用。SpringMVC以DispatcherServlet为核心,负责协调和组织不同组件以完成请求处理并返回响应的工作,实现了MVC模式。想要实现自己的SpringMVC框架,需要从以下几点入手:
       一、了解SpringMVC运行流程及九大组件
       二、梳理自己的SpringMVC的设计思路
       三、实现自己的SpringMVC框架

1、SpringMVC的运行流程

我们用一个图来描述整个流程:


2、SpringMVC的9大组件(【SpringMVC】9大组件概览)

    protected void initStrategies(ApplicationContext context) {
        //用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File.
        initMultipartResolver(context);
        //SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。
        initLocaleResolver(context);
        //用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源、
        //如图片、css样式等。SpringMVC的主题也支持国际化, 
        initThemeResolver(context);
        //用来查找Handler的。
        initHandlerMappings(context);
        //从名字上看,它就是一个适配器。Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法。
        //如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapter要做的事情
        initHandlerAdapters(context);
        //其它组件都是用来干活的。在干活的过程中难免会出现问题,出问题后怎么办呢?
        //这就需要有一个专门的角色对异常情况进行处理,在SpringMVC中就是HandlerExceptionResolver。
        initHandlerExceptionResolvers(context);
        //有的Handler处理完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了,
        //如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。
        initRequestToViewNameTranslator(context);
        //ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。
        //View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。
        initViewResolvers(context);
        //用来管理FlashMap的,FlashMap主要用在redirect重定向中传递参数。
        initFlashMapManager(context);
    }

SpringMVC的设计思路


本文只实现自己的@Controller、@RequestMapping、@RequestParam注解起作用,其余SpringMVC功能读者可以尝试自己实现。

1、读取配置

从图中可以看出,SpringMVC本质上是一个Servlet,这个 Servlet 继承自 HttpServlet。FrameworkServlet负责初始化SpringMVC的容器,并将Spring容器设置为父容器。因为本文只是实现SpringMVC,对于Spring容器不做过多讲解。

为了读取web.xml中的配置,我们用到ServletConfig这个类,它代表当前Servlet在web.xml中的配置信息。通过web.xml中加载我们自己写的MyDispatcherServlet和读取配置文件。

 2、初始化阶段
在前面我们提到DispatcherServlet的initStrategies方法会初始化9大组件,但是这里将实现一些SpringMVC的最基本的组件而不是全部,按顺序包括:
加载配置文件
扫描用户配置包下面所有的类
拿到扫描到的类,通过反射机制,实例化。并且放到ioc容器中(Map的键值对  beanName-bean) beanName默认是首字母小写
初始化HandlerMapping,这里其实就是把url和method对应起来放在一个k-v的Map中,在运行阶段取出

3、运行阶段

每一次请求将会调用doGet或doPost方法,所以统一运行阶段都放在doDispatch方法里处理,它会根据url请求去HandlerMapping中匹配到对应的Method,然后利用反射机制调用Controller中的url对应的方法,并得到结果返回。按顺序包括以下功能:

异常的拦截
获取请求传入的参数并处理参数

通过初始化好的handlerMapping中拿出url对应的方法名,反射调用。

实现自己的SpringMVC框架

工程以及目录结果:


m

逆向分析美团外卖mtgsig3.0签名算法:从抓包到算法还原实战 在移动应用开发与安全领域,API接口签名是保障数据传输完整性与身份验证的核心机制。其基本原理是通过特定的算法,将请求参数、时间戳等数据与密钥结合,生成唯一的签名串,服务器通过验证签名来识别请求的合法性。这项技术的核心价值在于防止数据篡改、重放攻击未授权访问,是构建安全客户端-服务器通信的基石。在实际应用中,签名算法广泛应用于电商、社交、金融等各类App的接口保护场景。本文以美团外卖App的mtgsig3.0签名为具体案例,详细拆解了其生成逻辑。通过结合Frida动态调试与Jadx静态分析,文章深入探讨了如 阅读详情

相关推荐

国产谷歌地球,地形分析秒杀同款地图软件

咱们做地质、林业、水文、水利、电力、GIS、地图、水保、环境的,需要经常用到各种数据,比如影像、地形、矢量、模型等,但目前80%的规划大数据展示都离不开ArcGIS,令人头大的是很多朋友连ArcGIS软件安装起来都费劲。。。 那不会ArcGIS又装不了Google Earth怎么开展工作? 今天推荐大家一款国产免费专业地图浏览下载测量分析神器—图新地球 图新地球,国产三维gis软件。可以查看高清卫星影像地形以及其他很多常用电子地图,对地图需求的掌握远胜过Google Maps,而且上手比国外软件要简单

GISWorld3D的博客 3661

Spring MVC入门(实验9)

实验1 按照教材11.212.5小节内容案例实现步骤完成Spring MVC应用案例代码编写实验2 编写客户信息(客户名称、客户单位、客户职位、客户生日、客户性别、客户联系方式)注册页面cutomer.jsp,提交到控制器customerController中,控制器判断客户是否是“zhangsan”,如果是则将客户信息显示在customerdisp.jsp页面上,否则在页面上提示“注册客户不是zhangsan”。 实验3 SpringMVC 常用注解练习。参考常用注解文档。 学习收获总结:

重庆科技大学XMY的博客 2253

利用 RSAU_LOG_API 把 SAP 安全审核日志接入企业 SIEM 的完整指南

在 SAP 世界里,安全审核日志(Security Audit Log,简称 SAL)是审计合规的核心基础设施之一。系统会在后台把安全相关的关键事件记录下来,比如:(用户登录与登录失败用户锁定、解锁权限对象或角色变更远程调用(RFC)相关活动关键事务码的启动程序直接执行、批处理作业相关的敏感操作传统 ABAP 系统里,这些日志会写到本地应用服务器上的审计文件中(背后对应类似表RSAUENTR2的结构),包含事件标识、客户端、用户、终端、事务码、时间戳等信息。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 122

使用spring boot实现一个简单MVC应用

Spring使用过程中需要大量繁杂的XML文件配置,Spring3之后开始引入“约定大于配置”的理念,Spring Boot就是在这样的理念下抽象出来的框架。它本身并不替代、扩展Spring的特征,而是用于快速、敏捷开发Spring应用,以帮助开发者用少量的配置代码就可以快速上手Spring应用。此外还集成了一些第三方库用于零配置、开箱即用功能,以及大型项目常用的安全、配置等非功能性应用 ...

theVicTory的博客 5642

Spring MVC入门程序编写

实验八——Spring MVC入门程序编写 实验2编写客户信息(客户名称、客户单位、客户职位、客户生日、客户性别、客户联系方式)注册页面customer.jsp,提交到控制器customerController中,控制器判断客户是否是“zhangsan”,如果是则将客户信息显示在customerdisp.jsp页面上,否则在页面上提示“注册客户不是zhangsan

m0_72151428的博客 2401

第二章 Spring MVC入门 —— 跟开涛学SpringMVC

  扫一扫,关注我的公众号    我的新书 购买地址 21Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常...

jinnianshilongnian的专栏 1647

springmvc运行原理

1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。 3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象处理器拦截器)一并返回给DispatcherServlet。 4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封.

java_cn_的博客 386

SpringMVC中Interceptor拦截器实现原理分析

SpringMVC中Interceptor 拦截器讲解: 在SpringMVC实现拦截器需要实现 HandlerInterceptor,其中包含三个需要的方法:preHandle()、postHandle()、afterCompletion() preHandle(): 在Controller method 之前执行,通常用于做参数校验、登录验证等。 postHandle(): 在Contro...

张井天的博客 6955

springmvc源码分析原理简单实现

现在我主要分四步走。一、我们先来看下springmvc的配置与启动流程。这是springspringmvc框架的web应用的web.xml简单配置。虽然这篇博客讲的是springmvc但是,它的启动流程还是离不开Spring的,所以我先简单提下Spring的启动流程,后期会写另一篇博客详细的说一说Spring的,请大家见谅。首先我们看到在这个web.xml中配置了<listener>...

vicoqi的博客 441

SpringMVC实现原理分析

这是大致原理实现图: 那么我们一步步来分析1.DispatcherServlet代表前控制器 负责接收用户请求并且拦截请求, 2.HandlerMapping为处理器映射 根据前端控制器传来的url查找对应的Handler 例如: <!--Handler--> <bean id="/hello" class="com.kuang.controller.HelloControll.

weixin_43323647的博客 140

SpringMVC结合Shiro注解实现权限控制原理分析

在之前项目中,整合过无数次的SSM,但都没有去仔细分析SpringMVC结合Shiro注解实现权限控制的具体流程,刚好今天处理系统的Ajax非法请求的异常信息处理,现将其执行流程以及原理记录如下: 1、启用Shiro注解 系统中如果需要使用Shiro的注解来控制方法级的权限,...

358

java自己实现ioc_springioc原理springmvc项目分析、自己实现IOC

一个面试题开始:你自己实现IOC容器的话,保存bean你会使用什么数据结构来保存呢?现在的很多开发人员(甚至3年以上的)不一定能回答这问题,为什么会这样呢?这个跟现在springboot现在已经高度成熟了,很多配置文件都已经没有了,改用了注解方式,这样一来,很多研发人员很难从原理上深入理解这个问题。所以这个系列课程我,没有从springboot开始,而是选择springmvc。先从目前实际用sp...

weixin_39640024的博客 116

SSM源码分析Spring09-SpringMVC核心原理与手写实现

目录导航前言SpringMVC核心原理源码分析如何理解MVCSpringMVC原理时序图SpringMVC实现原理手写SpringMVCSpringMVC测试后记 前言 在上一节,我们已经整合Spring的IOC与AOP《SSM源码分析Spring08-手写Spring源码V2.0》 本节,我们要做的就是将SpringMVC整合其中。 SpringMVC核心原理源码分析 如何理解MVC...

✎ℳ๓₯㎕...雲淡風輕 725

Spring5源码分析系列(八)SpringMVC设计原理实现

SpringMVC请求处理流程引用SpringinAction上的一张图来说明了SpringMVC的核心组件请求处理流程: ①:DispatcherServlet是SpringMVC中的前端控制器(FrontController),负责接收Request并将Request转发给对应的处理组件. ②:HanlerMapping是SpringMVC完成url到Controller映射的组件...

一个浪子 3045

Spring源码DEBUG指南(3)——SpringMVC执行原理

本篇是SpringMVC源码分析SpringMVC源码风格与IOC不大相同,DispatcherServlet是其核心中转站,它负责将各类对象打包,并让这些对象在框架中转来转去,跟码时要多关注图中绿色的六边形走向。图中的扩展点实际上指的就是SpringMVC的拦截器。 1、图例说明: 2、IOC容器启动及其组件的初始化: 当前源码版本:org.springframework:sprin...

仗键纵码走天涯 509

SpringMVC原理:解析请求参数(源码分析

源码分析SpringMVC解析请求参数原理 一、前言 在使用SpringMVC的时候,我们经常编写controller层的接口,并使用一些注解传递一些参数,那么这些参数是怎么封装进我们的请求的呢?SpringMVC是怎么解析这些参数的呢?本文主要通过源码分析SpringMVC解析请求参数的全过程。 二、准备工作 编写一个Controller类,里面写上一个接口方法 在浏览器中输入URL保证接口可以正常返回: http://localhost:8089/tracy/get/1?username=tracy

qq_44868892的博客 2247

SpringMVC设计原理源码分析

用一张图分析MVC设计原理: ①:DispatcherServlet是SpringMVC中的前端控制器(FrontController),负责接收Request并将Request转发给对应的处理组件. ②:HanlerMapping是SpringMVC完成url到Controller映射的组件.DispatcherServlet接收Request,然后 从HandlerMapping...

学习无止境、创作无瓶颈 609

SpringMVC概念及实现原理

文章目录SpringMVC 概念SpringMVC实现原理原理图:实现流程:Spring SpringMVC的区别联系Spring:SpringMVC:补充: SpringMVC 概念 1.Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量Web框架 2.使用了MVC架构模式的思想,将web层进行职责解耦 3.基于请求驱动指的就是使用请求-响应...

Fzxey的博客 489

这一次搞懂SpringMVC原理

文章目录前言正文请求入口组件初始化调用Controller参数、返回值解析总结 前言 前面几篇文章,学习了Spring IOC、Bean实例化过程、AOP、事务的源码设计思想,了解了Spring的整体运行流程,但如果是web开发,那么必不可少的还有Spring MVC,本篇主要分析在请求调用过程中SpringMVC实现原理,通过本篇要搞懂它是怎么解决请求、参数、返回值映射等问题的。 正文 请求入口 我们都知道前端调用后端接口时,都会通过Servlet进行转发,而Servlet的声明周期包含下面四个阶段:

夜勿语的博客 1403

SpringMVC 源码分析

一、回顾 SpringMVC 原理 二、 SpringMVC 源码分析 1 DispatcherServlet 1.1 DispatcherServlet 继承结构 1.1.1 HttpServletBean HttpServletBean 覆写了 init 方法,主要做一些初始化的工作,将 web.xml 中配置的参数设置到 Servlet 中。比如 servlet 标签的子标签 init-param 标签中配置的参数 1.1.1.1 ServletConf...

奥迪的博客 1192

SpringMvc异步请求的原理分析

Spring

blueheartstone的博客 2197

SpringMVC源码解析---Interceptor拦截器实现原理

文章目录1.概述2.拦截器的实现3.拦截器的配置4.源码分析 1.概述 在上一章节中介绍了SpringMVC的主要核心流程,本章的重点聚焦到其中的一个组件拦截器的介绍。从拦截器的使用方式到拦截器的实现原理详细的说明。 2.拦截器的实现 拦截器有两种实现方式 第一种方式是Interceptor类要实现Spring的HandlerInterceptor接口 第二种方式是继承已经实现了HandlerInterceptor接口的类,例如继承HandlerInterceptor接口的抽象类HandlerInter

gongsenlin341的博客 1524
上一篇: Java的泛型(参数化类型)
下一篇: Spring的Bean加载和三级缓存解决循环依赖
lolitaline
博客等级 码龄21年 57粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值