SpringMvc执行流程

2023-10-29

先看一下springMVC的流程图

1、 springMvc的主要构成是

        1.1、前端控制器(dispatcherServlet)

        1.2、请求到处理器映射(handlerMapping)

        1.3、处理器适配器(HandlerAdapter)

        1.4、视图解析器(ViewResolver)

2、springMvc处理请求的流程如下        

            

 2.1、用户发送请求至前端控制器DispatcherServlet;

    2.2、DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;

    2.3、处理器映射器根据请求url找到具体的处理器

    2.4、DispatcherServlet 调用 HandlerAdapter处理器适配器

    2.5、HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器)

    2.6、Handler执行完成返回ModelAndView;

    2.7、HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;

    2.8、DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;

    2.9、ViewResolver解析后返回具体View;

    2.10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

    2.11、DispatcherServlet响应用户。

今天我们主要分析一下2.3-2.6

        首先根据前端发送请求的request对象的到具体的处理器,方法的入口在DispatcherServlet中的1043行

org.springframework.web.servlet.DispatcherServlet#doDispatch

而具体的处理方式是将handler转换为HandlerExecutionChain

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		if (this.handlerMappings != null) {
			for (HandlerMapping mapping : this.handlerMappings) {
				HandlerExecutionChain handler = mapping.getHandler(request);
				if (handler != null) {
					return handler;
				}
			}
		}
		return null;
	}

接下来会根据HandlerMethod获取对应的HandlerAdapter,该方法使用的是适配器模式,

public interface HandlerAdapter {

	// 用于判断当前HandlerAdapter是否能够处理当前请求

	boolean supports(Object handler);

	// 如果当前HandlerAdapter能够用于适配当前请求,那么就会处理当前请求中
    // 诸如参数和返回值等信息,以便能够直接委托给具体的Handler处理
	@Nullable
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

	
	@Deprecated
	long getLastModified(HttpServletRequest request, Object handler);

}

handlerAdapter接口总共有四个实现类,分别对应处理不同的“controller”;

HandlerMapping的作用主要是根据request请求获取能够处理当前request的handler,而HandlerAdapter的作用在于将request中的各个属性,如request param适配为handler能够处理的形式 。

关于HandlerAdapter.supports()方法,有这个方法的主要原因是,HandlerMapping是可以有多种实现的,Spring会遍历这些具体的实现类,判断哪一个能够根据当前request产生一个handler,因而对于HandlerAdapter而言,其是不知道当前获取到的handler具体是什么形式的,不同的HandlerMapping产生的handler形式是不一样的,比如RequestMappingHandlerMapping产生的handler则是封装在HandlerMethod对象中的,因而这里HandlerAdapter需要一个方法能够快速过滤掉当前产生的handler是否为其能够进行适配的,这个方法就是HandlerAdapter.supports()方法。如下是该方法的实现。比如@Controller注解使用的是RequestMappingHandlerAdapter进行处理的。

 在handlerAdapter内部会封装请求参数,如果使用的是@RequestBody会根据请求的参数反射设置参数。

 最后在spring容器中获取到对应的bean后进行反射调用业务的controller对应的处理方法。

org.springframework.web.method.support.InvocableHandlerMethod#doInvoke

后期会补充一下 HandlerAdapter另外几种处理方式。

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

SpringMvc执行流程 的相关文章

随机推荐

  • Android WebView 在开发过程中有哪些坑?

    https www zhihu com question 31316646 作者 李明亮 链接 https www zhihu com question 31316646 answer 52714778 来源 知乎 著作权归作者所有 转载请
  • 华为OD机试真题- 字符串重新排序【2023Q1】【JAVA、Python、C++】

    题目描述 给定一个字符串s s包含以空格分隔的若干个单词 请对s进行如下处理后输出 1 单词内部调整 对每个单词字母重新按字典序排序 2 单词间顺序调整 1 统计每个单词出现的次数 并按次数降序排列 2 次数相同时 按单词长度升序排列 3
  • 盒子模型的理解

    盒子模型 什么是盒子 html中的标签 元素 统统都是一个矩形的平面框 在立体上 它由多个平面构成 这称为盒子模型 从底层到顶层的立体结构 margin gt background color gt background image gt
  • CUDA各版本下载

    CUDA及CUDNN各版本下载地址 1 CUDA各版本下载地址 https developer nvidia com cuda toolkit archive CUDA 各版本下载 这个网址有点难找 2 CuDNN下载地址 需要登录 htt
  • 【英语】大学英语CET考试,口语部分2(课程笔记)

    文章目录 1 口语考试介绍与备考攻略 1 1 口语考试介绍 1 2 考试备考攻略 2 其他补充 考前 2 1 一些补充 2 2 口语考试培训 重要 上课老师 金格妃 上课时间 4h 1 口语考试介绍与备考攻略 方法是通用的 CET4 6 雅
  • React合成事件原理简单实现

    1 React合成事件是什么 React 合成事件 SyntheticEvent 是 React 模拟原生 DOM 事件所有能力的一个事件对象 即浏览器原生事件的跨浏览器包装器 它根据 W3C 规范 来定义合成事件 兼容所有浏览器 拥有与浏
  • [LeetCode-58]- Length of Last Word(最后一个单词的长度)

    文章目录 题目相关 Solution 题目相关 题目解读 求最后一个单词的长度 题目 原题链接 Given a string s consists of upper lower case alphabets and empty space
  • 2021-08-04Java Mybatis-Plus命令里面的EQ、NE、GT、LT、GE、LE分别代表含义

    EQ 就是 EQUAL等于 NE就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于 LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL 大于等于 LE 就是 LESS THAN
  • MapStruct从入门到出门(二)

    数据类型转换 自动类型转换 在平常的对象映射中 总会有很多类型不完全一致的情况 例如Integer转Long String转Integer或者两个自定义对象之间的转换等 在MapStruct中定义了一些类型的自动类型转换或者说是隐形类型转换
  • Increase swap size

    Question I have an old Fedora installation on my system I have just upgraded my RAM from 256 to 512 MB My swap partition
  • SpringBoot中使用Jackson导致Long型数据精度丢失问题、处理jdk8日期类型转换

    spring boot默认使用了jackson 处理请求映射 下面通过三种方案配置 对Long类型 jdk8日期类型的自定义转换处理 方案一 注解方式 JsonSerialize using ToStringSerializer class
  • 位置式PID——小车类学习心得

    位置式PID 小车类学习心得 位置式PID 公式为 val kp err ki err sum kd err err last err变量 期望值 实际值 也就是我们常说的误差 err last变量 上一次的误差 err sum变量 误差的
  • 关于MySQL的lock wait timeout exceeded解决方案

    关于MySQL出现 lock wait timeout exceeded try restarting transaction 的解决方案 一 问题抛出 在做查询语句时 MySQL 抛出了这样的异常 MySQL server error r
  • 实验一 实现改进Bresenham算法

    实验一 实现改进Bresenham算法 一 目的 1 了解直线生成基本原理和常用方法 2 掌握改进Bresenham算法的基本原理和步骤 3 使用C OpenGL编程实现如下内容 输入线段的起始点和终止点坐标位置 利用改进Bresenham
  • 三层架构实验

    6 100 撤消 重做历史标题 加粗 颜色 背景其他列表对齐 水平线 块引用代码 资源绑定 表格 图像 视频 公式 链接 模版 目录 投票 宽屏 使用 MD 编辑器 文章标签 经验分享 添加文章标签 添加封面 标签图热门VIP 本地上传 思
  • 数据库期末总结笔记(《数据库系统概论》第五版(王珊、萨师煊编著))

    参考教材 数据库系统概论 第五版 王珊萨师煊版本 文章目录 1 绪论 1 1 数据库系统概述 1 2 什么是数据管理 1 3 数据库系统与人工管理 文件系统比 1 4 数据库系统特点 1 5 数据模型 1 6 数据库系统模式的概念 1 7
  • Win10安装SVN出现2503错误

    1 问题 2 原因 出现这个错误的原因是权限不足 这是win8 1的一个非常不好的地方 即使小肥的win8 1系统用的是管理员账号 但是还是无法安装成功 而且右击安装程序也没有 以管理员身份运行 按钮 3 解决 1 右击win8 1左下角的
  • Linux系统安全配置基线

    http www cnblogs com sun sunshine123 p 7119472 html 一 共享账号检查 配置名称 用户账号分配检查 避免共享账号存在 配置要求 1 系统需按照实际用户分配账号 2 避免不同用户间共享账号 避
  • python网络安全毕业设计_王国辉-利用Python做网络安全开发

    无论你想做什么任务 你都可以使用Python轻松完成任务 例如 你可以使用该语言将TCP数据包发送到计算机 执行恶意软件分析 并创建入侵检测系统 而对第三方工具的依赖性最小 然而 与C C 不同 Python并不是底层的 因此 它可能无法为
  • SpringMvc执行流程

    先看一下springMVC的流程图 1 springMvc的主要构成是 1 1 前端控制器 dispatcherServlet 1 2 请求到处理器映射 handlerMapping 1 3 处理器适配器 HandlerAdapter 1