SpringMVC中的Handler、HandlerMapping、HandlerAdapter
SpringMVC中的Handler、HandlerMapping、HandlerAdapter到底是啥
这东西,虽然说和我们的开发没啥关系,尤其是当你用SpringBoot进行开发时,这些接口离你越来越远了。讲实话,要不是这学期扫一眼学校的课件,我都不知道有这东西,这东西本来就是对使用框架进行开发的开发者隐藏的。人家好不容易隐藏起来,你却要我们学起来,没事儿干了吧。
下图是网上流传的总览图,来自这篇文章:SpringMVC框架理解
下面通过阅读源码,来学习这些接口都是干啥的
DispathcerServlet#
不管是哪个Web框架,基于什么语言,都会提供一个在整个系统最前端接受用户请求的东西,我们暂且称它“前端调度器”,它会解析用户请求请求,调度你编写的用于接收请求的组件。这样,你可以根据不同的请求编写不同的组件,在SpringMVC里,DispathcerServlet就是前端调度器,Controller就是你编写的处理请求的组件。
SpringMVC也是基于JavaWeb的那套ServletAPI的,所以,它使用一个Servlet用来接收所有请求,它就像一个桥,一头是ServletAPI,一头是SpringMVC,把Servlet世界里的话翻译成框架中的通用语言。
既然是Servlet,那我们就看它的doService方法呗:
解释
@Overrideprotected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
logRequest(request);
// … 省略一些代码 …
try {doDispatch(request, response);
}// ... 再省略一些代码 ...}
调用了doDispatch来执行调度。doDispatch里的代码太多了,我做了精简之后还是很多,所以我在代码中写上注释:
解释
@SuppressWarnings(“deprecation”)protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
// 记住它的类型,是一个Handler执行链
HandlerExecutionChain mappedHandler = null;ModelAndView mv = null;
Exception dispatchException = null;// ... 省略代码 ...
try {// processedRequest是经过一定处理的请求对象// 这里是根据请求,获取一个能够处理该请求的Handler对象(实际是一个Handler执行链)// Handler用于对请求进行处理mappedHandler = getHandler(processedRequest);if (mappedHandler == null) {noHandlerFound(processedRequest, response);return;}// 根据Handler对象获取一个HandlerAdapter对象// 具体为啥要这一层,我们稍后会说HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());// 在实际执行对请求的处理之前,先调用Handler的预处理方法`preHandle`if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}// 实际调用Handler,这里调用的是Handler的适配器对象,HandlerAdapter,它会返回一个ModelAndViewmv = ha.handle(processedRequest, response, // 请求处理完毕,这里调用Handler的`postHandle`方法mappedHandler.applyPostHandle(processedRequest, response, mv);
}
// 记录异常
catch (Exception ex) {dispatchException = ex;
}
catch (Throwable err) {dispatchException = new NestedServletException("Handler dispatch failed", err);
}
// 对上面一同折腾得到的处理结果进行处理,返回给前端
processDispatchResult(processedRequest, response, mapp相关文章:
SpringMVC中的Handler、HandlerMapping、HandlerAdapter
SpringMVC中的Handler、HandlerMapping、HandlerAdapter到底是啥 这东西,虽然说和我们的开发没啥关系,尤其是当你用SpringBoot进行开发时,这些接口离你越来越远了。讲实话,要不是这学期扫一眼学校的课件,我都不知道有这东西,这东西本来就是对使用框架进行开发的开发者隐藏…...
tomcat 8在idea启动控制台乱码
Tomcat 8在IntelliJ IDEA(简称IDEA)启动控制台出现乱码的问题,通常是由于Tomcat的默认编码格式(UTF-8)与IDEA或操作系统的默认编码格式(如GBK)不一致所导致的。以下是一些解决此问题的步骤&…...
windows下kafka初体验简易demo
这里提供了windows下的java1.8和kafka3.9.0版本汇总,可直接免费下载 【免费】java1.8kafka2.13版本汇总资源-CSDN文库 解压后可以得到一个文件夹 资料汇总内有一个kafka文件资料包.tgz,解压后可得到下述文件夹kafka_2.13-3.9.0,资料汇总内还…...
证明直纹极小曲面是平面或者正螺旋面.
目录 证明直纹极小曲面是平面或者正螺旋面 证明直纹极小曲面是平面或者正螺旋面 证明:设极小直纹面 S S S的参数表示为 r ( u , v ) a ( u ) v c ( u ) . (u,v)\mathbf{a}(u)v\mathbf{c}(u). (u,v)a(u)vc(u).则 r u a ′ v c ′ , r v c , r u ∧ r v a ′ ∧…...
matlab2024a安装
1.开始安装 2.点击安装 3.选择安装密钥 4.接受条款 5.安装密钥 21471-07182-41807-00726-32378-34241-61866-60308-44209-03650-51035-48216-24734-36781-57695-35731-64525-44540-57877-31100-06573-50736-60034-42697-39512-63953 6 7.选择许可证文件 8.找许可证文件 9.选…...
Observability:如何在 Kubernetes pod 中轻松添加应用程序监控
作者:来自 Elastic Jack Shirazi•Sylvain Juge•Alexander Wert Elastic APM K8s Attacher 允许将 Elastic APM 应用程序代理(例如 Elastic APM Java 代理)自动安装到 Kubernetes 集群中运行的应用程序中。该机制使用变异 webhook࿰…...
关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置说明
最近项目中用到关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置,总结了一下说明: 1、后端是spring boot工程,端口8000,通过 jar命令启动 nohup java -jar xxx-jsonflow-biz.jar > /usr/local/nohup.out 2>…...
redis渐进式遍历
文章目录 一. 渐进式遍历介绍二. scan命令 一. 渐进式遍历介绍 keys * , 一次性把整个redis中所有的key都获取到, 这个操作比较危险, 可能会阻塞redis服务器 通过渐进式遍历, 就可以做到, 既能够获取到所有的key, 又不会卡死服务器 渐进式遍历, 不是一个命令把所有key都拿到,…...
【C++】数据类型与操作实践:详细解析与优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目一:三个数的倒序输出1.1 题目描述与代码实现代码实现: 1.2 代码解析与细节说明1.3 使用 int 类型的合理性分析1.4 其他数据类型的考虑1.5 代码优…...
C# 集合(Collection)
文章目录 前言一、动态数组(ArrayList)二、哈希表(Hashtable)三、排序列表(SortedList)四、堆栈(Stack)五、队列(Queue)六、点阵列(BitArray&…...
【智能控制】实验,基于MATLAB的模糊推理系统设计,模糊控制系统设计
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...
前端跳转路由的时候,清掉缓存
清除路由缓存的方法 使用 $router.push() 方法:在跳转路由时,可以通过传递一个包含 replace: true 属性的对象来实现清除路由缓存。例如: this.$router.push({ path: "/new-route", replace: true }); 使用 $router.replace…...
基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现
背景 LlamaFactory 的 LoRA 微调功能非常便捷,微调后的模型,没有直接支持 vllm 推理,故导致推理速度不够快。 LlamaFactory 目前支持通过 VLLM API 进行部署,调用 API 时的响应速度,仍然没有vllm批量推理的速度快。 …...
【赵渝强老师】PostgreSQL的物理存储结构
PostgreSQL在执行initdb的数据库集群初始化时会指定一个目录。该目录通过环境变量$PGDATA来表示。当数据库集群初始化完成后,会在这个目录生成相关的子目录以及一些文件。这些生成的文件就是PostgreSQL的物理存储结构中的文件。如下图所示。 如上图所示,…...
智能探针技术:实现可视、可知、可诊的主动网络运维策略
网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代,网络运维的重要性不仅体现在技术层面,更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…...
CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(不会)
通过网盘分享的文件:如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…...
debian 11 虚拟机环境搭建过坑记录
目录 安装过程系统配置修改 sudoers 文件网络配置换源安装桌面mount nfs 挂载安装复制功能tab 无法补全其他安装 软件配置eclipse 配置git 配置老虚拟机硬盘挂载 参考 原来去 debian 官网下载了一个最新的 debian 12,安装后出现包依赖问题,搞了半天&…...
MYSQL 什么是内连接 外连接 左连接 右连接?及适用场景
在 SQL 中,连接(JOIN)是用于组合来自两个或更多表的行的一种方法。根据连接的方式不同,可以分为几种类型的连接:内连接(INNER JOIN)、外连接(OUTER JOIN)、左连接&#x…...
利用Ubuntu批量下载modis图像(New)
由于最近modis原来批量下载的代码不再直接给出,因此,再次梳理如何利用Ubuntu下载modis数据。 之前的下载代码为十分长,现在只给出一部分,需要自己再补充另一部分。之前的为: 感谢郭师兄的指导(https://blo…...
【Springboot】@Autowired和@Resource的区别
【Springboot】Autowired和Resource的区别 【一】定义【1】Autowired【2】Resource 【二】区别【1】包含的属性不同【2】Autowired默认按byType自动装配,而Resource默认byName自动装配【3】注解应用的地方不同【4】出处不同【5】装配顺序不用(1ÿ…...
联想M920x黑苹果配置指南:从硬件适配到性能优化的完整方案
联想M920x黑苹果配置指南:从硬件适配到性能优化的完整方案 【免费下载链接】M920x-Hackintosh-EFI Hackintosh Opencore EFIs for M920x 项目地址: https://gitcode.com/gh_mirrors/m9/M920x-Hackintosh-EFI 联想M920x作为一款紧凑型商用主机,通过…...
RWKV7-1.5B-g1a多语言生成能力展示:中英日韩混合提示词真实输出效果对比
RWKV7-1.5B-g1a多语言生成能力展示:中英日韩混合提示词真实输出效果对比 1. 模型简介与核心能力 rwkv7-1.5B-g1a是基于新一代RWKV-7架构开发的多语言文本生成模型,特别优化了中英日韩四种语言的混合处理能力。这个1.5B参数的版本在保持轻量化的同时&am…...
大语言模型应用落地:从RAG到工作流,IT企业智能转型全攻略!
引言检索增强生成(RAG)微调(Fine-Tuning)智能体(Agents)工作流与流程编排(Workflow)企业落地策略与阶段规划落地难点与最佳实践建议结语引言大语言模型(LLM)技…...
手把手教你用STM32F405和SD卡,在阿里云物联网平台上实现OTA升级(MQTT协议详解)
STM32F405实战:基于SD卡与阿里云物联网平台的OTA升级全流程解析 当嵌入式设备部署在野外或工业现场时,固件升级往往成为工程师的噩梦。传统方式需要技术人员携带烧录器奔赴现场,不仅效率低下,在设备数量庞大或分布广泛时更是不切实…...
避坑指南:ESTUN Editor安装后,TP虚拟示教器bricks.ini配置文件到底在哪?
ESTUN Editor安装后TP虚拟示教器配置文件定位全解析 当你在工业机器人编程中同时安装了ESTUN Editor集成环境和独立TP软件包时,最让人头疼的问题莫过于找不到正确的bricks.ini配置文件。这个问题看似简单,却直接影响着虚拟示教器与机器人控制器的连接稳定…...
CTFHub | 解密MySQL、Redis、MongoDB流量中的隐藏Flag
1. 数据库流量分析入门:为什么需要Wireshark? 当你参加CTF比赛时,经常会遇到需要从数据库流量中寻找Flag的题目。这类题目通常会给你一个抓包文件(pcap格式),里面记录了MySQL、Redis或MongoDB等数据库的网络…...
VRCT:打破虚拟社交语言壁垒的实时翻译解决方案
VRCT:打破虚拟社交语言壁垒的实时翻译解决方案 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT 在全球化的虚拟社交平台VRChat中,语言差异常常成为跨文化交流的最…...
依托AI改写功能的五个实用技巧,论文重复率由30%快速降至合规
嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次搞定,轻松压到合格线以下。这些方法都是我亲身试验过的&a…...
VRM-Addon-for-Blender:虚拟角色创作全流程指南
VRM-Addon-for-Blender:虚拟角色创作全流程指南 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 or later 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender VRM-Addon-for-Blender是一款…...
从GUI到Tcl命令:Vivado Report Timing Summary配置选项的完整对照手册(附常用命令模板)
Vivado时序报告GUI与Tcl命令深度对照手册:打造自动化分析工作流 在FPGA设计流程中,时序分析是确保设计满足性能要求的关键环节。Vivado IDE提供了直观的GUI界面用于配置时序报告,但对于追求高效自动化的工程师而言,掌握底层Tcl命令…...
