当前位置: 首页 > article >正文

SpringMVC(结合源码浅析工作流程)

SpringMVC

概念

Spring MVC 是基于前端控制器(Front Controller)设计模式的 Web 框架,在 Web 应用中指一个统一的入口,用来接收所有客户端请求,并统一进行分发、处理。在 SpringMVC 中,前端控制器就是 DispatcherServlet,它的作用包括:

  • 接收所有请求
  • 调用对应的处理器(Controller
  • 统一处理返回结果(视图渲染、数据响应等)

整体工作流程

工作流程图

在这里插入图片描述

用户发起请求

用户在浏览器输入一个地址,例如

http://localhost:8080/api/seckill/execute

这个请求先被 Web 容器(Tomcat)接收,再被转交给 Spring MVC 的核心组件——DispatcherServlet

DispatcherServlet进行调度

DispatcherServlet拿到请求之后会调用doDispatch()DispatcherServlet接收到请求后会执行一系列方法,主要流程都集中的 doDispatch() 方法中

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpServletRequest processedRequest = request;HandlerExecutionChain mappedHandler = null;ModelAndView mv = null;Exception dispatchException = null;try {// 1. 获取 HandlerExecutionChain(处理器执行链)mappedHandler = getHandler(processedRequest);// 2. 获取 HandlerAdapter(处理器适配器)HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());// 3. 调用前置拦截器(可选)if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}// 4. 执行 Controller 处理方法mv = ha.handle(processedRequest, response, mappedHandler.getHandler());// 5. 调用后置拦截器(可选)mappedHandler.applyPostHandle(processedRequest, response, mv);}catch (Exception ex) {dispatchException = ex;}// 6. 处理视图渲染或异常processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}

下面依次介绍

查找处理器(handler
// mappedHandler = getHandler(processedRequest);
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;
}

遍历所有 HandlerMapping,逐个尝试匹配请求,找到对应的处理器(Controller)执行链

HandlerMapping是一个接口,常见的实现类有RequestMappingHandlerMapping处理基于注解的请求映射(如 @RequestMapping@GetMapping 等)

获取对应的处理器适配器(HandlerAdapter
// HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {if (this.handlerAdapters != null) {for (HandlerAdapter adapter : this.handlerAdapters) {if (adapter.supports(handler)) {return adapter;}}}
}

遍历所有 HandlerAdapter,判断当前适配器是否支持处理传入的 handler(Controller)

HandlerAdapter的作用在于解耦 DispatcherServlet 与具体 Controller 实现,使得通过同一个接口来调用不同类型的处理器(Controller

调用 Controller 方法
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

返回一个 ModelAndView 对象。

实际上是以反射的方式获取Method ,再Method.invoke()执行目标方法。

ModelAndView 是封装模型数据视图信息的对象。

public class ModelAndView {private Object view;/** ModelMap继承了LinkedHashMap<String, Object>*/private ModelMap model;
}

Model(模型):用于存放业务数据,类型是一个 LinkedHashMap<String, Object>

View(视图):视图名称或者视图对象(如 JSP),用来告诉框架最终渲染哪个页面

视图解析与渲染
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);->render(mv, request, response);->View view;->view = resolveViewName(viewName, mv.getModelInternal(), locale, request);//返回View对象->view.render(mv.getModelInternal(), request, response);//渲染

根据mv中的view找到对应的ViewResolverViewResolver 的作用是

  • Controller 返回的是一个逻辑视图名(例如 "home"
  • ViewResolver 会根据配置,把逻辑视图名转换成具体视图文件的路径(例如 /WEB-INF/views/home.jsp
  • 视图解析后由视图渲染器渲染页面并返回给客户端,就是将mv中的model数据填充到View对象中

相关文章:

SpringMVC(结合源码浅析工作流程)

SpringMVC 概念 Spring MVC 是基于前端控制器&#xff08;Front Controller&#xff09;设计模式的 Web 框架&#xff0c;在 Web 应用中指一个统一的入口&#xff0c;用来接收所有客户端请求&#xff0c;并统一进行分发、处理。在 SpringMVC 中&#xff0c;前端控制器就是 Di…...

学习STC51单片机13(芯片为STC89C52RC)

我去&#xff0c;兄弟们我们今天来学习一个牛逼 的硬件&#xff0c;它叫超声波测距模块HC—SR04 硬件&#xff1a;HC—SR04 哎&#xff0c;想当初最想要玩的就是这个模块&#xff0c;科技感十足&#xff0c;那现在就让我们玩玩吧 超声波测距传感器 原理就是说需要给Trig 10u…...

Claude 4 系列 Opus 4 与 Sonnet 4正式发布:Claude 4新特性都有哪些?

随着 Claude 4 系列&#xff08;Opus 4 与 Sonnet 4&#xff09;的正式发布&#xff0c;Anthropic 把自家大模型从“会聊天”推进到“能当自主代理”──不仅推理更深、上下文更长&#xff0c;还内置代码执行、多模态理解、工具调用等一揽子全新能力&#xff1b;同时&#xff0…...

Swagger API 未授权访问漏洞【原理扫描】修复

一、背景 漏洞名称&#xff1a;Swagger API 未授权访问漏洞【原理扫描】 风险等级&#xff1a;中 详细描述&#xff1a; Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务&#xff0c;方便开发者快速了解和调试接口。但由于…...

深度“求索”:DeepSeek+Dify构建个人知识库

目录 前言 环境部署 安装Docker 安装Dify 配置Dify 部署知识库 创建应用 前言 在当今数字化信息爆炸的时代&#xff0c;数据隐私和个性化知识管理成为企业和个人关注的焦点。Dify&#xff0c;作为一款备受瞩目的开源 AI 应用开发平台&#xff0c;为用户提供了完整的私有…...

基于R语言的空间异质性数据分析技术

在自然和社会科学领域&#xff0c;存在大量与地理或空间相关的数据&#xff0c;这些数据通常具有显著的空间异质性。传统的统计学方法在处理这类数据时往往力不从心。基于R语言的一系列空间异质性数据分析方法&#xff0c;如地理加权回归&#xff08;GWR&#xff09;、地理加权…...

C++:动态刷新打印内容

目录 1.简介1.1 Display类原理简述 2.代码2.1 main.cpp&#xff1a;无注释版2.2 main.cpp&#xff1a;有注释版 3.编译运行 1.简介 本文介绍一个用于命令行动态覆盖输出的C实现&#xff08;Display类&#xff09;&#xff1b; 效果说明&#xff1a; 普通输出会直接换行显示。…...

网络学习-TCP协议(七)

一、TCP协议 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。 1、三次握手 客户端&#xff1a; 1、先发起连接&#xff0c;发送SYN置1&#xff0c;seqnum12345(随机值)----半连接…...

基于微信小程序的高校校园微活动管理系统设计与实现(源码+定制+开发)高校微信小程序校园活动发布与互动平台开发 面向大学生群体的校园活动移动平台设计与实现

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

Python 项目中安装 OpenAI 库的详细指南

在 Windows 系统中指定版本安装 OpenAI 库的指南 在 Windows 系统中&#xff0c;尤其是使用 Python 3.7.8 时&#xff0c;安装 OpenAI 库可能会遇到一些问题。本文将为你提供一个简单易懂的解决方案&#xff0c;帮助你成功安装指定版本的 OpenAI 库。 一、问题背景 当你在 W…...

云计算与大数据进阶 | 27、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(上)

数据中心里&#xff0c;存储系统是至关重要的组成部分。由于相关硬件组件与存储操作系统的多样性和复杂性&#xff0c;如何在保证存储稳定、安全、可靠的同时&#xff0c;实现灵活扩展和自服务&#xff0c;一直是困扰数据中心全面云化的难题。 简单来说&#xff0c;现在的难题…...

使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第二部分)

建立向量嵌入数据库 from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from langchain.docstore.document import Document from langchain_chroma.vectorstores import Chromaimport vertexai from…...

IvorySQL-WASM:免安装的数据库探索之旅

简介 为了降低社区用户的使用门槛&#xff0c;提升使用体验&#xff0c;IvorySQL 社区特别推出了 IvorySQL-WASM 项目&#xff0c;帮助用户快速在线 Demo。 IvorySQL-WASM 基于开源的 Postgres-WASM 框架开发。它允许用户直接在网页浏览器中体验 IvorySQL&#xff0c;无需本地…...

飞牛fnNAS远程映射盘符

目录 一、NAS、PC端配置Zerotier 二、使用网上邻居 三、使用WebDAV 1.开启WebDAV 2.PC上安装RaiDrive并设置 如果能将NAS作为本机一个盘符来使用,一定会令我非常方便。如果是本地,可以很方便实现。 将飞牛NAS映射为本地盘符,常用两种方式,一种是网上邻居,另一种是We…...

Java设计模式:探索编程背后的哲学

设计模式是软件开发中的一种常见方法&#xff0c;它为常见问题提供了解决方案。在Java世界中&#xff0c;设计模式的应用尤为广泛。本文将深入探讨Java设计模式的起源、分类和实际应用&#xff0c;帮助读者更好地理解和应用这些模式。设计模式不仅是编程的技术&#xff0c;更是…...

会话管理有哪些

 使用服务器或者框架的会话管理控制。应用程序应当只识别有效的会话标识符。  会话标识符必须总是在一个可信系统&#xff08;比如&#xff1a;服务器&#xff09;上创建。  会话管理控制应当使用通过审查的算法以保证足够的随机会话标识符。  为包含已验证的会…...

《C++20新特性全解析:模块、协程与概念(Concepts)》

引言&#xff1a;C20——现代C的里程碑 C20是继C11之后最具革命性的版本&#xff0c;它通过模块&#xff08;Modules&#xff09;、协程&#xff08;Coroutines&#xff09;和概念&#xff08;Concepts&#xff09;三大核心特性&#xff0c;彻底改变了C的代码组织方式、并发模…...

Docker部署OpenSearch集群

OpenSearch 简介 OpenSearch 是一款开源的搜索与分析引擎&#xff0c;最初由亚马逊 AWS 开发&#xff0c;于 2021 年 9 月将其移交至 Linux 基金会旗下的 OpenSearch 软件基金会&#xff0c;此后实现了社区主导的治理模式。其具有高性能、可扩展性强、兼容性强等优点&#xff…...

三宽用到的网络类型

用家宽、企宽和专线运行P2P的网络类型本质要求一致&#xff0c;但具体配置和优化方向因宽带类型而异。以下是关键差异与共性分析&#xff1a; 一、核心网络类型要求&#xff08;三者的共性&#xff09; 公网IP 必要性&#xff1a;均需公网IP&#xff08;非内网IP&#xff09;以…...

【AS32X601驱动系列教程】PLIC_中断应用详解

平台中断控制器&#xff08;Platform Level Interrupt Controller&#xff0c;PLIC&#xff09;是国科安芯AS32系列MCU芯片的中断控制器&#xff0c;主要对中断源进行采样&#xff0c;优先级仲裁和分发。各外设中断统一连到PLIC&#xff0c;PLIC统一管理并输出中断请求到内核。…...

单目视觉测量及双目视觉测量

一、单目视觉测量 1.1 原理部分讲解 单目视觉系统通过采集图像&#xff0c;将图像转换为二维数据&#xff0c;然后对采集的图像进行模式识别&#xff0c;通过图像匹配算法识别行驶过程中的车辆、行人、交通标志等&#xff0c;最后依据目标物体的运动模式和定位…...

python学习打卡day34

DAY 34 GPU训练及类的call方法 知识点回归&#xff1a; CPU性能的查看&#xff1a;看架构代际、核心数、线程数GPU性能的查看&#xff1a;看显存、看级别、看架构代际GPU训练的方法&#xff1a;数据和模型移动到GPU device上类的call方法&#xff1a;为什么定义前向传播时可以直…...

掩码与网关是什么?

1. 子网掩码&#xff08;Subnet Mask&#xff09; 作用&#xff1a;划分“小区”范围 想象你住在一个小区&#xff08;子网&#xff09;里&#xff1a; 小区门牌号 IP地址&#xff08;如 192.168.1.10&#xff09; 小区边界 子网掩码&#xff08;如 255.255.255.0&#xf…...

leetcode-快慢指针系列

开胃小菜 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链…...

JAVA05基本数据类型和包装类的转换,转换成其他数据类型,包装类与字符串的转换+学生类的定义实例

1.基本数据类型和包装类的转换 下面是一个自动手动的例题 2.将包装类转换成其他类型 3. 将数据类型转换成字符串 将字符串转换成数据类型 以下是一个例题 学生类的例题...

Python打卡训练营学习记录Day34

知识点回归&#xff1a; CPU性能的查看&#xff1a;看架构代际、核心数、线程数 GPU性能的查看&#xff1a;看显存、看级别、看架构代际 GPU训练的方法&#xff1a;数据和模型移动到GPU device上 类的call方法&#xff1a;为什么定义前向传播时可以直接写作self.fc1(x) CPU性…...

动手学习深度学习V1.1 chapter2 (2.1-2.2)

chapter2&#xff1a;深度学习基础 区分问题&#xff1a;回归问题还是分类问题&#xff1f; 输出结果是不明确的连续值的时候就是回归问题&#xff0c;比如房价预测&#xff0c;销售额预测等。 输出结果是明确几个离散值的时候就是分类问题&#xff0c;比如字符识别&#xf…...

数据结构(6)线性表-队列

一、队列的概述 队列也是一种特殊的线性表&#xff0c;只允许在一段插入数据&#xff0c;另一端删除数据。插入操作的一端称为队尾&#xff0c;删除操作的一端称为队头。 如图&#xff1a; 二、队列相关操作 1.队列结构体的声明 类似于栈&#xff0c;他肯定也得借助于数组或…...

NumPy 2.x 完全指南【十七】转置操作

文章目录 1. 什么是转置2. 转置操作2.1 transpose2.2 ndarray.T2.3 moveaxis2.4 rollaxis2.5 permute_dims2.6 swapaxes2.7 matrix_transpose 1. 什么是转置 在线性代数中&#xff0c;矩阵转置是指将矩阵的行和列进行互换&#xff0c;即原矩阵的第 i i i 行、第 j j j 列元素…...

【数据架构04】数据湖架构篇

✅ 10张高质量数据治理架构图 无论你是数据架构师、治理专家&#xff0c;还是数字化转型负责人&#xff0c;这份资料库都能为你提供体系化参考&#xff0c;高效解决“架构设计难、流程不清、平台搭建慢”的痛点&#xff01; &#x1f31f;限时推荐&#xff0c;速速收藏&#…...