SpringMVC工作原理

2023-11-04

文章搬运自:https://www.cnblogs.com/xiaoxi/p/6164383.html
SpringMVC工作原理

SpringMVC的工作原理图:
在这里插入图片描述

SpringMVC流程
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
组件说明:
以下组件通常使用框架提供实现:
DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。
ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。
组件:
1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供
作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
4、处理器Handler(需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
5、视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。
6、视图View(需要工程师开发jsp…)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
核心架构的具体流程步骤如下:
1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
下边两个组件通常情况下需要开发:
Handler:处理器,即后端控制器用controller表示。
View:视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。

在将SpringMVC之前我们先来看一下什么是MVC模式
MVC:MVC是一种设计模式
MVC的原理图:
在这里插入图片描述
分析:
M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity)
V-View 视图(做界面的展示 jsp,html……)
C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面)

springMVC是什么:
  springMVC是一个MVC的开源框架,springMVC=struts2+spring,springMVC就相当于是Struts2加上sring的整合,但是这里有一个疑惑就是,springMVC和spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,springMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把springMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说springMVC和spring无缝集成,其实springMVC就是spring的一个子模块,所以根本不需要同spring进行整合。
SpringMVC的原理图:
在这里插入图片描述
看到这个图大家可能会有很多的疑惑,现在我们来看一下这个图的步骤:(可以对比MVC的原理图进行理解)
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
第五步:处理器适配器去执行Handler
第六步:Handler执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析
第九步:视图解析器像前端控制器返回View
第十步:前端控制器对视图进行渲染
第十一步:前端控制器向用户响应结果
看到这些步骤我相信大家很感觉非常的乱,这是正常的,但是这里主要是要大家理解springMVC中的几个组件:
前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。
处理器映射器(HandlerMapping):根据URL去查找处理器
处理器(Handler):(需要程序员去写代码处理逻辑的)
处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)
视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC工作原理 的相关文章

  • ES6中数组新增了哪些扩展?

    一 扩展运算符的应用 ES6通过扩展元素符 好比 rest 参数的逆运算 将一个数组转为用逗号分隔的参数序列 console log 1 2 3 1 2 3 console log 1 2 3 4 5 1 2 3 4 5 document
  • 微信小程序中断请求的处理,中断 wx.request() 请求

    在微信小程序中 向后台发出一个请求A 如果长时间后台不返回相应的数据 前端还处于接受状态 这样会引起一些问题 那么就可以在前端代码中直接中断当前的请求 下面发出一个请求 const task wx request url xxxxxxx m
  • 网页显示服务器拒绝了链接,网页出现服务器拒绝链接

    网页出现服务器拒绝链接 内容精选 换一换 主机管理的云服务器列表中仅显示以下主机的防护状态 在所选区域购买的华为云主机已接入所选区域的非华为云主机在所选区域购买的华为云主机已接入所选区域的非华为云主机若未找到您的主机 请切换到正确的区域后再
  • 西门子S7-200SMART控制步进电机(五)

    目录 一 软硬件组成 二 手动控制步进电机旋转方向和速度 三 命令运动轴转以指定的速度运动到所需的位置 四 CPU掉电重启后保持运动控制的当前位置 前面详细讲述了运动控制向导的配置和运动控制指令的使用方法 接下来要讲的是简单程序的编写和调试
  • 【读一读论文吧】BERT

    沐神论文精读B站地址 https www bilibili com video BV1PL411M7eQ spm id from 333 788 paper https arxiv org pdf 1810 04805 pdf usg AL
  • eclipse中报的错:An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio

    在eclipse中新建一个maven项目 进行相应的设置 忽然就卡死了 再次打开就会报出这样的错误 查了下往上很多的解决的方法都是 找到workspace文件夹下的 metadata文件夹 将其删除掉 然后在讲项目重新导入进去eclipse
  • vue+springboot前后端分离项目部署到windows服务器全部流程

    vue springboot前后端分离项目部署到windows服务器 最近看了若依的前后端分离的vue项目 代码撸了一遍之后想要将服务器和前端打包部署到本地windows中 记录自己的部署 一 后端部署 目录结构 项目工程下的pom文件是整
  • CSS面试题26-30

    26 margin 重叠问题的理解 相关知识点 块级元素的上外边距 margin top 与下外边距 margin bottom 有时会合并为单个外边距 这样的现象称为 margin合 并 产生折叠的必备条件 margin必须是邻接的 而根
  • 程序中如何新增微信商户

    1 需要的信息 1 用于微信支付的公众号appid 2 用于微信支付的公众号appkey 3 商户号 4 APIv3密钥 商户支付密钥 V3版本 5 商户证书公钥 apiclient key pem路径 API证书 商户证书 6 微信支付平
  • java int long越界问题_输出越界问题 和 long long 的两数加法问题

    注意方面一 测试 边界的数值 考虑会不会越界 注意方面二 在使用时注意这一点 如下文 直接相加 和赋值后相加不一样 pay more attention 代码 include long long a 44 long long b 44 lo
  • 如何用ChatGPT写出爆款小红书文案,仅3个步骤,快get起来!

    小红书越来越流行了 很多商家和个人都在上面搞运营推广 想要在这个平台众多的内容和用户中脱颖而出 就需要付出很多的时间和精力 你想知道如何快速写出爆款文案 吸引更多的用户浏览 点赞以及关注吗 我发现一个非常好用而且很简单的方法 轻松写出6w
  • 使用Python快速进行Excel合并

    本文记录工作中常遇到的几种Excel文件合并的情景 实际运到问题可以直接运行程序 输入要合并的文件所在的路径就可以实现自动合并 提升工作效率 情形一 Excel属于同一文件夹下 同一文件夹下多个Excel合并 import pandas a
  • Win7复制文件时出现:“您需要权限来执行操作!”(终极解决方法!)

    最近 装了win7需要倒数据 但总是出现 您需要权限来执行操作 提示 而使复制终断 很挠头 后来 发现 原来是 杀毒软件 惹的祸 做程序的朋友请注意 程序复制程序时关闭杀毒软件的2个理由 1 真不知道现在的 杀毒软件 怎么做的 一点水平也没
  • sudo权限

    1 概念 sudo权限就是root把本来只能超级用户执行的命令赋予普通用户执行 sudo的操作对象是系统命令 2 visudo 我们使用visudo来设置sudo 实际上修改的就是 etc sudoers这个文件 3 如何设置sudo权限
  • sh脚本-常用命令

    文章目录 最近碰到的命令 1 curl密令 一 基础命令 Unix命令 1 运行sh脚本命令 2 echo命令 3 exit命令 4 sed命令 5 cut命令 6 awk命令 7 ls命令 8 cat命令 其它命令 二 变量 正则表达式
  • 原子指标,派生指标,衍生指标概念

    指标体系相关概念 1 原子指标 原子指标指的是基于业务过程的度量值 顾名思义是不可以在进行拆分的指标 核心功能 对指标的聚合逻辑进行了定义 三要素 业务过程 度量值 聚合逻辑 2 派生指标 派生指标是基于原子指标的 关系为 派生指标 原子指
  • Docker 常见镜像问题

    Docker 常见镜像问题 Docker 轻松学习 文章目录 Docker 常见镜像问题 一 Docker 是什么 二 如何批量清理临时镜像文件 三 如何查看镜像支持的环境变量 四 docker pull失败 报错提示Error image
  • Elasticsearch—生产环境集群核心配置

    https segmentfault com a 1190000019900040 utm source tag newest
  • C++模板类内友元(友元类,友元函数)声明的三种情况

    根据 C Primer 第三版16 4节的叙述 C 类模板友元分为以下几种情况 1 非模板友元类或友元函数 书上给了一个例子 class Foo void bar template
  • 分页(Paging) / SQL Server / Oracle

    分页 Paging SQL Server Oracle 虽然 DataGrid 控件自己带了一个分页处理机制 但它是将符合查询条件的所有记录读入内存 然后进行分页显示的 随着符合条件的记录数目增多 就会出现运行效率问题 或者至少是资源的利用

随机推荐

  • gprMax中任意不规则形状建模与模拟

    gprMax中任意不规则形状三维建模与模拟 gprMax中给出了不规则几何形状的建模方法 常规的几何建模都是基于gprMax内置的几何命令建模 所建立的模型是规则的 如圆球 正方体 圆柱体 三角体等 不规则形状三维建模需要利用matlab或
  • 没有基础的想转行学习Python怎么学

    无意中听朋友说 Python是一门神奇的语言 他建议我去学习Python 因为 Python 作为一门高级语言 通俗易懂 所以我就锁定了目标 学 Python 由于转行 工作内容和个人规划都对他提出了新的学习要求 如何从繁忙的工作和生活中抽
  • 《大数据基础——基于Hadoop与Spark》课后习题——第一章部分答案

    仅用于我个人的学习 书籍为人民邮电出版社的 大数据技术基础 基于Hadoop与Spark 课后习题选择是我个人认为有用的 记录下来是为了督促我学习 共好 1 请指出以下术语的基本含义 元数据 分布式存储 计算机集群 并行计算 DFS Map
  • C300 之SFU设备配置指导

    认证方式支持 GPON SFU支持SN PW LOID LOID LOID PW四种认证注册方式 EPON SFU支持MAC SN LOID三种认证注册方式 我们一般使用的 OLT EPON板默认是MAC认证方式 如果想用其他方式注册 需要
  • DFS时间复杂度

    DFS算法是一一个递归算法 需要借助一个递归工作栈 故它的空间复杂度为 O N O N O N 遍历图的过程实质上是对每个顶点查找其邻接点的过程 其耗费的时间取决于所采用结构 邻接表表示时 查找所有顶点的邻接点所需时间为
  • html中使用img标签图片无法正常显示

    在学习html css过程中 自己在编辑器里尝试使用img标签来显示图片 是一张鲜花的图片 代码如下 刚开始写的是绝对路径 照片无法正常显示 后来经过问别人 别人建议把 换成 更改后仍然无法正常显示 经检查 图片路径并无错误 这是十分疑惑
  • OCR图像识别技术的JAVA实现(一)

    OCR图像识别技术的JAVA实现 最近有个需求需要用图像识别 学习记录一下 目前网络上的开源的图像识别技术有很多 例如 OCRE OCR Easy Clara OCR OCRAD TESSERACT OCR 等等 今天本blog将记录下te
  • openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句

    文章目录 openGauss学习笔记 35 openGauss 高级数据管理 ALTER TABLE语句 35 1 语法格式 35 2 参数说明 35 3 示例 openGauss学习笔记 35 openGauss 高级数据管理 ALTER
  • Html网页打开自动弹出显示内容或图片

    直接复制到要弹出的页面就可
  • K站中转内最便宜的航班

    LeetCode 787 K站中转内便宜的航班 有 n 个城市通过 m 个航班连接 每个航班都从城市 u 开始 以价格 w 抵达 v 现在给定所有的城市和航班 以及出发城市 src 和目的地 dst 你的任务是找到从 src 到 dst 最
  • gRPC-Go源码解读一 客户端请求链路分析

    最近在学习gRPC相关的知识 为啥要学呢 因为一直在用 古人云 工欲善其事 必先利其器 为此 花了不少时间阅读gRPC Go的源码 收货甚多 比如透过服务发现和负载均衡这俩组件来学习复杂模块之间低耦合高内聚的设计方法 透过bdp采样与htt
  • 生信分析是个什么玩意儿?

    生信小白 老板最近说 要搞搞高大上的全基因组测序 让我去做测序数据分析 可我都不懂哇 生信猿 这不就是生物信息分析嘛 搭建集群 搭建流程 跑跑数据 生信小白 听说你有一个朋友很厉害 可以让他教教我吗 生信猿 你说的是西克孚肉吧 他可是生信方
  • 打开文档时显示:loading UIxml file is failed.for more information, please use KDebugConsole or read logs.

    今天新建一个文档时候 在我打开图片时候报错了 关闭这个页面后 重新打开文档 报了以下错误 点击OK后 而后看到其他人的方法 先看其他软件能否打开 都打不开 就重装系统 要是只有这个打不开就卸载了重新安装WPS 重装系统是不可能重装的 安装W
  • 初识Java

    Java之父 詹姆斯 高斯林 Write once Run anywhere jdk jre jvm的关系 jdk Java开发工具 jre Java运行环境 jvm Java虚拟机 xxx java程序的运行 首先javac xxx ja
  • 【Protobuf】pb中类型字段不匹配问题

    文章目录 背景 结论 原始数据 测试1 测试2 背景 客户端更新proto 新增message字段 探索新增字段的数据类型和标签对服务端反序列化数据的影响 结论 新增字段数据类型与服务端相同标签数据类型 不同 无法获取数据 但是不报错 相同
  • Request应用

    request getRequestDispatcher url 的url可以是相对路径也可以是绝对路径 getRequestDispatcher分成两种 可以用request调用 也可以用getServletContext 调用 不同的是
  • Apache Tomcat 官网下载(保姆级教程)

    目录 前言 一 环境说明 二 官网下载 1 进入官网 2 选择下载版本 3 进入版本页面 4 选择下载 总结 前言 Apache Tomcat 它是目前使用最广泛的Java应用服务器之一 我们在下载的时候千万不要去第三方网站 可以直接官网下
  • 前端下载二进制流pdf文件,下载成功,打开空白问题解决

    做pdf文件下载的时候 后端返回了二进制数据流 前端在发起请求时需要设置responseType arraybuffer 或者blob类型才可以 具体操作可以看我之前的文章 传送门 一开始对接的时候下载打开都是正常的 过后突然就不行了 能下
  • MySQL-----事务管理

    文章目录 前言 一 什么是事务 二 为什么会出现事务 三 事物的版本支持 四 事物的提交方式 五 事务常见的操作方式 六 事务隔离级别 如何理解隔离性1 隔离级别 查看与设置隔离性 读未提交 Read Uncommitted 读提交 Rea
  • SpringMVC工作原理

    文章搬运自 https www cnblogs com xiaoxi p 6164383 html SpringMVC工作原理 SpringMVC的工作原理图 SpringMVC流程 1 用户发送请求至前端控制器DispatcherServ