Spring MVC流程

SpringMVC启动流程

  • 启动流程
  • 父子容器
  • 请求处理
    • MultipartFile 解析
    • 参数传递
    • 返回值处理
    • HandlerInterceptor

启动流程

  1. 启动Tomcat
  2. 解析web.xml
  3. 创建DispatcherServlet
  4. 调用DIspatcherServlet的init方法
    4.1 创建Spring容器
    4.2 发布ContextRefresheEvent
    4.3 在OnRefreshed方法中触发initStrategies方法
    4.3.1初始化HandlerMappings (RequestMappingHandler会把@RequestMappping标注的方法解析为HandlerMapping Map<path, 注解信息>, Map<注解信息,方法>)
    4.3.2 初始化HandlerAdapters(不同handler使用不同的Adapter)
    4.3.3 初始化Resolvers…
默认添加的Handler和Adapter在DispatcherServlet.properties文件中org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappingorg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

父子容器

servlet会根据配置文件spring-mvc.xml生成子容器。

    <!-- 配置 Spring MVC 的 DispatcherServlet --><servlet><servlet-name>app</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><!-- 配置 DispatcherServlet 的 URL 映射 --><servlet-mapping><servlet-name>app</servlet-name><url-pattern>/app/*</url-pattern></servlet-mapping>

如何需要父容器,需要如下配置。
Tomcat会先解析listener,根据配置spring.xml生成父容器,子容器可以使用父容器中的Bean。实际应用中其实一个容器就够了。即只使用servlet中的容器。

    <!-- 配置 Spring 上下文监听器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:srping.xml</param-value></context-param><!-- 配置 Spring 的 ContextLoaderListener --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

请求处理

请求是通过DispatcherServlet的doDispatch方法处理。根据path得到handler后处理请求。Adapter处理请求时需要使用Resolver解析参数传递到方法中,方法执行后还需要使用HttpMessageConverter处理返回值转换。

MultipartFile 解析

doDispatch方法在找handler之前会先判断是否是表单文件上传。通过request的Content-Type: mulpart/form-data来判断是MultipartFile,然后MulpartResolver把表单数据解析为multipartFiles,结构为map<filename, standardMultipartFile>。然后会把MultipartFile传到请求的处理方法中。
因此需要配置MultipartFile的Resolver。

<multipart-config><location>/tmp</location> <!-- 临时文件存储路径 --><max-file-size>10485760</max-file-size> <!-- 单个文件最大 10MB --><max-request-size>20971520</max-request-size> <!-- 整个请求最大 20MB --><file-size-threshold>1048576</file-size-threshold> <!-- 超过 1MB 的文件写入磁盘 -->
</multipart-config>
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />

参数传递

在 Spring MVC 中,参数处理器(HandlerMethodArgumentResolver)用于将 HTTP 请求中的参数绑定到控制器方法的参数上。
@RequestParam:RequestParamMethodArgumentResolver从request中取param
@PathVariabl:PathVariableMethodArgumentResolver将 URL 路径中的变量绑定到方法参数
@RequestBody:RequestResponseBodyMethodProcessor
@RequestPart:将 multipart 请求中的文件或复杂对象绑定到方法参数。
@RequestHeader:RequestHeaderMethodArgumentResolver将 HTTP 请求头绑定到方法参数
无注解的简单类型:取request与参数名称相同的param
无注解对象类型参数:ModelAttributeMethodProcessor会先调用对象的无参构造器生成一个对象,然后会根据属性名称取param中取参数。如果只有一个属性,即使名称不一致也能赋值。

返回值处理

HttpMessageConverter通过方法返回的类型+Accept接收的格式来确定能否处理。默认提供的HttpMessageConverter只有StringHttpMessageConverter和ByteArrayHttpMessageConverter。因此复杂对象需要引入MappingJackson2HttpMessageConverter。也可以自己定义转换器,通过@InitBinder绑定对象和使用的转换器。

HandlerInterceptor

handlerInterceptor可以在handler处理请求前后添加处理逻辑。
preHandle:请求方法调用之前执行,如果出现错误则停止不执行请求方法。
postHandle:请求方法调用之后执行
afterCompletion:总会执行

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

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

相关文章

【大数据】ClickHouse常见的错误及解决方式

ClickHouse 是一款高性能的列式数据库&#xff0c;但在使用过程中难免会遇到一些错误。本文将介绍一些 ClickHouse 常见的错误及其解决方式&#xff0c;帮助您更好地使用 ClickHouse。 1、错误&#xff1a;DB::Exception 错误信息 DB::Exception:Table engine Distributed d…

物理竞赛中的线性代数

线性代数 1 行列式 1.1 n n n 阶行列式 定义 1.1.1&#xff1a;称以下的式子为一个 n n n 阶行列式&#xff1a; ∣ A ∣ ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}\mathbf A\end{vmatrix} \begin{vmatrix} a_{11…

IP-----动态路由OSPF

这只是IP的其中一块内容&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为GRE和MGRE &#xff0c;可通过以下路径查看IP-------GRE和MGRE-CSDN博客,欢迎指正 注意&#xff01;&#xff01;&#xff01;本部分内容较多所以分成了两部分在下一章 5.动态路由OS…

数字内容体验未来趋势:交互升级与用户深耕

智能技术重塑内容交互 随着数字内容体验进入深度智能化阶段&#xff0c;AI驱动的内容生成与智能推荐算法正在重构用户与信息的交互范式。基于自然语言处理技术的内容创作工具&#xff0c;已实现从文本自动生成到多模态内容适配的跨越&#xff0c;企业能够以分钟级速度产出符合…

2025年2月21日优雅草内测分发站全新升级-测试运营-优雅草内测分发站新用户提供免费100下载点-2月28日正式运营并且提供私有化部署版本

2025年2月21日优雅草内测分发站全新升级-测试运营-优雅草内测分发站新用户提供免费100下载点-2月28日正式运营并且提供私有化部署版本 说明 优雅草内测分发站新用户提供免费100下载点&#xff0c;优雅草分运营站和demo测试站 运营站&#xff1a;www.youyacao.cn 提供免费100…

动态内存池设计与环形缓冲区实现详解

一、动态内存池设计 在嵌入式系统中&#xff0c;频繁使用 malloc 和 free 会导致内存碎片和性能问题。动态内存池通过预分配固定大小的内存块&#xff0c;并统一管理分配与释放&#xff0c;显著提高内存使用效率和实时性。 1. 核心设计思路 预分配内存&#xff1a;将内存划分…

015--基于STM32F103ZET6的智能风扇设计

1.实物视频演示 智能风扇演示视频 2.程序代码讲解 STM32F103ZET6智能风扇_哔哩哔哩_bilibili 3源代码获取 https://download.csdn.net/download/weixin_41011452/90440545

【洛谷贪心算法】P1106删数问题

这道题可以使用贪心算法来解决&#xff0c;核心思路是尽量让高位的数字尽可能小。当我们逐步删除数字时&#xff0c;会优先删除高位中相对较大的数字。具体做法是从左到右遍历数字序列&#xff0c;当发现当前数字比它后面的数字大时&#xff0c;就删除当前数字&#xff0c;直到…

开源PDF解析工具olmOCR

olmOCR 是由 Allen Institute for Artificial Intelligence (AI2) 的 AllenNLP 团队开发的一款开源工具&#xff0c;旨在将PDF文件和其他文档高效地转换为纯文本&#xff0c;同时保留自然的阅读顺序。它支持表格、公式、手写内容等。 olmOCR 经过学术论文、技术文档和其他文档…

基因型—环境两向表数据分析——品种生态区划分

参考资料&#xff1a;农作物品种试验数据管理与分析 用于品种生态区划分的GGE双标图有两种功能图&#xff1a;试点向量功能图和“谁赢在哪里”功能图。双标图的具体模型基于SD定标和h加权和试点中心化的数据。本例中籽粒产量的GGE双标图仅解释了G和GE总变异的53.6%&#xff0c;…

HTTP~文件 MIME 类型

MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;类型&#xff0c;即多用途互联网邮件扩展类型&#xff0c;是一种标准&#xff0c;用来表示文档、文件或字节流的性质和格式。最初是为了在电子邮件系统中支持非 ASCII 字符文本、二进制文件附件等而设计的&a…

降维攻击!PCA与随机投影优化高维KNN

引言&#xff1a;高维数据的“冰山困境” 假设你正在处理一个电商平台的商品图片分类任务&#xff1a;每张图片被提取为1000维的特征向量&#xff0c;100万条数据的距离计算让KNN模型陷入“维度地狱”——计算耗时长达数小时&#xff0c;且内存占用超过10GB。 破局关键&#…

Rust 是什么

Rust 是什么 Rust 是一种由 Mozilla 开发的系统级编程语言,它于 2010 年首次亮相,在 2015 年发布 1.0 版本,此后迅速发展并受到广泛关注。 内存安全:Rust 最大的亮点之一是它在编译阶段就能够避免常见的内存错误,如空指针引用、数据竞争和内存泄漏等。它通过所有权(Owne…

网络变压器的主要电性参数与测试方法(2)

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;网络变压器的主要电性参数与测试方法&#xff08;2&#xff09;.. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法&#xff1a; 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…

UniApp 中封装 HTTP 请求与 Token 管理(附Demo)

目录 1. 基本知识2. Demo3. 拓展 1. 基本知识 从实战代码中学习&#xff0c;上述实战代码来源&#xff1a;芋道源码/yudao-mall-uniapp 该代码中&#xff0c;通过自定义 request 函数对 HTTP 请求进行了统一管理&#xff0c;并且结合了 Token 认证机制 请求封装原理&#xff…

初阶数据结构习题【3】(1时间和空间复杂度)——203移除链表元素

1. 题目描述 力扣在线OJ——移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3…

互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书

一、项目概述 1.1 项目背景 随着互联网技术的飞速发展以及人们生活品质的显著提升&#xff0c;传统房产交易、装修设计、家居购物等领域暴露出诸多问题。信息不对称使得用户难以获取全面准确的信息&#xff0c;在房产交易中可能高价买入或低价卖出&#xff0c;装修时可能遭遇…

15.13 AdaLoRA自适应权重矩阵微调:动态秩调整的智能革命

AdaLoRA自适应权重矩阵微调:动态秩调整的智能革命 一、技术架构解析 #mermaid-svg-u3TfE3YrkeWSjem2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u3TfE3YrkeWSjem2 .error-icon{fill:#552222;}#mermaid-svg-u3…

P9231 [蓝桥杯 2023 省 A] 平方差

P9231 [蓝桥杯 2023 省 A] 平方差 - 洛谷 题目描述 给定 L,R&#xff0c;问 L≤x≤R 中有多少个数 x 满足存在整数 y,z 使得 xy2−z2。 输入格式 输入一行包含两个整数 L,R&#xff0c;用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 输…

【GenBI优化】提升text2sql准确率:建议使用推理大模型,增加重试

引言 Text-to-SQL&#xff08;文本转 SQL&#xff09;是自然语言处理&#xff08;NLP&#xff09;领域的一项重要任务&#xff0c;旨在将自然语言问题自动转换为可在数据库上执行的 SQL 查询语句。这项技术在智能助手、数据分析工具、商业智能&#xff08;BI&#xff09;平台等…