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

【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。这一过程会调用DispatcherServletinitStrategies方法,初始化各种核心组件,如HandlerMappingHandlerAdapterViewResolver等。

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的核心,其工作流程如下:

  1. 接收请求DispatcherServlet接收HTTP请求。
  2. 查找处理器:通过HandlerMapping找到对应的处理器(Controller)。
  3. 调用处理器:通过HandlerAdapter调用处理器方法。
  4. 处理请求:处理器执行业务逻辑,返回ModelAndView对象。
  5. 解析视图:通过ViewResolver将逻辑视图名称解析为具体的视图对象。
  6. 渲染视图:视图对象将模型数据渲染为HTML页面并返回给客户端。

2. HandlerMapping的作用

HandlerMapping负责建立请求URL与处理器方法之间的映射关系。SpringMVC中最常用的HandlerMappingRequestMappingHandlerMapping,它通过解析@RequestMapping注解来实现映射。

3. HandlerAdapter的作用

HandlerAdapter负责调用处理器方法。SpringMVC中最常用的HandlerAdapterRequestMappingHandlerAdapter,它通过反射机制调用处理器方法,并将请求参数绑定到方法参数上。

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中配置HandlerMappingHandlerAdapterViewResolver

<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,而HandlerMappingHandlerAdapter等组件则基于Servlet API实现请求的分发和处理。

2. 在Spring框架中的应用

SpringMVC与Spring框架的其他模块(如Spring Boot、Spring Data、Spring Security等)紧密集成。通过Spring Boot,开发者可以快速搭建SpringMVC项目,并通过自动配置减少繁琐的配置工作。

例如,Spring Boot中只需添加spring-boot-starter-web依赖,即可自动配置DispatcherServletHandlerMapping等核心组件:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

五、总结

SpringMVC的启动过程和核心原理是每个Java开发者都需要掌握的知识点。通过本文的分析和实战,我们深入了解了DispatcherServlet的工作流程、HandlerMappingHandlerAdapter的作用,以及如何通过代码搭建一个简单的SpringMVC应用。

SpringMVC的强大之处在于其灵活性和可扩展性,它不仅能与JDK的Servlet API无缝集成,还能与Spring框架的其他模块协同工作,为开发者提供全面的Web开发解决方案。

希望本文对你理解SpringMVC有所帮助!如果你对SpringMVC有更多疑问,欢迎在评论区留言讨论。


关注我,解锁更多技术干货!

相关文章:

【SpringMVC】SpringMVC的启动过程与原理分析:从源码到实战

SpringMVC的启动过程与原理分析&#xff1a;从源码到实战 SpringMVC是Spring框架中用于构建Web应用的核心模块&#xff0c;它基于MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;提供了灵活且强大的Web开发能力。本文将深入分析SpringMVC的启动过程、核…...

出现“ping不通但可以远程连接”的情况可能由以下原因导致

出现“ping不通但可以远程连接”的情况可能由以下原因导致&#xff1a; 1.防火墙或安全软件限制 • 原因&#xff1a;防火墙或安全软件可能阻止了ICMP数据包&#xff08;ping使用的协议&#xff09;&#xff0c;但允许了远程连接所需的协议&#xff08;如TCP&#xff09;。 …...

MySQL表空间碎片原理和解决方案

一、表空间与碎片的基本概念 表空间&#xff1a;MySQL中存储表数据和索引的物理文件&#xff08;如InnoDB的.ibd文件&#xff09;。分为系统表空间和独立表空间。碎片&#xff1a;数据在物理存储上不连续&#xff0c;分为行级碎片&#xff08;单行跨多页&#xff09;和页级碎片…...

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…...

最小栈 _ _

一&#xff1a;题目 二&#xff1a;思路 解释&#xff1a;一个栈名为st&#xff0c;其用来正常的出入栈&#xff0c;一个栈名为minst&#xff0c;其的栈顶元素一定是最小的元素 入栈&#xff1a;第一个元素&#xff0c;两个栈一起入&#xff0c;后面再入栈&#xff0c;只有入栈…...

HTTPS加密原理详解

目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议&#xff0c;是在HTTP的基础上加入了一个加密层&#xff0c;由…...

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片&#xff0c;运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具&#xff0c;如基本参数调整、HSL&#xff08;色相、饱和度、明亮度&#xff09;调整、曲线工具等改变照片原本的色彩、明度、对比度等属性&#xff0c;将…...

安装pyqt6出现的问题

安装PyQt6报错&#xff1a; PermissionError: [WinError 32] 另一个程序正在使用此文件&#xff0c;进程无法访问。: C:\\Users\\xyj19\\AppData\\Local\\Temp\\tmp3xfmekh7 [end of output] note: This error originates from a subprocess, and is likely not a pr…...

java调用c++

VScode 配置java 并且使用JNA调用c 动态库 安装 Java 开发环境 ​ 安装 JDK官网直接下载就好&#xff0c;推荐镜像下载 通过网盘分享的文件&#xff1a;jdk-8u144-windows-x64.exe​ 链接: https://pan.baidu.com/s/1Ov9bJkPNnOgcliBL-PSTFQ?pwdpg43 提取码: pg43 ​ 直接安…...

gitlab+jenkins+harbor+k8s安装操作流程之Jenkins

准备环境 一台centos7系统 4C/8G/100G 如果是jenkins2.5以上版本需要centos8以上版本 JDK1.8编译安装(最新版本jdk需要18以上) MAVEN编译安装 GIT编译安装 JDK1.8步骤 tar -zxvf 解压 vim /etc/profile export JAVA_HOME/data/jdk1.8.0_111 export JRE_HOME$JAVA…...

【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】

【机械视觉】C#VisionPro联合编程———【三、加载CogToolBlock工具详解&#xff0c;以及实例】 在VisionPro中&#xff0c;CogToolBlock 是一种容器工具&#xff0c;可以将多个视觉工具&#xff08;如CogBlob、CogPMAlign等&#xff09;组合成一个可复用的流程。通过C#与Visi…...

Android14 串口控制是能wifi adb实现简介

Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb&#xff08;1&#xff09;相关prop属性设置&#xff08;2&#xff09;在设置界面或者 ifconfi…...

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题&#xff1a;启动wsl里的Ubuntu24报错 报错信息&#xff1a; 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件&#xff0c;并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息&#xff0c;请访…...

常用AI工具推荐

AI对话相关 Deepseek https://chat.deepseek.com/ Kimi https://kimi.moonshot.cn/ 豆包 https://www.doubao.com/ 文心一言 https://yiyan.baidu.com/ 腾讯元宝 https://yuanbao.tencent.com 通义千问 https://tongyi.aliyun.com/qianwen/ 图片生成相关 即梦 https://jimen…...

用AI学编程3——Java学习1

一个Java文件&#xff0c; 整理出Java从入门到精通的所有知识点&#xff0c; 给出注释&#xff0c; 给出这样的Java文件 Java 学习整合文件 /*** Java 学习整合文件* 包含 Java 从入门到精通的主要知识点&#xff0c;包括基础语法、面向对象编程、异常处理、集合框架、多线程…...

如何监控 Pod 的 CPU/内存使用率,prometheus+grafana

一、监控 Pod 的 CPU/内存使用率的方法 1. 使用 kubectl top 命令&#xff08;临时检查&#xff09; # 查看所有 Pod 的资源使用率&#xff08;需安装 Metrics Server&#xff09; kubectl top pods --all-namespaces ​ # 查看指定命名空间的 Pod kubectl top pods -n <n…...

云服务器Linux安装Docker

系统要求 Docker 官方建议将 Docker 运行在 Linux系统上&#xff0c;当然也可以在其他平台运行&#xff0c;本篇博客只介绍在 Linux 系统上的安装方法。 Docker 运行在 CentOS7.X 版本以上&#xff0c;本文使用阿里云 ECS 云服务器 CentOS 7.4 版本。 Docker 需要安装在 64 …...

信息安全与网络安全的区别_信息安全与网络安全之差异探析

在当今数字化时代&#xff0c;信息安全与网络安全成为了人们关注的热点话题。尽管这两个概念经常被提及&#xff0c;但它们之间存在着明显的区别。本文旨在探讨信息安全与网络安全的定义、范畴及应对策略&#xff0c;以帮助读者更好地理解和应对相关挑战。 一、定义与范畴的差…...

Express 中 get 参数获取

1. 使用 req.query 获取 URL 查询字符串参数 在 GET 请求中&#xff0c;参数通常以查询字符串的形式附加在 URL 后面&#xff0c;格式为 ?参数名1值1&参数名2值2 。Express 里可通过 req.query 对象获取这些参数。 const express require("express"); const …...

充电桩快速搭建springcloud(微服务)+前后端分离(vue),客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

充电桩管理系统是专为中小型充电桩运营商、企业和个人开发者设计的一套高效、灵活的管理平台。系统基于Spring Cloud微服务架构开发&#xff0c;采用模块化设计&#xff0c;支持单机部署与集群部署&#xff0c;能够根据业务需求动态扩展。系统前端使用uniapp框架&#xff0c;可…...

深度求索(DeepSeek)开源周技术全景与行业影响研究报告

2025年2月24日至28日&#xff0c;中国AI企业深度求索&#xff08;DeepSeek&#xff09;发起了为期五天的“开源周”活动&#xff0c;连续开源五大核心代码库&#xff08;FlashMLA、DeepEP、DeepGEMM、DualPipe、EPLB&#xff09;及分布式文件系统3FS&#xff0c;覆盖AI模型训练…...

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢&#xff0c;时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何&#xff1f; 我谈谈自己观点&#xff1a;芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后&#xff0c;芯…...

串口助手的C#编写以及有人串口服务器USR-DR301的使用

本文介绍C#编写串口程序的要点,串口服务器USR-DR301(RS232转TCP)的使用、以及调试过程中碰到的两个问题: 1). 调用串口报“连到系统上的设备没有发挥作用”. 2). “所有文本框都变成了透明”的异常处理 代码见:https://download.csdn.net/download/qq_34047402/9046713…...

Android中AIDL和HIDL的区别

在Android中&#xff0c;AIDL&#xff08;Android Interface Definition Language&#xff09; 和 HIDL&#xff08;HAL Interface Definition Language&#xff09; 是两种用于定义跨进程通信接口的语言。AIDL 是 Android 系统最早支持的 IPC&#xff08;进程间通信&#xff0…...

【HeadFirst系列之HeadFirst设计模式】第18天之蝇量模式(Flyweight Pattern):优化资源的秘密武器

蝇量模式&#xff08;Flyweight Pattern&#xff09;&#xff1a;优化资源的秘密武器 在软件开发中&#xff0c;当系统需要创建大量相似对象时&#xff0c;内存占用和性能问题就会浮出水面。《Head First 设计模式》介绍了 蝇量模式&#xff08;Flyweight Pattern&#xff09;…...

微信小程序将markdown内容转为pdf并下载

要在微信小程序中将Markdown内容转换为PDF并下载,您可以使用以下方法: 方法一:使用第三方API服务 选择第三方API服务: 可以选择像 Pandoc、Markdown-PDF 或 PDFShift 这样的服务,将Markdown转换为PDF。例如,PDFShift 提供了一个API接口,可以将Markdown内容转换为PDF格式…...

SQL CHAR_LENGTH返回字符串长度的函数

CHAR_LENGTH 是 SQL 中的一个用于返回字符串长度的函数。它计算的是字符串中的字符数&#xff0c;而不是字节数。这在处理多字节字符集&#xff08;如 UTF-8&#xff09;时尤其有用&#xff0c;因为一个字符可能会占用多个字节。 CHAR_LENGTH(string) string 是要计算长度的字…...

sqlserver删除表记录语句,及删除表时清零ID的SQL语句

sqlserver中&#xff0c;删除表中所有记录的语句如下 Delete from tableName 例&#xff0c;删除表logs的所有记录 sqlserver&#xff0c;删除表中所有数据&#xff0c;标识列ID归零&#xff0c;保留表结构的语句 truncate table tableName 例&#xff0c;删除表logs的所…...

求最大公约数问题(信息学奥赛一本通-1207)

【题目描述】 给定两个正整数&#xff0c;求它们的最大公约数。 【输入】 输入一行&#xff0c;包含两个正整数(<1,000,000,000)。 【输出】 输出一个正整数&#xff0c;即这两个正整数的最大公约数。 【输入样例】 6 9 【输出样例】 3 【题解代码】 #include<bits/stdc…...

Vue3中动态Ref的魔法:绑定与妙用

前言 在Vue 3的开发过程中,动态绑定Ref是一项非常实用的技术,特别是在处理复杂组件结构和动态数据时。通过动态绑定Ref,我们可以更灵活地访问和操作DOM元素或组件实例,实现更高效的交互和状态管理。本文将详细介绍如何在Vue 3中实现动态Ref的绑定,并通过实例展示其妙用。…...