DispatcherServlet最全详解

2023-10-28

文章目录

DispatcherServlet最全详解

DispatcherServlet族谱

DispatcherServlet族谱

一、语言总结

1.DispatcherServlet初始化

	1.servlet初始化会调用init()方法,
	2.GenericServlet重写了方法调用自己重写的init()方法,
	3.HttpServlet没有重写方法直到HttpServletBean()重写了init方法并调用initServletBean
		(大致意思是将配置参数映射到该servlet的bean属性上,以及调用子类初始化 ),
	4.FrameworkServlet重写了initServletBean()方法 方法内部 调用了initWebApplicationContext()进行了SpringMVC容器初始化,
		然后调用onRefresh()进行初始化
	5.DispatcherServlet重写onRefresh()方法继续套娃调用initStrategies()方法实现容器刷新策略 
	初始化完成之后将ioc容器共享到应用域中 
			**扩展内容:**
	【 4.1 initWebApplicationContext()内部调用了createWebApplicatioContext()方法创建WebApplicationContext
		4.2	在createWebApplicationContext()方法中用反射创建了ConfigurableWebApplicationContext容器
				然后设置了它的环境以及它的父容器(将SpringIOC容器设置为SpringMVCIOC的父容器)然后将容器返回
			    扩展:共享名称 == 全类名 + .CONTEXT. +DispatcherServlet】  

2.DispatcherServlet调用组建处理请求

	1.servlet处理请求会调用service方法 继续等着儿子去重写方法
	2. HttpServlet这里重写以及重载了方法  先是重写将参数向下转型然后调用重载的Servlet()方法
	3. FrameworkServlet重写了方法多加了一个判断PATCH请求 如果是继续调用它爷爷HttpServlet的方法
	 如果请求不是PATCH则调用自己重写的方法processRequest() ,processRequest() 调用 doService()方法,
	 但是doService()又是抽象方法未实现功能所以继续找儿子 
	4.DispatcherServlet继承doService()最终获得ModelAndView对象

二、DispatcherServlet初始化

1.servlet初始化会调用init方法

	从servlet开始
	servlet初始化会调用init方法

Servlet init方法

2. servlet子类GenericServlet重写了方法调用自己重写的init方法

  servlet子类GenericServlet重写了方法调用自己重写的init方法

  servlet子类GenericServlet重写了方法调用自己重写的init方法

3.HttpServletBean重写了init方法

HttpServlet没有重写方法直到HttpServletBean重写了init方法
大致意思是将配置参数映射到该servlet的bean属性上,以及调用子类初始化 
然后写了一个initServletBean抽象方法留给子类

HttpServlet

4.FrameworkServlet重写了initServletBean方法

FrameworkServlet重写了initServletBean方法 方法内部 调用了initWebApplicationContext
进行了SpringMVC容器初始化

在这里插入图片描述
创建WebApplicationContext过程
调用createWebApplicatioContext方法创建WebApplicationContext

在这里插入图片描述

继续套娃调用

在这里插入图片描述

	在createWebApplicationContext方法中用反射创建了ConfigurableWebApplicationContext容器
	然后设置了它的环境以及它的父容器(将SpringIOC容器设置为SpringMVCIOC的父容器)然后将容器返回

在这里插入图片描述

这里进行了数据共享 将WebApplicationContext在应用域进行了共享

在这里插入图片描述

共享应用域的名称

共享名称 == 全类名 + .CONTEXT. +DispatcherServlet

在这里插入图片描述

容器刷新 初始化

	继续让儿子去实现

在这里插入图片描述

6.DispatcherServlet重写方法继续套娃调用initStrategies 实现容器刷新策略

	初始化完成之后将ioc容器共享到应用域中 
protected void initStrategies(ApplicationContext context) { 
initMultipartResolver(context); 			//初始化文件上传解析器
initLocaleResolver(context);				 
initThemeResolver(context); 
initHandlerMappings(context); 				//初始化处理器映射器
initHandlerAdapters(context); 				//初始化处理器适配器
initHandlerExceptionResolvers(context); 	//初始化异常处理器
initRequestToViewNameTranslator(context); 	 
initViewResolvers(context); 				//初始化视图解析器
initFlashMapManager(context); 				
}

在这里插入图片描述

二、DispatcherServlet调用组建处理请求

1.servlet处理请求会调用service方法 继续等着儿子去重写方法

老样子从servlet开始

在这里插入图片描述

2.GenericServlet继承了并未重写 继续往下找儿子

在这里插入图片描述

3.HttpServlet这里重写以及重载了方法 先是重写将参数向下转型然后调用重载的Servlet方法

在这里插入图片描述

4.重载的Servlet方法获取请方式然后进行调用

在这里插入图片描述

5.FrameworkServlet重写了方法多加了一个判断PATCH 然后继续调用它爷爷HttpServlet的方法

	(HttpServletBean是没有对方法进行重写的)
	如果请求不是PATCH则调用自己重写的方法processRequest

在这里插入图片描述

这里处理请求的方法是继续调用doService 但是doService又是抽象方法未实现功能所以继续找儿子

在这里插入图片描述

在这里插入图片描述

6.DispatcherServlet继承doService

doService方法

	doService这里往请求域一顿扔垃圾继续调用doDispatch进行统一处理请求和响应

在这里插入图片描述
在这里插入图片描述

doDispatch方法

	后面我会更新MVC执行流程 
	因为我本身就是自学的小白码的很差劲 我会努力做的更好
	希望能对学到MVC的朋友们有所帮助   (点个赞吧码了挺久的。)

在这里插入图片描述

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        boolean multipartRequestParsed = false;
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        try {
            try {
                ModelAndView mv = null;
                Exception dispatchException = null;
                try {
                    processedRequest = this.checkMultipart(request);
                    multipartRequestParsed = processedRequest != request;
                    mappedHandler = this.getHandler(processedRequest);
				/* mappedHandler:调用链 包含handler、interceptorList、interceptorIndex 
				handler:浏览器发送的请求所匹配的控制器方法 
				interceptorList:处理控制器方法的所有拦截器集合 
				interceptorIndex:拦截器索引,控制拦截器afterCompletion()的执行 */
                    if (mappedHandler == null) {
                        this.noHandlerFound(processedRequest, response);
                        return;
                    }
                    // 通过控制器方法创建相应的处理器适配器,调用所对应的控制器方法
                    HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
                    String method = request.getMethod();
                    boolean isGet = HttpMethod.GET.matches(method);
                    if (isGet || HttpMethod.HEAD.matches(method)) {
                        long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                        if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
                            return;
                        }
                    }
					// 调用拦截器的preHandle()
                    if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                        return;
                    }
					// 由处理器适配器调用具体的控制器方法,最终获得ModelAndView对象
                    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
                    if (asyncManager.isConcurrentHandlingStarted()) {
                        return;
                    }
                    this.applyDefaultViewName(processedRequest, mv);
                    // 调用拦截器的postHandle()
                    mappedHandler.applyPostHandle(processedRequest, response, mv);
                } catch (Exception var20) {
                    dispatchException = var20;
                } catch (Throwable var21) {
                    dispatchException = new NestedServletException("Handler dispatch failed", var21);
                }
				// 后续处理:处理模型数据和渲染视图
                this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
            } catch (Exception var22) {
                this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);
            } catch (Throwable var23) {
                this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", var23));
            }

        } finally {
            if (asyncManager.isConcurrentHandlingStarted()) {
                if (mappedHandler != null) {
                    mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
                }
                //清理多部分请求使用的所有资源。
            } else if (multipartRequestParsed) {
                this.cleanupMultipart(processedRequest);
            }

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

DispatcherServlet最全详解 的相关文章

  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • MySQL全连接查询

    mysql没有全连接 但我们可以通过以下两种方式实现 1 使用union和left join实现全连接 select xxx 查询字段 from table1 left join table2 on xxx 连接条件 下同 where xx
  • LinuxMint上硬盘重装LinuxMint(理论上ubuntu也行)

    主要思路是通过修改引导程序 grub2 的配置文件 boot grub grub cfg 使计算机开机后引导硬盘中存放的系统镜像文件 iso 步骤 1 将下载好的系统镜像文件放入硬盘中一个不会被格式化的分区中 为了方便我直接放在了sda1的
  • C语言可以开发哪些项目?

    C语言是我们大多数人的编程入门语言 对其也再熟悉不过了 不过很多初学者在学习的过程中难免会出现迷茫 比如 不知道C语言可以开发哪些项目 可以应用在哪些实际的开发中 这些迷茫也导致了我们在学习的过程中不知道如何学 学什么 所以 总结这个列表
  • treeSelect节点搜索

    antd中treeSelect的filterTreeNode用法 节点搜索 以下图为例 树形搜索展开后 有以下几个选项 如果我想要搜索其中 产品中心 那直接搜索关键词 产品 即可 我搜索后并未显示我想要的结果 而是为空 这就需要用到 fil
  • 总结JS 常用函数

    希望本文总结的内容能给各位看官带来焕然一新的感觉 另外 如果你们有什么值得推荐的js技巧 欢迎在评论中补充 我可以收纳在本文中 PS 此文档会持续新增内容 Ajax请求 jquery ajax函数 我自己封装了一个ajax的函数 代码如下
  • sudo 之后 unable to resolve host的问题解决办法

    gedit etc hosts 127 0 0 1 localhost 127 0 0 1 Masterback或者其他 把后面的Masterback 或者其他改成新的主机名 应该是最近修改过主机名 也就是用户名 后面的部分
  • _WIN32和_WIN64区别

    WIN32 是一个预定义的宏 用于判断当前编译环境是否为 Windows 操作系统 当使用 MSVC 编译器编译 Windows 应用程序时 无论是 32 位还是 64 位的 Windows 环境 WIN32 宏都会被定义 你可以使用条件编
  • 蓝桥杯2021年第十二届国赛真题-和与乘积

    题目描述 给定一个数列 A a1 a2 an 问有多少个区间 L R 满足区间内元素的乘积等于他们的和 即 aL aL 1 aR aL aL 1 aR 输入格式 输入第一行包含一个整数 n 表示数列的长度 第二行包含 n 个整数 依次表示数
  • SetTimer在无窗口和有窗口线程的使用 .

    今天犯了一个粗心的错误 在无窗口线程中 SetTimer中设置计时器ID 而WM TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID 111902 cpp Defines the entry point for the co
  • Prepo —— 图标转化器

    Prepo for mac是Mac os平台上的一款非常不错的Mac图像处理软件 Prepo for mac基于Mac和iOS的一款免费且方便的图标转化器 它可以帮助设计师快速的导出各种尺寸的图标 设计师通过Prepo把任何格式的图片文件转
  • img引入的svg图片,悬浮时怎么修改颜色?

    实现效果 鼠标悬浮在这一行 让这行的文字和svg图片颜色发生变化 因为是用 img标签引入页面 使用fill属性是无效的 css核心代码 active hover transform scale 0 98 img filter drop s
  • Transaction silently rolled back because it has been marked as rollback-only Spring事务嵌套问题

    Transaction silently rolled back because it has been marked as rollback only Spring 事务嵌套问题 添加命令 catch中添加 TransactionAspe
  • Springboot升级到2.x后gridFsTemplate.findOne(query)返回类型由GridFSDBFile改为GridFSFile导致的问题

    问题描述 gridFsTemplate findOne query 返回类型由GridFSDBFile改为GridFSFile导致的问题 文件下载时下面的代码不可用 GridFSDBFile gridFSDBFile new GridFSD
  • java.lang.NoClassDefFoundError: javax/servlet/ServletContext(可能报错原因,不可盖全)

    例如一下jar包版本低 提高版本即可 version 5 0 5RELEASE
  • ArcGIS中统计渔网中栅格人口密度

    文章目录 前言 一 人口数据获取 来源一 中科院地理所公开数据集 来源二 WorldPop数据集 二 人口格网统计步骤 1 创建渔网 2 人口数据处理 2 1 栅格转点 2 2 空间插值 处理人口缺失数据 2 3 空间连接 渔网人口统计 总
  • IGBT简介、结构及原理

    所谓IGBT 绝缘栅双极型晶体管 是由 BJT 双极结型晶体三极管 和 MOS 绝缘栅型场效应管 组成的复合全控型 电压驱动式 功率半导体器件 其具有自关断的特征 简单讲 是一个非通即断的开关 IGBT没有放大电压的功能 导通时可以看做导线
  • ubuntu 安装微信(wechat)

    软件介绍 Wine Wine Is Not an Emulator Wine不是一个模拟器 的缩写 是一个能够在多种 POSIX compliant 操作系统 诸如 Linux Mac OSX 及 BSD 等 上运行 Windows 应用的
  • java动态上传图片_Java实现图片文件上传

    Java实现后台图片上传 将上传图片的接口进行分层 便于维护接口 接口部分 interface 将接口分为单图片上传以及多图片上传 public interface FileUploadService 单图片上传 PicUploadResu
  • 服务器装win10性能怎样,Win10 藏着不给人看的卓越性能模式到底对电脑有什么影响?...

    未来Win10的功能与稳定性趋于完善 其流行趋势会越来越大 许多游戏玩家选择也会选择 Win10 其独有的游戏模式与Xbox游戏录制功能也是对游戏的一大支持所在 今天小编就带大家来简单测试一下Win10 的卓越性能模式对游戏以及电脑性能的影
  • DispatcherServlet最全详解

    文章目录 DispatcherServlet最全详解 DispatcherServlet族谱 一 语言总结 1 DispatcherServlet初始化 2 DispatcherServlet调用组建处理请求 二 DispatcherSer