Spring MVC 的请求处理流程是怎样的?
Spring MVC 请求处理流程的大致可分为以下几个步骤:
1. 请求到达 DispatcherServlet:
- 所有请求首先到达
DispatcherServlet
(前端控制器)。DispatcherServlet
是 Spring MVC 的核心,它负责接收请求,并将请求委派给其他组件进行处理。 DispatcherServlet
通常在web.xml
中配置(或使用 Servlet 3.0+ 的 Java 配置),并映射到特定的 URL 模式(例如/
或*.do
)。
2. 查找 HandlerMapping:
DispatcherServlet
使用HandlerMapping
来确定哪个控制器(Controller)应该处理当前请求。HandlerMapping
根据请求的 URL、HTTP 方法、请求头等信息,查找匹配的HandlerExecutionChain
。HandlerExecutionChain
包含了一个处理器(Handler,通常是一个 Controller 方法)和一组拦截器(HandlerInterceptor)。
- Spring MVC 提供了多种
HandlerMapping
实现:BeanNameUrlHandlerMapping
:根据 Bean 的名称与 URL 进行映射。RequestMappingHandlerMapping
:根据@RequestMapping
注解进行映射(最常用)。SimpleUrlHandlerMapping
:通过配置文件进行 URL 映射。
3. 执行 HandlerAdapter:
- 找到
HandlerExecutionChain
后,DispatcherServlet
使用HandlerAdapter
来执行处理器(Handler)。 HandlerAdapter
负责调用 Controller 方法,并处理方法参数、返回值等。- Spring MVC 提供了多种
HandlerAdapter
实现:HttpRequestHandlerAdapter
:处理HttpRequestHandler
类型的处理器。SimpleControllerHandlerAdapter
:处理Controller
接口类型的处理器。RequestMappingHandlerAdapter
:处理带有@RequestMapping
注解的方法(最常用)。
HandlerAdapter
的执行过程包括:- 执行拦截器的
preHandle()
方法: 在调用 Controller 方法之前,执行所有拦截器的preHandle()
方法。如果任何一个preHandle()
方法返回false
,则请求处理流程终止。 - 解析方法参数: 根据方法参数上的注解(如
@RequestParam
、@PathVariable
、@RequestBody
等),从请求中获取参数值,并进行类型转换。 - 调用 Controller 方法: 使用反射调用 Controller 方法,并将解析后的参数值传入。
- 处理返回值: 根据方法返回值的类型和注解(如
@ResponseBody
、@ModelAndView
等),将返回值转换为合适的响应格式(如 JSON、HTML、XML 等)。 - 执行拦截器的
postHandle()
方法: 在 Controller 方法执行完成后,但在视图渲染之前,执行所有拦截器的postHandle()
方法。 - **执行拦截器的
afterCompletion()
方法: ** 在整个请求完成后 (视图渲染后) 执行.
- 执行拦截器的
4. 返回 ModelAndView 或直接响应:
- Controller 方法可以返回一个
ModelAndView
对象,其中包含了模型数据(Model)和视图名称(View Name)。 - Controller 方法也可以直接通过
@ResponseBody
注解返回数据(如 JSON),或者通过HttpServletResponse
对象直接写入响应内容。
5. 视图解析 (View Resolution):
- 如果 Controller 方法返回的是
ModelAndView
,DispatcherServlet
会使用ViewResolver
将视图名称解析成一个View
对象。 ViewResolver
根据视图名称和配置的视图解析规则,查找对应的视图模板文件(如 JSP、Thymeleaf、FreeMarker 等)。- Spring MVC 提供了多种
ViewResolver
实现:InternalResourceViewResolver
:用于解析 JSP 视图。FreeMarkerViewResolver
:用于解析 FreeMarker 视图。ThymeleafViewResolver
:用于解析 Thymeleaf 视图。
6. 视图渲染 (View Rendering):
DispatcherServlet
调用View
对象的render()
方法,将模型数据渲染到视图模板中,生成最终的 HTML 响应。View
对象会使用相应的模板引擎(如 JSP 引擎、Thymeleaf 引擎等)来渲染视图。
7. 返回响应:
DispatcherServlet
将生成的 HTML 响应返回给客户端。
核心组件总结:
DispatcherServlet
: 前端控制器,负责接收请求,并将请求委派给其他组件。HandlerMapping
: 处理器映射器,负责根据请求查找对应的处理器(Handler)。HandlerAdapter
: 处理器适配器,负责执行处理器(Handler),并处理方法参数、返回值等。HandlerInterceptor
: 拦截器,可以在请求处理前后执行自定义逻辑。Controller
: 控制器,负责处理请求,并返回模型数据和视图名称。ModelAndView
: 模型和视图对象,包含了模型数据和视图名称。ViewResolver
: 视图解析器,负责将视图名称解析成View
对象。View
: 视图对象,负责将模型数据渲染到视图模板中。
流程图示:
Client --(Request)--> DispatcherServlet --(HandlerMapping)--> HandlerExecutionChain|--(HandlerAdapter)--> Controller --(ModelAndView)--> ViewResolver --(View)--> DispatcherServlet --(Response)--> Client| ^|-----------------------------------------------------------------------|HandlerInterceptor
总结:
Spring MVC 的请求处理流程是一个高度可定制和可扩展的流程。理解这个流程的各个步骤和核心组件,有助于我们更好地使用 Spring MVC 开发 Web 应用程序,并解决可能出现的问题。
相关文章:
Spring MVC 的请求处理流程是怎样的?
Spring MVC 请求处理流程的大致可分为以下几个步骤: 1. 请求到达 DispatcherServlet: 所有请求首先到达 DispatcherServlet(前端控制器)。DispatcherServlet 是 Spring MVC 的核心,它负责接收请求,并将请求委派给其他…...
PyTorch 实现图像版多头注意力(Multi-Head Attention)和自注意力(Self-Attention)
本文提供一个适用于图像输入的多头注意力机制(Multi-Head Attention)PyTorch 实现,适用于 ViT、MAE 等视觉 Transformer 中的注意力计算。 模块说明 输入支持图像格式 (B, C, H, W)内部转换为序列 (B, N, C),其中 N H * W多头注…...
STM32单片机入门学习——第17节: [6-5] TIM输入捕获
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.06 STM32开发板学习——第17节: [6-5] TIM输入捕获 前言开发板说明引用解答和科普一…...
P8819 [CSP-S 2022] 星战 Solution
Preface 不可以,总司令 的来源. Description 给定一张 n n n 点 m m m 边的有向图 G G G,有 q q q 次操作分四种: 1 u v:使边 u → v u\to v u→v 失活.2 u:使点 u u u 的所有入边失活.3 u v:使边…...
【spring02】Spring 管理 Bean-IOC,基于 XML 配置 bean
文章目录 🌍一. bean 创建顺序🌍二. bean 对象的单例和多例❄️1. 机制❄️2. 使用细节 🌍三. bean 的生命周期🌍四. 配置 bean 的后置处理器 【这个比较难】🌍五. 通过属性文件给 bean 注入值🌍六. 基于 X…...
Llama 4架构解析与本地部署指南:MoE模型在170亿参数下的效率突破
Meta最新发布的Llama 4系列标志着开源大语言模型(LLM)的重大演进,其采用的混合专家(MoE)架构尤为引人注目。 两大核心模型——Llama 4 Scout(170亿参数含16专家)和Llama 4 Maverick(170亿参数含128专家)——展现了Meta向高效能AI模型的战略转型,这些模型在挑战传统扩…...
`docker run --restart no,always,on-failure,unless-stopped`笔记250406
docker run --restart no,always,on-failure,unless-stopped 笔记250406 docker run --restart 用于配置容器的自动重启策略,当容器意外退出时,Docker 会根据策略自动重新启动容器。这是确保服务高可用的重要参数。 语法 docker run --restart <策略…...
stl的VS的string的内部实现,引用计数的写实拷贝,编码
本章目标 1.stl的vs的string的内部实现 2.引用计数的写实拷贝 3.编码 1.stl的string的内部实现 我们先来看一个例子 string s1; cout<<sizeof(s1)<<endl;我们知道类的内存管理也是遵循内存对齐的规则的. 我们假设当前机器的环境是32位的.string类的内部有三个成…...
Docker 从入门到进阶 (Win 环境) + Docker 常用命令
目录 引言 一、准备工作 1.1 系统要求 1.2 启用虚拟化 二、安装Docker 2.1 安装WSL 2 2.2 安装Docker Desktop 2.3检查是否安装成功 三、配置Docker 3.1 打开Docker配置中心 四、下载和管理Docker镜像 4.1 拉取镜像 4.2 查看已下载的镜像 4.3 运行容器 4.4 查看正…...
C# Winform 入门(12)之制作简单的倒计时
倒计时效果展示 控件展示 以下均是使用label来形成的 label 的 BorderStyle:Fixed3D ForeColor:Red Blackground:Black label 的属性 Name: txtyear txtmonth txtday txttime txtweek txtDays txtHour txtM…...
基于springboot+vue的漫画天堂网
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
leetcode每日一题:最大整除子集
题目 368. 最大整除子集 给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % answer[j] 0 ,或 answer[j] % answer[i] …...
【Unity】animator检测某state动画播放完毕方法
博主对动画系统很不熟,可能使用的方法比较曲折,但是我确实没找到更有效的方法了。 unity的这个animator在我看来简直有毛病啊,为什么那么难以获取某状态动画的信息呢??? 想要知道动画播完没有只有用norma…...
玄机-应急响应-webshell查杀
题目要求: 要求获取四个flag webshell查杀: 常见的webshell: PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode() ASP: Execute(), Eval(), CreateObject() JSP: Runtime.getRuntime().exec() websh…...
小菜Go:Ubuntu下Go语言开发环境搭建
前置要求Ubuntu环境搭建 文章推荐 此处推荐一个比较好的文章,基本按部就班就欧克~ 安装虚拟机(VMware)保姆级教程(附安装包)_vmware虚拟机-CSDN博客 安装可能遇到的问题 虚拟机安装遇到的问题如:Exception…...
多功能指示牌是否支持多语言交互?
嘿,朋友们!你们知道吗?叁仟多功能指示牌在多语言交互方面可太厉害了,下面就为大家热情介绍一些常见的实现方式和相关说明哦! 显示多语言文字:哇哦,在众多国际化的超棒场所,像那充满…...
2025ArkTS语言开发入门之前言
2025ArkTS语言开发入门之前言(一) 引言 要想学好一门语言,必先会下载对应的编辑器/集成开发环境,ArkTS也是如此,下面我带着大家去下载并安装ArkTS语言的集成开发环境——Dev Eco Studio。 下载 来到华为开发者联盟…...
Python高级爬虫+安卓逆向1.1-搭建Python开发环境
目录 引言: 1.1.1 为什么要安装Python? 1.1.2 下载Python解释器 1.1.3 安装Python解释器 1.1.4 测试是否安装成功 1.1.5 跟大神学高级爬虫安卓逆向 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级&…...
深入理解MySQL:核心特性、优化与实践指南
MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前属于Oracle公司。它是目前世界上最流行的开源数据库之一,广泛应用于各种规模的Web应用和企业系统中。 目录 一、核心特点 关系型数据库: 开源免费&am…...
38常用控件_QWidget的enable属性(2)
实现用另一个按钮切换之前按钮的“可用”状态 在同一个界面中,要求不同的控件的 objectName 也是必须不同的.(不能重复) 后续就可以通过 ui->objectName 方式来获取到对应的控件对象了 ui->pushButton // 得到了第一个按钮对应的对象 ui->pushButton 2 //…...
如何单独指定 Android SDK tools 的 monitor.bat 使用特定 JDK 版本
核心概念与背景介绍 在 Android 开发过程中,Android SDK Tools 提供了许多实用工具,其中 monitor.bat 是 Windows 下用于启动 Android Device Monitor 的批处理文件。Device Monitor 可以帮助我们查看日志、内存、线程等运行信息。 JDK 与 monitor.bat …...
【代码随想录 字符串1】 344.反转字符串
自己的 class Solution {public void reverseString(char[] s) {int mid s.length /2;int j1;for (int i 0; i < mid; i) {char tem s[i];s[i] s[s.length -j];s[s.length -j] tem;j;}s.toString();} }双指针 class Solution {public void reverseString(char[] s) {…...
gogs私服对应SSH 协议配置
一、使用非特权端口(推荐) 1. 修改 Gogs 配置文件 sudo nano /home/git/gogs/custom/conf/app.ini 找到 [server] 部分,修改为: [server] START_SSH_SERVER true SSH_PORT 2222 # 改为1024以上的端口 2. 重启 Gogs sud…...
蓝桥与力扣刷题(74 搜索二维矩阵)
题目:给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则ÿ…...
多元高斯分布函数
1、 n n n元向量 假设 n n n元随机变量 X X X X [ X 1 , X 2 , ⋯ , X i , ⋯ , X n ] T μ [ μ 1 , μ 2 , ⋯ , μ i , ⋯ , μ n ] T σ [ σ 1 , σ 2 , ⋯ , σ i , ⋯ , σ n ] T X i ∼ N ( μ i , σ i 2 ) \begin{split} X&[X_1,X_2,\cdots,X_i,\cdots ,X_n…...
【PySpark大数据分析概述】02 Spark大数据技术框架
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PySpark大数据分析与应用 ⌋ ⌋ ⌋ PySpark作为Apache Spark的Python API,融合Python易用性与Spark分布式计算能力,专为大规模数据处理设计。支持批处理、流计算、机器学习 (MLlib) 和图计算 (GraphX)&am…...
JVM 参数调优指南_优化 Java 应用性能
1. 引言 1.1 什么是 JVM 参数调优 JVM 参数调优是指通过调整 Java 虚拟机的各种参数,以优化 Java 应用程序的性能和稳定性。 1.2 JVM 参数调优的重要性 提高性能:优化内存使用和垃圾回收,提升应用程序的响应速度。稳定性:减少内存溢出和垃圾回收暂停时间,提高系统的稳定…...
闭包和装饰器
什么是闭包 闭包(Closure)是 Python 中一个非常重要的概念,它是一种特殊的函数对象,通常用于封装和延迟计算某些值。以下是闭包的详细定义和解释: 1.闭包的定义 闭包是指一个函数对象,它不仅包含函数的代…...
电脑显示器选购
显示器分类 按尺寸大小 一般显示器屏幕有24寸、27寸、32寸等 按技术分类 LCD显示器 使用液晶分子作为主要材料,以液晶为显示/控制模块制造而成的显示设备。液晶显示器中的液晶体在工作时不发光,而是控制外部的光通过量。当外部光线通过液晶分子时&a…...
论伺服电机在轨道式巡检机器人中的优势及应用实践
一、引言 1.1 研究背景与意义 在现代工业生产、电力系统、轨道交通等诸多领域,保障设施设备的安全稳定运行至关重要。轨道式巡检机器人作为一种高效、智能的巡检工具,正逐渐在这些领域崭露头角。它能够沿着预设轨道,对目标区域进行全方位…...
室内指路机器人是否支持与第三方软件对接?
嘿,你知道吗?叁仟室内指路机器人可有个超厉害的技能,那就是能和第三方软件 “手牵手” 哦,接下来就带你一探究竟! 从技术魔法角度看哈:好多室内指路机器人都像拥有超能力的小魔法师,采用开放式…...
Docker 命令大全:从入门到精通
一、容器生命周期管理 1. 容器操作基础 # 运行容器 docker run -d --name my_nginx -p 8080:80 nginx:latest# 启动/停止容器 docker start my_nginx docker stop my_nginx# 重启容器 docker restart my_nginx# 删除容器 docker rm my_nginx 2. 容器状态管理 # 查看运行中的…...
【HarmonyOS Next之旅】DevEco Studio使用指南(十一)
目录 1 -> 代码实时检查 2 -> 代码快速修复 3 -> C快速修复使用演示 3.1 -> 填充switch语句 3.2 -> 使用auto替换类型 3.3 -> 用?:三元操作符替换if-else 3.4 -> 从使用处生成构造函数 3.5 -> 将变量拆分为声明和赋值 1…...
【中间件】使用ElasticSearch提供的RestClientAPI操作ES
一、简介 ElasticSearch提供了RestClient来操作ES,包括对数据的增删改查,可参照官方文档:Java High Level REST Client 二、使用步骤: 可参照官方文档操作 导包 <dependency><groupId>org.elasticsearch.client<…...
数字电子技术基础(三十九)——显示译码器
目录 1 显示译码器 1.1 显示译码器简介 1.2 七段显示译码器和八段显示译码器 1.3 BCD-七段显示译码器 1.4 多位显示译码器 1 显示译码器 1.1 显示译码器简介 显示译码器是一种数字电路,是将二进制转换为驱动显示设备所需要的信号,核心是将编码数据…...
Java学习总结-多线程-三种创建方法
什么是线程? 线程(Thread)是程序内部的一条执行流程。 程序如果只有一条执行流程,那这个程序就是单线程程序。 什么是多线程? 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行…...
sqli-labs靶场 less 7
文章目录 sqli-labs靶场less 7 mysql文件上传拿web shell sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、…...
大模型最新面试题系列:模型部署(二)
一、如何通过unsloth的批处理(Batching)功能提升推理效率? Unsloth的批处理(Batching)功能通过整合硬件加速、内存优化和动态调度技术,显著提升大模型推理效率。以下是具体实现方法和实际应用场景的深度解…...
Python助力去中心化云计算:构建分布式计算的未来
Python助力去中心化云计算:构建分布式计算的未来 随着区块链技术和Web 3.0生态的兴起,去中心化云计算正逐步成为主流。它不仅颠覆了传统集中式云计算的架构,还为数据安全、隐私保护以及资源分配带来了新的可能性。在这一领域,Python因其简洁易用、社区庞大以及强大的工具链…...
HCIP【路由过滤技术(详解)】
目录 1 简介 2 路由过滤方法 3 路由过滤工具 3.1 静默接口 3.2 ACL 3.3 地址前缀列表 3.4 filter-policy 3.4.1 filter-policy过滤接收路由(以RIP为例) 3.4.2 filter-policy过滤接收路由(以OSPF为例) 1 简介 路由过滤技术…...
LeetCode Hot100 刷题笔记(3)—— 链表
目录 前言 1. 相交链表 2. 反转链表 3. 回文链表 4. 环形链表 5. 环形链表 II 6. 合并两个有序链表 7. 两数相加 8. 删除链表的倒数第 N 个结点 9. 两两交换链表中的节点 10. K 个一组翻转链表 11. 随机链表的复制 12. 排序链表 13. 合并 K 个升序链表 14. LRU 缓存 前言 一、…...
商品计费打折实现效果
1.创建php站点 2.创建php文件 3.执行php文件打开浏览器地址栏输入http://localhost/dophp/price.php页面如图所示: 4.表单输入,创建php文件price_form.php 运行效果为...
游戏引擎学习第207天
回顾并为今天的内容定下基调 我们正在继续上一次的任务,目的是构建一个基本的元编程系统,用来自动处理结构体信息,减少手动维护的代码量。具体来说,我们写了一个简单的预处理器,它可以解析代码中的结构体定义…...
Linux内核页表缓存(TLB)与巨型页
一、页表缓存(TLB) 处理器厂商在内存管理单元 (MMU) 里增加一个 TLB (Translation Lookaside Buffer) 的高速缓存,TLB 直译为转译后备缓冲器,也被翻译为页表缓存。 TLB 为 CPU 的一种缓存,由存储器管理单元用于…...
Web3(阶段一:入门)——默克尔树
什么是默克尔树 默克尔树(Merkle Tree),又称哈希树,是一种基于哈希算法的数据结构,用于高效验证数据完整性。其核心思想是将数据分块并逐层哈希,最终生成唯一的根哈希值。 核心特点: 结构分层…...
Qt Quick 与 Qt 版本匹配关系
一、核心版本对应关系 Qt 版本Qt Quick 版本重要特性Qt 5.0Qt Quick 2.0首次引入基于Scene Graph的架构Qt 5.12Qt Quick 2.12长期支持版(LTS),新增粒子系统增强Qt 5.15Qt Quick 2.15最后5.x LTS,改进3D集成Qt 6.0Qt Quick 6.0完全重写渲染架构,支持VulkanQt 6.2Qt Quick 6.2…...
DefaultListableBeanFactory
文章目录 DefaultListableBeanFactory介绍继承关系源码码解析属性成员getbean方法setAutowireCandidateResolver方法resolveDependency方法doResolveDependency方法findAutowireCandidates 方法determineAutowireCandidate 方法 DefaultListableBeanFactory介绍 BeanFactory是…...
软件工程面试题(三十二)
1、java程序每天12点打印”hello” public static void main(String[] args) {Date date = new Date(); System.out.println(date.getHours()); while (true) {while (date.getHours() == 12) {if (date.getMinutes() == 0) {if (date.getSeconds() == 0) {System.out.print…...
高频面试题(含笔试高频算法整理)基本总结回顾66
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
生成式人工智能(AIGC):内容创作的新引擎与新挑战
在数字化时代,内容创作的需求呈爆炸式增长。无论是社交媒体、新闻媒体、广告营销还是娱乐行业,都急需大量高质量的文本、图像、音频和视频内容。然而,传统的内容创作方式面临着效率低下、成本高昂、创意枯竭等问题。生成式人工智能࿰…...