简述springmvc的流程

news2024/11/19 16:23:56

4、SpringMVC的执行流程

  1. 用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获。

  2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:

a) 不存在

i. 再判断是否配置了mvc:default-servlet-handler

ii. 如果没配置,则控制台报映射查找不到,客户端展示404错误

iii. 如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML),找不到客户端也会展示404错误

b) 存在则执行下面的流程

  1. 根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。

  2. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。

  3. 如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】

  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

a) HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

b) 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

c) 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

d) 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

  1. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。

  2. 此时将开始执行拦截器的postHandle(…)方法【逆向】。

  3. 根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。

  4. 渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。

  5. 将渲染结果返回给客户端。

先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程

springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器

然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它

先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程

springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器

然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它

先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程

springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器

然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ey7KOniN-1685020606243)(C:\Users\李开恩\AppData\Roaming\Typora\typora-user-images\image-20230525205311919.png)](https://img-blog.csdnimg.cn/703c8826a92c4a4aa107cb3ac6e7af5b.png)

它又执行了doservice方法 最终是调用了dispatchservlet的doDispatch方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5n2AHjhn-1685020606245)(C:\Users\李开恩\AppData\Roaming\Typora\typora-user-images\image-20230525205851267.png)]

判断是什么类型的请求

对应到具体的Controller 这里会创建一个handlerAdapter ha=new … 控制器适配器对象因为每个controller是不同的处理 有的是返回model and view 有的是model各种 创建ha前面的实例

再由 ha.hanlder 这一操作处理controller中的各种操作 对于方法的参数进行入参 这里面hanlder已经对数据进行了类型转换

​ 经过controller中的操作 最终返回一个 mv对象 接着找到视图解析器 如Thymleaf 通过thymleafResvoler的render方法来出来出view 视图名称经过转发到具体的页面 并且将model渲染到页面上

另外interceptor 执行的节点 第一是 pre方法 disservlet 之后controller之前 以及post方法 在controller执行还有回到Dispatchservlet前面 然后最后执行完所有流程之后 执行aftercompletion方法

它又执行了doservice方法 最终是调用了dispatchservlet的doDispatch方法

判断是什么类型的请求

对应到具体的Controller 这里会创建一个handlerAdapter ha=new … 控制器适配器对象因为每个controller是不同的处理 有的是返回model and view 有的是model各种 创建ha前面的实例

再由 ha.hanlder 这一操作处理controller中的各种操作 对于方法的参数进行入参 这里面hanlder已经对数据进行了类型转换

​ 经过controller中的操作 最终返回一个 mv对象 接着找到视图解析器 如Thymleaf 通过thymleafResvoler的render方法来出来出view 视图名称经过转发到具体的页面 并且将model渲染到页面上

另外interceptor 执行的节点 第一是 pre方法 disservlet 之后controller之前 以及post方法 在controller执行还有回到Dispatchservlet前面 然后最后执行完所有流程之后 执行aftercompletion方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/569063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day05 java_Spring IoC 和 DI

为什么使用spring框架 1.解耦代码(每次使用都要new一个对象) 2.解决事务繁琐问题(创建对象----初始化----调用方法销毁对象) 3.使用第三方框架麻烦的问题 总结:spring是一个轻量级的Ioc,Di和AOP容器 轻量级:简洁,高效,低依赖 **容器:**创建对象并将对象存储对象,同时管理…

高矿化度矿井水深度除氟装置CH-87技术解析

高矿化度矿井水是指含有高浓度溶解性矿物质的废水,通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征,对环境…

性能测试计划不会写?我告诉你有模板你看不看

目录 1 简介 2 测试进入条件 3 测试退出条件 4 性能测试需求 5 测试风险 6 测试时机 7 测试策略 8 测试资源 9 测试进度 10 交付物 1 简介 1.1 目的 【描述性能测试计划的目的。】 1.2 背景 【描述项目或产品的背景。】 1.3范围 【描述性能测试的整体范围。】 2 测试进入条件 【…

Java如何配置环境变量

Java如何配置环境变量 0. 前言1. 下载Java2. 配置环境变量2.1新建 Java_Home2.2 编辑Path情况1情况2 3. 验证安装 0. 前言 本节记录如何配置Java环境变量,用自己重装过的系统实操 操作系统:Windows10 专业版 Java版本:jdk1.7.0_07 1. 下载…

全网最详细,Selenium自动化测试问题总结+解决,跟着大佬上高速...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Selenium4自动化测…

性能测试工程师必看——性能测试报告模板

目录 1. 测试概述 1.1 测试目标 1.2 指标和术语 2. 环境、工具 2.1 测试环境 2.2 测试工具 3. 测试方案 3.1 测试类型 3.2 业务模型 3.3 加密验签处理 3.4 压力梯度 4. 测试结果 4.1 聚合报告 4.2 系统吞吐量 4.3 资源占用率 5. 分析和建议 5.1 测试结论分析 …

Sqoop伪分布式配置

目录 一、Sqoop下载 二、解压 三、添加环境变量 四、复制sqoop-env-template.sh文件 五、编辑组件路径 六、拷贝Mysql与Hive驱动文件 七、验证 一、Sqoop下载 安装包下载地址:Sqoop 官网 二、解压 解压和重命名文件 tar -zxvf sqoop-1.4.7.bin__hadoop-2.…

006 - STM32学习笔记 - RCC时钟树

006 - STM32学习笔记 - RCC时钟树 本节内容一定要结合RCC时钟树和官方手册学习,如果看不明白的话,建议看一下野火官方的教程,火哥讲这节讲的很详细,看一遍基本就能理解了。 上节内容中分析了启动代码,在启动代码中看…

Redis - Redis16个常见使用场景

1、缓存 String类型 例如:热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据 作为Key-Value形态的内存数据库,Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数…

【面试题】操作系统面试实战

version:1.0 文章目录 操作系统进程管理🙎‍♂️面试官:进程和线程的区别?🙎‍♂️面试官:进程有哪几种状态?🙎‍♂️面试官:进程间的通信方式?🙎‍♂️面试…

体验使用 InsCode AI 创作助手 来帮我完成一篇博客

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 InsCode AI 创作助手 它来啦回答不满意可以要求重新生成在输入 prompt 时&#…

Selenium2023最全攻略(元素操作,浏览器操作等)附完整代码!

一、元素操作方法 方法: 1、.send_keys() # 输入方法 2、.click() # 点击方法 3、.clear() # 清空方法 注意:在输入方法之前一定要清空操作!! # 导包 from time import sleep from selenium import webdriver # 实例化浏览器 driver webdriver.Chrome(…

XDP入门--之eBPF sample内核示例代码的编译

Linux内核代码提供了很多eBPF的示例代码(以linux6.1版本内核代码为例),我们可以在/Linux/samples/bpf目录下找到示例代码。 1、查看Linux内核版本 本文不讨论交叉编译的情况,因为eBPF还在快速发展中,不同版本的Linux内核的支持情况不太一至…

网络安全就业有什么要求?一般人还真不行

前言 网络安全工程师又叫信息安全工程师。随着互联网发展和 IT 技术的普及,网络和 IT 已经日渐深入到日常生活和工作当中,社会信息化和信息网络化,突破了应用信息在时间和空间上的障碍,使信息的价值不断提高。但是与此同时&#…

接口自动化框架(Pytest+request+Allure)

前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱。 接口自动化包含2个部分,功能性的接口自动化测试和并发接口自动化测试。 本次文章着重介绍第一种&#xff0c…

程序员职业病之中医颈椎痛缓解办法

✨求关注~ 😀博客:www.protaos.com 治疗颈椎病的穴位按摩是一种传统中医疗法,可以缓解颈椎病引起的疼痛和不适。下面是关于五个常用穴位的介绍、取穴定位、按摩方法和功效主治的总结: 人体穴位图 穴位图 1. 揉捏风池穴&#xf…

Linux 备份要点

文章目录 Linux 备份要点确定备份的目录和文件备份的种类、频率与工具的选择完整备份增量备份差异备份镜像备份 定期备份远程备份的脚本使用rsync上传备份数据 Linux 备份要点 在Linux系统中,备份数据是非常重要的,特别是在生产环境中。以下是Linux备份…

【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法

💯 博客内容:【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信&…

Hadoop HA(高可用)搭建

ZooKeeper配置 解压安装 添加ZK环境变量 分发文件 启动 安装配置 Hadoop 解压安装 修改hadoop-env.sh文件 修改Hadoop配置文件core-site.xml HDFS 配置文件hdfs-site.xml MapReduce 配置文件 mapred-site.xml YARN 配置文件yarn-site.xml 配置worekers 分发配…

Nginx配置文件

四.Nginx配置 1.位置 /usr/local/nginx/conf/nginx.conf2.内容 Nginx的主配置文件是nginx.conf,这个配置文件一共由三部分组成,分别为全局块、events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,可…