SpringMVC处理流程介绍

SpringMVC请求处理流程

image.png

  1. 发起请求到前端控制器(DispatcherServlet)
  2. 前端控制器请求HandlerMapping查找Handler(可以根据xml配置,注解进行查找)

对应Spring源码

//在类DispatcherServlet里面
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);//getHandler方法内部会遍历配置的HandlerMapping实例来找到请求相匹配的Handler//...其余代码省略
}
  1. 处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

对应Spring源码

@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {if (this.handlerMappings != null) {Iterator var2 = this.handlerMappings.iterator();while(var2.hasNext()) {HandlerMapping mapping = (HandlerMapping)var2.next();HandlerExecutionChain handler = mapping.getHandler(request);if (handler != null) {return handler;}}}return null;
}
  1. 前端控制器调用处理器去执行Handler
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {//代码省略......mappedHandler = this.getHandler(processedRequest);if (mappedHandler == null) {this.noHandlerFound(processedRequest, response);return;}HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());//代码省略
  1. 处理器适配器HandlerAdapter将会根据适配去执行Handler
  2. Handler执行完成给适配器返回ModelAndView
  3. 处理器适配器向前端控制器返回ModelAndView(ModelAndView是SpringMVC框架的一个底层对象,包括Model和view)
try {try {ModelAndView mv = null;//代码省略....mv = ha.handle(processedRequest, response, mappedHandler.getHandler());//代码省略....
  1. 前端控制器请求视图解析器去进行视图解析(根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更换视图解析器即可
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {//代码省略....this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);//代码省略///
  1. 视图解析器向前端控制器返回view
  2. 前端控制器进行视图渲染(视图渲染将模型数据(在ModelAndView对象中)填充到request域)
  3. 前端控制器向用户响应结果

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

static关键字与单例模式

可以修饰属性变量,方法和代码段 static修饰的属性称为静态属性或类属性, 在类加载时就在方法区为属性开辟存储空间,无论创建多少个对象,静态属性在内存中只有一份。 可以使用 类名.静态属性 的方式引用 static修饰的方法称为静态…

FPGA第 5 篇,FPGA技术优略势,FPGA学习方向,FPGA学习路线(FPGA专业知识的学习方向,FPGA现场可编程门阵列学习路线和方向)

前言 前几篇讲了一下FPGA的发展和应用,以及未来前景。具体详细,请看 FPGA发展和应用,以及未来前景https://blog.csdn.net/weixin_65793170/category_12665249.html 这里我们来,记录一下,FPGA专业知识的学习路线 一.…

第22周:调用Gensim库训练Word2Vec模型

目录 前言 一、Word2vec基本知识 1.1 Word2Vec是什么 1.2 Word2Vec两种主要模型架构 1.2.1 CBOW模型 1.2.2 Skip-gram模型 1.3 实例说明 1.4 调用方法 二、准备工作 2.1 安装Gensim库 2.2 对原始语料分词 2.2 添加自定义停用词 三、训练Word2Vec模型 四、模型应用…

快速掌握GPTEngineer:用AI创建网页应用的实用教程

今天来聊聊一个非常有趣的工具——GPTEngineer。这是一个基于AI的网页开发平台,特别适合那些不熟悉编程但又想快速创建网页应用的人。如果你想用简单的文本描述来生成一个网站或者应用,GPTEngineer可能就是你需要的。我们一步步看看如何使用它。 1. 了解…

Spring Boot 入门

1.1.1 什么是Spring Boot Spring Boot是一个开源的Java应用框架,由Pivotal团队提供,旨在简化Spring应用的初始搭建以及开发过程。‌ Spring Boot通过使用特定的配置方式,使得开发人员不再需要定义样板化的配置,从而在快速应用开发…

中仕公考:公务员考试缺考有影响吗?

公务员考试缺考的影响根据考试阶段的不同又所区别,中仕为大家介绍一下: 笔试阶段的缺考后果: 在公务员考试中,若考生未能按时参加笔试,将自动视为放弃该次考试机会。此行为不会对考生的个人信用产生任何负面效应&…

Win10 安装 Rabbitmq

参考文档:https://www.rabbitmq.com/docs/install-windows 一、安装 Erlang 语言 安装 RabbitMQ 需要该语言的支持才能安装 下载地址:https://erlang.org/download/otp_versions_tree.html 点击这里下载最新版本:27.0.1 直接默认 next 更…

【计算机网络】计算机网络的性能指标

1B/s 8bps ,MB/s 8Mbps 信道(Channel):表示向某一方向传送信息的通道(信道≠通信线路),一条通信线路在逻辑上往往对应一条发送信道和一条接收信道。

数盟IOS端可信ID

一、基本情况介绍 数盟IOS端可信ID介绍页: 数字联盟 数盟号称是还原出原生的IDFA, 但是苹果官网这么介绍: 用户开启跟踪允许跟踪后,APP才可以请求获取IDFA,且用户交互界面允许后,APP才能获取到IDFA. 官网给出的基本架构&#xf…

Linux基础1-基本指令7(其他常用指令,shell简介)

目录 1.uname 2.常用小指令 3.查看系统信息的其他指令 4.shell命令及其原理 4.1这里我们简单了解一下shell 4.2 shell存在的意义? 1.uname 如何查看计算机体系架构? uname -a,查看详细信息 uname -r 查看简要信息 2.常用小指令 TAB&#x…

el-table自定义合并表格

前沿 : 为了更好的展示数据,很多地方用到表格合并,但是element文档里面没有好的合并方法,只能自定义合并表格来解决需求。于是乎,写了以下方法,方面以后拿来即用。 自定义合并表格 表格数据 tableData: [{i…

laravel8快速开发简单博客系统(二)

目录 一、创建文章增删改成提交的控制器 1、注释文章查看权限,非登录状态可以查看文章列表页 2、创建提交控制器post 3、创建数据表 4、创建提交post资源路由 5、创建post控制器view目录post 二、文章添加功能实现 1.模板显示 2.复制home.blade.php模板到po…

Xilinx FPGA在线升级——升级思路

一、绪论 网上很多文章都讲述了Xilinx FPGA在线升级即回退的优势,在这里仅简述一遍。优势在于可不拆机的情况下改变FPGA的功能,可进行产品迭代。回退的优势是避免升级过程中一些突发情况导致板卡成为废板。至少Golden里面包含了可进行升级的部分代码。 …

108页PPT分享:华为流程体系及实施方法最佳实践

PPT下载链接见文末~ 华为的流程体系、流程框架及实施方法是一个复杂而精细的系统,旨在确保公司运作的高效性和竞争力。以下是对这些方面的详细描述: 一、华为的流程体系 华为的流程体系是一套全面的管理体系,它涵盖了企业所有的活动&#…

【C++标准模版库】模拟实现容器适配器:stack、queue、priority_queue(优先级队列)

stack和queue 一.容器适配器1.什么是适配器 二.模拟实现stack和queue三.STL标准库中stack和queue的底层结构四.deque(双端队列)的简单介绍五.deque作为stack和queue的默认容器的原因六.priority_queue(优先级队列)的介绍和使用七.…

[线程]线程不安全问题 --- 内存可见性 及wait和notify

文章目录 一. 由内存可见性引起线程不安全问题的例子二. 分析内存可见性产生的原因三. volatile 关键字(面试题)四. 线程的等待通知机制waitnotify 一. 由内存可见性引起线程不安全问题的例子 public class Demo17 {private static int count 0;public static void main(Stri…

linux下基本指令(持续更新)

目录 1.adduser 2.passwd 3.userdel 4. su - 5.ls 6.pwd ​编辑 7.cd 8.touch 9.mkdir 🚀 10. rmdir && rm 🚀 11.whoami (who am i) 12.clear 13.tree (需要安装 yum install -y tree) 14.who 这里我用的是腾讯…

#网络编程 笔记

认识网络 网络发展史 ARPnetA--->Internet--->移动互联网--->物联网 TCP 用来检测网络传输中差错的传输控制协议 UDP 用户数据报协议,专门负责对不同网络进行互联的互联网协议 局域网 实现小范围短距离网络通信 广域网 现大范围长距离网络通信…

Python编码系列—Python项目架构的艺术:最佳实践与实战应用

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

(一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)

ZSWatch是一个包括硬件、软件和3D打印外壳全部开源的智能手表,软件功能丰富,并可与手机互联用来接收信息和切换歌曲,开源协议为GPL-3.0。 因为ZSWatch建立在Zephyr™项目RTOS之上,因此得名ZSWatch- Zephyr,目前该项目…