SpringMVC:执行原理详解、配置文件和注解开发实现 SpringMVC
文章目录
- SpringMVC - 01
- 一、概述
- 二、SpringMVC 执行原理
- 三、使用配置文件实现 SpringMVC
- 四、使用注解开发实现 SpringMVC
- 1. 步骤
- 2. 实现
- 五、总结
- 注意:
SpringMVC - 01
一、概述
SpringMVC 官方文档:点此进入
有关 MVC 架构模式的内容见之前的笔记:点此进入
- SpringMVC 是 Spring Framework 的一部分,是基于 Java 实现 MVC 的轻量级 Web 框架,底层还是 Servlet;
- Spring 的 Web 框架是围绕 DispatcherServlet 【调度 Servlet】设计的:
- DispatcherServlet 的本质:是一个 Servlet;
- DispatcherServlet 的作用:将请求分发到不同的处理器。
- SpringMVC 的控制中心:DispatcherServlet;
- SpringMVC 的核心三要素:处理器映射器、处理器适配器、视图解析器;
- SpringMVC 与 Spring 兼容性好,无缝结合,并且功能强大:支持 RESTful 风格、异常处理、数据验证、格式化、本地化等;
- SpringMVC 以请求为驱动,围绕一个中心 Servlet 分派请求及提供其他功能。
二、SpringMVC 执行原理
下图为 SpringMVC 的执行流程图,实线是 SpringMVC 框架提供的技术,不需要开发者实现,虚线需要实现。

组件:
- DispatcherServlet :前端控制器,是整个 SpringMVC 的控制中心,作用:接收请求,响应结果,相当于电脑的 CPU;
- HandlerMapping :处理器映射器,作用:根据 URL 查找处理器;
- Handler :处理器,也称 Controller,和 Servlet 扮演的角色一致,作用:执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中;
- HandlerExecutionChain:执行链,包含了处理器 Handler;
- HandlerAdapter :处理器适配器,作用:按照特定规则去执行 Handler;
- ViewReslover :视图解析器,作用:进行视图解析;
- ModelAndView :SpringMVC 的底层对象,包括 Model 数据模型和 View 视图信息。
步骤:
1 :用户发起请求到前端控制器 DispatcherServlet;
2 :前端控制器请求处理器映射器 HandlerMappering 去通过 xml 配置或者注解来查找处理器 Handle;
3-4 :找到处理器 Handle 以后 HandlerMappering 向前端控制器返回一个执行链 HandlerExecutionChain(包含了 Handle);
5 :前端控制器 DispatcherServlet 调用处理器适配器 HandlerAdapter 去执行处理器 Handler;
6 :处理器适配器去执行 Handler;
7 :Handler 执行完给处理器适配器 HandlerAdapter 返回 ModelAndView;
8 :处理器适配器 HandlerAdapter 向前端控制器返回 ModelAndView;
9 :前端控制器 DispatcherServlet 请求视图解析器 ViewResolver 去进行视图解析;
10 :视图解析器 ViewResolver 向前端控制器返回 View;
11 :前端控制器根据 View 对视图进行渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
12 :前端控制器向用户响应结果。
备注:
SpringMVC 执行原理概述:拦截请求、解析 URL 找到处理器 Handle、执行 controller、解析数据和视图并展示。
SpringMVC 执行原理参考文档:
- 参考文档 1:点此进入
- 参考文档 2:点此进入
三、使用配置文件实现 SpringMVC
使用配置文件实现 SpringMVC 主要是为了理解 SpringMVC 的执行原理,步骤如下:
- 创建一个普通的 Maven 项目,导入依赖
<!-- Servlet 依赖 -->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version>
</dependency><!-- JSP 依赖 -->
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version>
</dependency><!-- JSTL 表达式依赖 -->
<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version>
</dependency><!-- standard 标签库 -->
<dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version>
</dependency><!-- spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.18</version>
</dependency><!-- junit -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>
- 新建一个普通的 Maven 模块,在模块上右键选择
Add Framework Support...后勾选Web Application(4.0)将模块转变为一个 Web 模块。注意:因为没有使用模板创建 Web 项目,所以此时生成的 web 文件夹不在 main 文件下,这样生成的 out 文件夹中没有依赖,所以要打开项目结构,建立 lib 文件夹,导入依赖。

- 在
web.xml中配置 DispatcherServlet 前端控制器(整个 SpringMVC 的控制中心)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 配置 DispatcherServlet 前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- DispatcherServlet 绑定 Spring 的配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><!-- 启动级别:1,和服务器一起启动 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

- 编写
spring-mvc.xml配置文件:包括配置处理器映射器、处理器适配器、视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 处理器映射器 --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- 处理器适配器 --><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/><!-- 视图解析器 --><bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前缀 --><property name="prefix" value="/WEB-INF/jsp/"/><!-- 后缀 --><property name="suffix" value=".jsp"/></bean><!-- BeanNameUrlHandlerMapping:根据 bean 的名字找到处理器映射器 --><bean id="/hello" class="com.Sun3285.controller.ControllerDemo01"/></beans>

- 编写一个 Controller(处理器 Handler)实现 Controller 接口,重写方法(实现业务代码、视图跳转)

- 编写要跳转的页面

- 配置 Tomcat,测试

提示:可以将以上代码与第二部分 SpringMVC 的执行原理相对应起来看,可以加深理解。
四、使用注解开发实现 SpringMVC
在实际中,经常使用注解开发实现 SpringMVC,使用到的注解有:
| 注解 | 说明 |
|---|---|
| @Controller | 将编写的控制类注册为 bean,由 Spring 容器进行管理 |
| @RequestMapping(“请求路径”) | 完成映射关系,根据请求路径找到对应的处理器(Controller 控制器) |
1. 步骤
注解开发步骤如下:
- 创建一个普通的 Maven 项目,导入依赖;
- 新建一个普通的 Maven 模块,转变为一个 Web 模块,打开项目结构,建立 lib 文件夹,添加依赖;
- 在
web.xml中配置 DispatcherServlet 前端控制器:- 配置 DispatcherServlet 前端控制器;
- 绑定 Spring 的配置文件;
- 设置启动级别。
- 编写
spring-mvc.xml配置文件:- 导入 context 和 mvc 的头文件约束;
- 设置自动扫描包;
- 设置让 SpringMVC 不处理静态资源;
- 支持注解驱动;
- 配置视图解析器。
- 编写控制类,使用注解;
- 编写要跳转的页面;
- 配置 Tomcat,测试。
2. 实现
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 配置 DispatcherServlet 前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- DispatcherServlet 绑定 Spring 的配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><!-- 启动级别:1,和服务器一起启动 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 自动扫描包,让指定包下的注解生效,由 IOC 容器统一管理 --><context:component-scan base-package="com.Sun3285.controller"/><!-- 让 SpringMVC 不处理静态资源 --><mvc:default-servlet-handler/><!-- 支持注解驱动 --><mvc:annotation-driven/><!-- 视图解析器 --><bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前缀 --><property name="prefix" value="/WEB-INF/jsp/"/><!-- 后缀 --><property name="suffix" value=".jsp"/></bean></beans>
- 控制类

-
在要跳转的页面中取出
message对应的值 -
配置 Tomcat,测试

五、总结
- ModelAndView 类型的对象可以执行的方法:
| 方法 | 说明 |
|---|---|
| addObject(String attributeName, Object attributeValue) | 以键值对的形式赋值 |
| setViewName(String viewName) | 参数 viewName 通过视图解析器后组成 url 用于视图跳转 |
注意:这些方法由 ModelAndView 类型的对象执行。
- Model 类型的对象可以执行的方法:
| 方法 | 说明 |
|---|---|
| addAttribute(String attributeName, Object attributeValue) | 以键值对的形式赋值 |
注意:这个方法由 Model 类型的对象执行,相当于 ModelAndView 类的 addObject 方法。
-
将所有视图放在 WEB-INF 目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问;
-
在
web.xml中配置 DispatcherServlet 前端控制器时,url-pattern中要使用/:-
/:只匹配所有的请求,不会去匹配 jsp 页面; -
/*:匹配所有的请求,包括 jsp 页面。
-
-
在
spring-mvc.xml配置文件中,通常我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,省去了 xml 配置; -
在控制类中:
- 类由 @Controller 注解声明,可以将编写的控制类注册为 bean,由 Spring 容器进行管理,在容器初始化时被自动扫描到;
- 方法由 @RequestMapping 注解声明,可以完成映射关系,根据请求路径找到对应的处理器(Controller 控制器);
- 方法的参数为 Model 类型,可以通过调用方法来封装数据;
- 方法的返回值为 String 类型,返回值会被视图解析器解析,从而组成一个跳转页面的 url;
- 可以在控制类中写多个方法。
-
使用配置文件实现 SpringMVC 主要是为了理解 SpringMVC 的执行原理,而使用注解开发实现 SpringMVC 才是实际中经常用到的。
注意:
- SpringMVC 官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html。
相关文章:
SpringMVC:执行原理详解、配置文件和注解开发实现 SpringMVC
文章目录 SpringMVC - 01一、概述二、SpringMVC 执行原理三、使用配置文件实现 SpringMVC四、使用注解开发实现 SpringMVC1. 步骤2. 实现 五、总结注意: SpringMVC - 01 一、概述 SpringMVC 官方文档:点此进入 有关 MVC 架构模式的内容见之前的笔记&a…...
增量式旋转编码器在STM32平台上的应用
背景 旋钮是仪器仪表上一种常见的输入设备,它的内部是一个旋转编码器,知乎上的这篇科普文章对其工作原理做了深入浅出的介绍。 我们公司的功率分析仪的前面板也用到了该类设备,最近前面板的MCU从MSP430切换成了STM32,因此我要将…...
INFINI Gateway 如何防止大跨度查询
背景 业务每天生成一个日期后缀的索引,写入当日数据。 业务查询有时会查询好多天的数据,导致负载告警。 现在想对查询进行限制–只允许查询一天的数据(不限定是哪天),如果想查询多天的数据就走申请。 技术分析 在每…...
【模式识别】探秘分类奥秘:最近邻算法解密与实战
🌈个人主页:Sarapines Programmer🔥 系列专栏:《模式之谜 | 数据奇迹解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌌1 初识模式识…...
【Redis】分布式锁
目录 分布式锁分布式锁实现的关键 Redisson实现分布式锁看门狗机制 分布式锁 为什么要使用分布式锁,或者分布式锁的使用场景? 定时任务。在分布式场景下,只控制一台服务器执行定时任务,这就需要分布式锁 要控制定时任务在同一时间…...
Linux访问firefox 显示Error: no DISPLAY environment variable specified
在 CentOS 7 中访问 Firefox 浏览器时,出现 "Error: no DISPLAY environment variable specified" 的错误提示通常是由于缺少显示环境变量导致的。 要解决这个问题,你可以按照以下步骤进行配置: 1. 确保已经安装 X Window Syst…...
线性回归简介
线性回归简介 1、情景描述2、线性回归 1、情景描述 假设,我们现在有这么一张图: 其中,横坐标x表示房子的面积,纵坐标y表示房价。我们猜想x与y之间存在线性关系: y k x b ykxb ykxb 现在,思考一个问题&…...
Log4net 教程
一、Log4net 教程 在CodeProject上找到一篇关于Log4net的教程:log4net Tutorial,这篇博客的作者是:Tim Corey ,对应源代码地址为: https://github.com/TimCorey/Log4netTutorial,视频地址为:Ap…...
test-01-java 单元测试框架 junit 入门介绍
JUnit JUnit 是一个用于编写可重复测试的简单框架。 它是 xUnit 架构的一种实例,专门用于单元测试框架。 What to test? NeedDescRight结果是否正确B边界条件是否满足I能反向关联吗C有其他手段交叉检查吗E是否可以强制异常发生P性能问题 maven 入门例子 maven …...
Linux系统中跟TCP相关的系统配置项
TCP连接保活 参考 《Nginx(三) 配置文件详解 - 基础模块》3.18章节 net.ipv4.tcp_keepalive_intvl:设置TCP两次相邻探活检测的间隔时间。默认75秒,单位是秒,对应配置文件/proc/sys/net/ipv4/tcp_keepalive_intvl;net.ipv4.tcp_kee…...
python图片批量下载多线程+超时重试
背景 上篇python入门实战:爬取图片到本地介绍过如何将图片下载到本地,但是实际处理过程中会遇到性能问题:分页数过多下载时间过程、部分页面连接超时无法访问下载失败。本文从实战的角度解释一下如何处理这两个问题。 下载时间过长问题,处理方式是使用多线程,首先回顾…...
冒泡排序之C++实现
描述 冒泡排序算法是一种简单的排序算法,它通过将相邻的元素进行比较并交换位置来实现排序。冒泡排序的基本思想是,每一轮将未排序部分的最大元素逐个向右移动到已排序部分的最右边,直到所有元素都按照从小到大的顺序排列。 冒泡排序的算法…...
【Spring实战】04 Lombok集成及常用注解
文章目录 0. 集成1. Data2. Getter 和 Setter3. NoArgsConstructor,AllArgsConstructor和RequiredArgsConstructor4. ToString5. EqualsAndHashCode6. NonNull7. Builder总结 Lombok 是一款 Java 开发的工具,它通过注解的方式简化了 Java 代码的编写&…...
ubuntu-22.04.3 配置
1.防火墙 a、查看防火墙状态:inactive是关闭,active是开启。 sudo ufw statusb、开启防火墙。 sudo ufw enablec、关闭防火墙。 sudo ufw disable2.设置Ip ifconfigsudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.y…...
[工具]java_sublime的快速使用
目录 使用 : 怎么运行: 调整字体: 使用 : 新建--->写好代码后-->另存为尾缀是.java的文件 怎么运行: 在你另存为的目录下cmd调用控制台输入dos指令--->执行javac 文件名.java(有.java尾缀)(编译为.class文件)--->java 文件名(没有.class尾缀设计者认为执行的是…...
【银行测试】银行金融测试+金融项目测试点汇总...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、银行金融测试是…...
将PPT的图保持高分辨率导入到Word / WPS中
1、将PPT中画好的图组合在一起,选择组合后的图复制(Ctrlc) 2、在Word中,选中左上角的粘贴选项--->选择性粘贴 WPS选择元文件 / Word选择增强型图元文件 这样放大也不模糊了...
如何在Spring Boot中优雅地进行参数校验
1. 前言 在平时的开发工作中,我们通常需要对接口进行参数格式验证。当参数个数较少(个数小于3)时,可以使用if ... else ...手动进行参数验证。当参数个数大于3个时,使用if ... else ...进行参数验证就会让代码显得臃肿…...
图还能有数据库?一文带你了解图数据库是个什么东西!
图数据库 基础 简介 %% 图数据库是图数据库管理系统的简称,是近年来新兴的一种NoSQL数据库使用图形化的模型进行查询的数据库,通过节点、边和属性等方式来表示和存储数据,支持增删改查::CRUD::等操作。图数据库一般用于OLTP系统中…...
力扣思维题——寻找重复数
题目链接:https://leetcode.cn/problems/find-the-duplicate-number/description/?envTypestudy-plan-v2&envIdtop-100-liked 这题的思维难度较大。一种是利用双指针法进行计算环的起点,这种方法在面试里很难说清楚,也很难想到。大致做…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
