【SpringMVC】SpringMVC的启动过程与原理分析:从源码到实战
SpringMVC的启动过程与原理分析:从源码到实战
SpringMVC是Spring框架中用于构建Web应用的核心模块,它基于MVC(Model-View-Controller)设计模式,提供了灵活且强大的Web开发能力。本文将深入分析SpringMVC的启动过程、核心原理,并通过代码实战演示其工作流程。最后,我们还会探讨SpringMVC在JDK和Spring框架中的应用。
一、SpringMVC的启动过程
SpringMVC的启动过程可以分为以下几个关键步骤:
1. 加载配置文件
SpringMVC的启动始于配置文件的加载。通常,开发者会在web.xml
中配置DispatcherServlet
,并指定Spring的配置文件路径(如spring-servlet.xml
)。DispatcherServlet
是SpringMVC的核心控制器,负责接收所有HTTP请求并将其分发给相应的处理器。
<!-- web.xml -->
<servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
2. 初始化DispatcherServlet
DispatcherServlet
在初始化时会创建Spring的IoC容器(ApplicationContext
),并加载配置文件中定义的Bean。这一过程会调用DispatcherServlet
的initStrategies
方法,初始化各种核心组件,如HandlerMapping
、HandlerAdapter
、ViewResolver
等。
protected void initStrategies(ApplicationContext context) {initMultipartResolver(context); // 初始化文件上传解析器initLocaleResolver(context); // 初始化国际化解析器initThemeResolver(context); // 初始化主题解析器initHandlerMappings(context); // 初始化处理器映射器initHandlerAdapters(context); // 初始化处理器适配器initHandlerExceptionResolvers(context); // 初始化异常解析器initRequestToViewNameTranslator(context); // 初始化视图名称翻译器initViewResolvers(context); // 初始化视图解析器initFlashMapManager(context); // 初始化FlashMap管理器
}
3. 注册核心组件
- HandlerMapping:负责将请求URL映射到具体的处理器(Controller)。
- HandlerAdapter:负责调用处理器中的具体方法。
- ViewResolver:负责将逻辑视图名称解析为具体的视图对象(如JSP、Thymeleaf等)。
4. 启动完成
当所有组件初始化完成后,DispatcherServlet
进入就绪状态,等待接收和处理HTTP请求。
二、SpringMVC的核心原理
1. DispatcherServlet的工作流程
DispatcherServlet
是SpringMVC的核心,其工作流程如下:
- 接收请求:
DispatcherServlet
接收HTTP请求。 - 查找处理器:通过
HandlerMapping
找到对应的处理器(Controller)。 - 调用处理器:通过
HandlerAdapter
调用处理器方法。 - 处理请求:处理器执行业务逻辑,返回
ModelAndView
对象。 - 解析视图:通过
ViewResolver
将逻辑视图名称解析为具体的视图对象。 - 渲染视图:视图对象将模型数据渲染为HTML页面并返回给客户端。
2. HandlerMapping的作用
HandlerMapping
负责建立请求URL与处理器方法之间的映射关系。SpringMVC中最常用的HandlerMapping
是RequestMappingHandlerMapping
,它通过解析@RequestMapping
注解来实现映射。
3. HandlerAdapter的作用
HandlerAdapter
负责调用处理器方法。SpringMVC中最常用的HandlerAdapter
是RequestMappingHandlerAdapter
,它通过反射机制调用处理器方法,并将请求参数绑定到方法参数上。
4. ViewResolver的作用
ViewResolver
负责将逻辑视图名称解析为具体的视图对象。例如,InternalResourceViewResolver
会将逻辑视图名称解析为JSP页面。
三、代码实战:搭建一个简单的SpringMVC应用
1. 创建SpringMVC项目
首先,创建一个Maven项目,并添加SpringMVC的依赖:
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.20</version>
</dependency>
2. 配置DispatcherServlet
在web.xml
中配置DispatcherServlet
:
<servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
3. 配置SpringMVC的核心组件
在spring-servlet.xml
中配置HandlerMapping
、HandlerAdapter
和ViewResolver
:
<context:component-scan base-package="com.example.controller" /><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" />
</bean>
4. 创建Controller
创建一个简单的Controller类:
@Controller
public class HelloController {@RequestMapping("/hello")public ModelAndView hello() {ModelAndView mav = new ModelAndView();mav.addObject("message", "Hello, SpringMVC!");mav.setViewName("hello");return mav;}
}
5. 创建视图
在/WEB-INF/views/
目录下创建hello.jsp
:
<html>
<head><title>Hello</title>
</head>
<body><h1>${message}</h1>
</body>
</html>
6. 运行项目
将项目部署到Tomcat服务器中,访问http://localhost:8080/hello
,页面将显示“Hello, SpringMVC!”。
四、SpringMVC在JDK和Spring中的应用
1. 在JDK中的应用
SpringMVC的核心依赖于Java的Servlet API。例如,DispatcherServlet
继承自HttpServlet
,而HandlerMapping
和HandlerAdapter
等组件则基于Servlet API实现请求的分发和处理。
2. 在Spring框架中的应用
SpringMVC与Spring框架的其他模块(如Spring Boot、Spring Data、Spring Security等)紧密集成。通过Spring Boot,开发者可以快速搭建SpringMVC项目,并通过自动配置减少繁琐的配置工作。
例如,Spring Boot中只需添加spring-boot-starter-web
依赖,即可自动配置DispatcherServlet
、HandlerMapping
等核心组件:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
五、总结
SpringMVC的启动过程和核心原理是每个Java开发者都需要掌握的知识点。通过本文的分析和实战,我们深入了解了DispatcherServlet
的工作流程、HandlerMapping
和HandlerAdapter
的作用,以及如何通过代码搭建一个简单的SpringMVC应用。
SpringMVC的强大之处在于其灵活性和可扩展性,它不仅能与JDK的Servlet API无缝集成,还能与Spring框架的其他模块协同工作,为开发者提供全面的Web开发解决方案。
希望本文对你理解SpringMVC有所帮助!如果你对SpringMVC有更多疑问,欢迎在评论区留言讨论。
关注我,解锁更多技术干货!
相关文章:
【SpringMVC】SpringMVC的启动过程与原理分析:从源码到实战
SpringMVC的启动过程与原理分析:从源码到实战 SpringMVC是Spring框架中用于构建Web应用的核心模块,它基于MVC(Model-View-Controller)设计模式,提供了灵活且强大的Web开发能力。本文将深入分析SpringMVC的启动过程、核…...

转自南京日报:天洑软件创新AI+仿真技术变制造为“智造
以下文章来源:南京日报 进入3月,南京天洑软件有限公司(以下简称天洑软件)董事长张明更加忙碌。“公司强调工业软件在数字经济与先进制造业融合中的关键作用,并已广泛应用在能源、电力和航空等领域。”他说,…...
golang dlv调试工具
golang dlv调试工具 在goland2022.2版本 中调试go程序报错 WARNING: undefined behavior - version of Delve is too old for Go version 1.20.7 (maximum supported version 1.19) 即使你go install了新的dlv也无济于事 分析得出Goland实际使用的是 Goland安装目录下dlv 例…...

LSTM方法实践——基于LSTM的汽车销量时序建模与预测分析
Hi,大家好,我是半亩花海。本实验基于汽车销量时序数据,使用LSTM网络(长短期记忆网络)构建时间序列预测模型。通过数据预处理、模型训练与评估等完整流程,验证LSTM在短期时序预测中的有效性。 目录 一、实验…...

微服务——网关、网关登录校验、OpenFeign传递共享信息、Nacos共享配置以及热更新、动态路由
之前学习了Nacos,用于发现并注册、管理项目里所有的微服务,而OpenFeign简化微服务之间的通信,而为了使得前端可以使用微服务项目里的每一个微服务的接口,就应该将所有微服务的接口管理起来方便前端调用,所以有了网关。…...

【数据结构】二叉搜索树、平衡搜索树、红黑树
二叉搜索树(Binary Search Tree) 二叉搜索树是一种特殊的二叉树,它用来快速搜索某个值,对于每个节点都应该满足以下条件: 若该节点有左子树,那么左子树中所有节点的值都应该小于该节点的值。若该节点有右…...

Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案
目录 前言1. 问题分析2. 时间戳(推荐,可尝试)3. 使用 JsonDeserialize & JsonSerialize(中立)4. 前端传 ISO-8601 格式(不推荐,可尝试)5. 用 String(中立)…...
Xilinx ZYNQ FSBL解读:LoadBootImage()
篇首 最近突发奇想,Xilinx 的集成开发环境已经很好了,很多必要的代码都直接生成了,这给开发者带来了巨大便利的同时,也让人错过了很多代码的精彩,可能有很多人用了很多年了,都还无法清楚的理解其中过程。博…...

mysql中in和exists的区别?
大家好,我是锋哥。今天分享关于【mysql中in和exists的区别?】面试题。希望对大家有帮助; mysql中in和exists的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中,IN 和 EXISTS 都用于进行子查询,但它…...

oracle 数据导出方案
工作中有遇到需要将oracle 数据库表全部导出,还需要去除表数据中的换行符。 方案 shell 设计 封装函数 1 function con_oracle() 用于连接oracle 2 function send_file() 用于发送文件 3 主程序 使用循环将所有表导出并发送到数据服务器 主程序 程序代码 #!…...
Apache Commons Lang3 和 Commons Net 详解
目录 1. Apache Commons Lang3 1.1 什么是 Apache Commons Lang3? 1.2 主要功能 1.3 示例代码 2. Commons Net 2.1 什么是 Commons Net? 2.2 主要功能 2.3 示例代码 3. 总结 3.1 Apache Commons Lang3 3.2 Commons Net 3.3 使用建议 4. 参考…...
从0开始的操作系统手搓教程33:挂载我们的文件系统
目录 代码实现 添加到初始化上 上电看现象 挂载分区可能是一些朋友不理解的——实际上挂载就是将我们的文件系统封装好了的设备(硬盘啊,SD卡啊,U盘啊等等),挂到我们的默认分区路径下。这样我们就能访问到了ÿ…...
【Linux】36.简单的TCP网络程序
文章目录 1. TCP socket API 详解1.1 socket():打开一个网络通讯端口1.2 bind():绑定一个固定的网络地址和端口号1.3 listen():声明sockfd处于监听状态1.4 accept():接受连接1.5 connect():连接服务器 2. 实现一个TCP网络服务器2.1 Log.hpp - "多级日志系统"2.2 Daem…...
时序分析
1、基本概念介绍 1.1、 建立时间 T(su) 建立时间:setup time,它是指有效的边沿信号到来之前,输入端口数据保持稳定的时间。 1.1.1、 建立时间要求: 建立时间要求指的是 想要寄存器如期的工作,在有效时…...
doris:ClickHouse
Doris JDBC Catalog 支持通过标准 JDBC 接口连接 ClickHouse 数据库。本文档介绍如何配置 ClickHouse 数据库连接。 使用须知 要连接到 ClickHouse 数据库,您需要 ClickHouse 23.x 或更高版本 (低于此版本未经充分测试)。 ClickHouse 数据库的 JDBC 驱动程序&a…...
NLP常见任务专题介绍(1)-关系抽取(Relation Extraction, RE)任务训练模板
📌 关系抽取(Relation Extraction, RE)任务训练示例 本示例展示如何训练一个关系抽取模型,以识别两个实体之间的关系。 1️⃣ 任务描述 目标:从文本中提取两个实体之间的语义关系,例如 “人物 - 组织”、“药物 - 疾病”、“公司 - 创始人” 等。输入:句子 + 标注的实…...

大模型Transformer的MOE架构介绍及方案整理
前言:DeepSeek模型最近引起了NLP领域的极大关注,也让大家进一步对MOE(混合专家网络)架构提起了信心,借此机会整理下MOE的简单知识和对应的大模型。本文的思路是MOE的起源介绍、原理解释、再到现有MOE大模型的整理。 一…...
零基础掌握Linux SCP命令:5分钟实现高效文件传输,小白必看!
引言 “为什么我传个文件到服务器要折腾半小时?” 如果你也曾在Linux系统中为文件传输抓狂,今天这篇保姆级教程就是你的救星!SCP命令——一个基于SSH协议的高效传输工具,只需5分钟,彻底告别FTP客户端和繁琐操作&#…...
分类评价指标
基础概念解释 TP、TN、FP、FN 这里T是True,F是False,P为Positive,N为Negative TP:被模型正确地预测为正样本(原本为正样本,预测为正样本) TN:被模型正确地预测为负样本࿰…...
Python项目-基于Django的在线教育平台开发
1. 项目概述 在线教育平台已成为现代教育的重要组成部分,特别是在后疫情时代,远程学习的需求显著增加。本文将详细介绍如何使用Python的Django框架开发一个功能完善的在线教育平台,包括系统设计、核心功能实现以及部署上线等关键环节。 本项…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...