Spring成长之路—Spring MVC
在分享SpringMVC之前,我们先对MVC有个基本的了解。MVC(Model-View-Controller)指的是一种软件思想,它将软件分为三层:模型层、视图层、控制层
模型层即Model:负责处理具体的业务和封装实体类,我们所知的service层、pojo都属于模型层
视图层即view:它是前端的交互页面,也就是用户可以直观看到的东西,例如登录界面,商城界面
控制层即Controller:它负责接收请求的接收和分发,将请求分发给指定的业务逻辑
1、什么是Spring MVC
简单来说,SpringMVC是Spring对MVC设计思想的一种实现,实现的一个用于接收Web请求,响应请求的模块,其简易架构如图所示:

其中,核心组件及其作用如下:
DispatcherServlet:前端控制器,不需要开发,由MVC框架提供
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求,相当于是一个中转站的功能,将请求发给其他组件前必须要经由它
HandlerMapping:处理器映射器,不需要开发,由框架提供
作用:根据请求的url、method等信息查找Handler,即控制器方法
Handler:处理器,需要工程师开发,就是Controller
作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理
HandlerAdapter:处理器适配器,不需要开发,由框架提供
作用:通过HandlerAdapter对处理器(控制器方法)进行执行
HandlerInterceptor:拦截器, 需要工程师开发
作用:实现请求响应的共性处理
ViewResolver:视图解析器(前缀+viewname+后缀),不需要工程师开发,由框架提供
作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView
View:视图
作用:将模型数据通过页面展示给用户。
当前端发送一个请求后(请求即一个url路径),会先到达MVC过滤器,通过过滤器筛选后,通过的请求接下来会来到DispatcherServlet开始请求的分发,在分发之前它会先和HandlerMapping进行交互,HandlerMapping会判断请求路径中url是否有对应的的Controller可以进行处理,如果有,则将该信息返回给DispatcherServlet后由它来调用对应的Controller处理请求,在调用Controller之前,请求还会经过一个HandlerInterceptor拦截器(拦截器功能和过滤器相似),在拦截器中就可以进行一些控制用户的访问操作;Controller接收请求后调用该请求所对应的Service业务以及数据库,数据库返回数据后再将该返回的数据逐层返回至前端,返回的数据即为服务器的responce(响应)。
2、SpringMVC运行流程详解图:(面试可能会用到)

3、SpringBoot 整合MVC依赖
添加spring-web依赖,该框架提供了Spring MVC依赖支持,由于Spring boot Web的核心是SpringMVC,所以Spring基础框架的所有功能都适用与Spring boot Web,例如组件扫描、自动装配等
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
4、SpringMVC——RESTful
RestFul是一种以网络为基础构架一种架构风格,是一组架构约束条件和原则,不是标准,不是规范。” 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构
REST原则:
①URI代表着一个资源,是一个实体,应该是名词,而不要把具体的动作放在URL中,对资源的操作应该通过HTTP的动词来实现
传统方式操作资源,我们都是例如(修改和删除类似):
http://localhost:8080/admin/getUser 表示查询操作
http://localhost:8080/admin/addUser 表示新增操作
使用REST风格之后,使用如下命令(修改和删除类似):
GET http://localhost:8080/admin/user 表示查询操作
POST http://localhost:8080/admin/user 表示新增操作
②使用适合的状态码,而不应该全部都返回状态码 200
常用状态码:
`200 – OK – 一切正常
`201 – OK – 新的资源已经成功创建
`204 – OK – 资源已经成功删除
`304 – Not Modified – 客户端使用缓存数据
`400 – Bad Request – 请求无效,需要附加细节解释如 "JSON无效"
`401 – Unauthorized – 请求需要用户验证
`403 – Forbidden – 服务器已经理解了请求,但是拒绝服务或这种请求的访问是不允许的。
`404 – Not found – 没有发现该资源
`422 – Unprocessable Entity – 只有服务器不能处理实体时使用,比如图像不能被格式化,或者重要字段丢失。
`500 – Internal Server Error – API开发者应该避免这种错误。
5、响应结果对象设计
设计响应结果对象的主要目的是为了在 API 接口中提供一种统一的数据格式,便于客户端程序进行处理和解析。通过定义响应结果对象,可以将 API 接口返回的数据封装成一个标准的数据结构,这样客户端程序就能够定位出需要的数据,而不必关心底层的具体实现。
响应结果对象通常包含以下属性:
- 状态码 (status code):表示请求处理的状态,如 200 表示成功,400 表示请求参数错误等。
- 错误信息 (error message):当发生错误时,返回的错误提示信息,以便客户端程序进行修复或者调试。
- 数据结果 (data):API 接口返回的请求结果数据,可能是一个单独的对象或者一个数组等
响应结果代码的设计:
@Data
public class JsonResult {/**状态码*/private Integer state = 1; //1表示OK,0表示Error/**状态信息*/private String message = "ok";/**封装正确的查询结果*/private Object data;public JsonResult(){}//在修改成功或删除成功时会使用的构造方法,例如将message改为“修改成功/删除成功等”public JsonResult(String msg){this.message = msg;}//当出现异常时使用的构造方法public JsonResult(Integer state,String message){this(message);this.state = state;}//当查询成功时使用的构造方法public JsonResult(Object data){ //new JsonResult(list)this.data = data;}//当出现异常时,可以通过此构造方法对异常信息进行封装public JsonResult(Throwable exception){ //new JsonResult(exception);this(0,exception.getMessage()); //该方法还会调用第三个构造方法}}
6、统一异常处理设计
异常处理类是一种用于在程序执行期间捕获并处理异常情况的机制,如果没有异常处理类,一旦程序执行发生问题,Controller会将该问题抛给前端控制器,前端控制器会将错误直接抛给用户,而用户并不希望看到这些错误也没办法理解错误的含义,我们希望程序能够拦截错误并且告诉开发者,让我们去接解决。
另外,异常处理类可以将异常处理逻辑与业务逻辑分离开来,使程序的代码更加清晰、易于理解和维护,并且使得我们只需要编写一次异常处理逻辑,而不是在每个代码块中都写一遍,简化代码。
异常处理逻辑:

统一异常处理代码设计:
/*@RestControllerAdvice 注解描述的类为全局异常处理类,启动时会交给Spring管理*/
@RestControllerAdvice //是@ControllerAdvice和@ResponseBody的组合
public class GlobalExceptionHandler {
//表示为当前异常处理类生成一个日志对象private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*@ExceptionHandler注解描述的方法为异常处理方法,注解中定义的异常类型为方法可以处理的异常类型*/@ExceptionHandler(RuntimeException.class)public JsonResult doHandleRuntimeException(RuntimeException e){e.printStackTrace();log.error("exception msg is {}",e.getMessage());//该方法会调用JsonResult中的异常处理构造方法return new JsonResult(e);}//可以定义多个异常处理方法
}
—————————————————————
路漫漫其修远兮,吾将上下而求索~
到此关于SpringMVC框架的讲解就暂时结束啦后续随着博主的功力增加会不断更新(#^.^#),
写作不易,如果你认为博主写的不错!
请点赞、关注、评论给博主一个鼓励吧,您的鼓励就是博主前进的动力。
相关文章:
Spring成长之路—Spring MVC
在分享SpringMVC之前,我们先对MVC有个基本的了解。MVC(Model-View-Controller)指的是一种软件思想,它将软件分为三层:模型层、视图层、控制层 模型层即Model:负责处理具体的业务和封装实体类,我们所知的service层、poj…...
架构篇05-复杂度来源:高可用
文章目录 计算高可用存储高可用高可用状态决策小结 今天,我们聊聊复杂度的第二个来源高可用。 参考维基百科,先来看看高可用的定义。 系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。 这个定义…...
C#调用Newtonsoft.Json将bool序列化为int
使用Newtonsoft.Json将数据对象序列化为Json字符串时,如果有布尔类型的属性值时,一般会将bool类型序列化为字符串,true值序列化为true,false值序列化为false。如下面的类型序列化后的结果如下: public class UserInfo…...
【Linux系统编程】环境变量详解
文章目录 1. 环境变量的基本概念2. 如何理解呢?(测试PATH)2.1 切入点1查看具体的环境变量原因剖析常见环境变量 2.2 切入点2给PATH环境变量添加新路径将我们自己的命令拷贝到PATH已有路径里面 2.3 切入点3 3. 显示所有环境变量4. 测试HOME5. …...
智能合约介绍
莫道儒冠误此生,从来诗书不负人 目录 一、什么是区块链智能合约? 二、智能合约的发展背景 三、智能合约的优势 四、智能合约的劣势 五、一些关于智能合约的应用 总结 一、什么是区块链智能合约? 智能合约,是一段写在区块链上的代码,一…...
Python自动化实战之接口请求的实现
在前文说过,如果想要更好的做接口测试,我们要利用自己的代码基础与代码优势,所以该章节不会再介绍商业化的、通用的接口测试工具,重点介绍如何通过 python 编码来实现我们的接口测试以及通过 Pycharm 的实际应用编写一个简单接口测…...
react和vue的区别
一、核心思想不同 Vue的核心思想是尽可能的降低前端开发的门槛,是一个灵活易用的渐进式双向绑定的MVVM框架。 React的核心思想是声明式渲染和组件化、单向数据流,React既不属于MVC也不属于MVVM架构。 如何理解React的单向数据流? React的单…...
Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?
目录 1、xml方式2、CompontScan Component3、使用 Bean方式4、使用Import 注解5、FactoryBean 工厂 bean6、使用 ImportBeanDefinitionRegistrar 向容器中注入Bean7、实现 ImportSelector 接口 1、xml方式 使用 xml 的方式来声明 Bean 的定义,Spring 容器在启动的…...
客户需求,就是项目管理中最难管的事情
对于需求控制和管理 个人的观点是:首先要向客户传递开发流程,第二必须制作原型,需求确认时确认的是原型,而不是需求文档,第三,开发阶段要快速迭代,与客户互动。管人方面我想对于项目经理来讲&am…...
条款28:避免返回 handles 指向对象的内部成分
创建一个矩形的类(Rectangle),为保持Rectangle对象较小,可以只在其对象中保存一个指针,用于指向辅助的结构体,定义其范围的点数据存放在辅助的结构体中: class Point { // 表示点的类 public:P…...
【人工智能】之深入理解 AI Agent:超越代码的智能助手(2)
人工智能(AI)正在以前所未有的速度迅猛发展,而AI Agent(智能代理)则是这一领域中备受瞩目的一环。AI Agent 不仅仅是程序的执行者,更是能够感知、学习和交互的智能实体。本文将深入探讨什么是 AI Agent&…...
如何将一个字符串转换为整数?
目录 1. 基本方法:int() 函数 2. 错误处理 3. 性能考虑 4. 实用技巧 结论 在Python中,将字符串转换为整数是一个常见且重要的操作。这种转换通常在处理用户输入、解析文本数据或在不同数据类型间进行转换时使用。以下是从几个方面对这个主题的详细介…...
【鸿蒙4.0】harmonyos Day 04
文章目录 一.Button按钮组件1.声明Button组件,label是按钮文字2.添加属性和事件 二.Slider滑动条组件 一.Button按钮组件 1.声明Button组件,label是按钮文字 Button(label?:ResourceStr) // ResourceStr:可以是普通字符串,也可以是引用定义…...
微调(fine-tuning)
目录 一、微调 1、为什么需要微调 2、微调的步骤 二、代码实现 1、获取数据集 2、读取图像 3、数据增广 4、定义和初始化模型 5、定义训练函数 三、总结 一、微调 1、为什么需要微调 Fashion-MNIST有6万张图像,学术界当下使用最广泛的大规模图像数据集Ima…...
Find My卡片正成为消费电子香饽饽,伦茨科技ST17H6x可以帮到您
今年CES许多公司发布支持苹果Find My的卡片产品,这种产品轻薄可充电,放在钱包、背包或者手提包可以防丢查找,在智能化加持下,防丢卡片使得人们日益关心自行车的去向。最新的防丢卡片与苹果Find My结合,智能防丢&#x…...
Es bulk批量导入数据(1w+以上)
最近在学习es的理论知识以及实际操作,随时更新~ 概要:首先你得有1w条数据的json,然后用java读取json文件导入 一. 创建Json数据 首先我生成1.5w条数据,是为了实践分页查询,用from-size和scroll翻页去实践 生成四个字段…...
#laravel 通过手动安装依赖PHPExcel#
场景:在使用laravel框架的时候,需要读取excel,使用 composer install XXXX 安装excel失败,根据报错提示,php不兼容。 因为PHPHExcel使用的php版本 和项目运所需要的php 版本不兼容,php8的版本 解决方法:下载手工安装&a…...
Webpack 基本使用 - 1
Webpack 是什么 webpack 的核心目的是打包,即把源代码一个一个的 js 文件,打包汇总为一个总文件 bundle.js。 基本配置包括mode指定打包模式,entry指定打包入口,output指定打包输出目录。 另外,由于 webpack默认只能打…...
要编译Android 12系统的开机Logo,你需要执行以下步骤:
目录 一、下载了AOSP 1.下载了AOSP 2. 创建一个新的设备制造商目录。 3. 在新创建的device/manufacturer目录中创建一个新的设备目录。 4. 在新创建的设备目录中,创建一个BoardConfig.mk文件。 5. 编辑BoardConfig.mk文件,添加以下内容:…...
【JS逆向学习】36kr登陆逆向案例(webpack)
在开始讲解实际案例之前,大家先了解下webpack的相关知识 WebPack打包 webpack是一个基于模块化的打包(构建)工具, 它把一切都视作模块 webpack数组形式,通过下标取值 !function(e) {var t {};// 加载器 所有的模块都是从这个…...
Fay框架监控告警系统设计:异常实时通知
Fay框架监控告警系统设计:异常实时通知 【免费下载链接】Fay fay是一个帮助数字人(2.5d、3d、移动、pc、网页)或大语言模型(openai兼容、deepseek)连通业务系统的agent框架。 项目地址: https://gitcode.com/GitHub_…...
GLM-4.1V-9B-Base惊艳效果:3D渲染图材质/光影/构图中文分析
GLM-4.1V-9B-Base惊艳效果:3D渲染图材质/光影/构图中文分析 1. 视觉理解新标杆 GLM-4.1V-9B-Base作为智谱开源的视觉多模态理解模型,在3D渲染图分析领域展现出令人惊艳的能力。不同于常规的图片识别工具,这款模型能够深入理解3D渲染图中的材…...
线激光手眼标定里,欧拉角和四元数到底怎么选?一个案例讲清机器人姿态的‘坑’
线激光手眼标定中欧拉角与四元数的抉择:从理论误区到工程实践 在机器人视觉系统中,手眼标定是连接感知与执行的关键桥梁。当激光传感器安装在机械臂末端时,如何准确描述传感器坐标系与机器人坐标系之间的姿态关系,直接决定了后续视…...
4个关键步骤:开源散热控制解决Dell G15温度难题
4个关键步骤:开源散热控制解决Dell G15温度难题 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 在游戏本使用过程中,散热控制往往是影响…...
Fedora 42 上 Podman 镜像拉取慢?5分钟搞定国内镜像源配置(保姆级教程)
Fedora 42 上 Podman 镜像拉取慢?5分钟搞定国内镜像源配置(保姆级教程) 刚接触 Fedora 42 的开发者们,是否经常被 Podman 拉取镜像时的蜗牛速度折磨得抓狂?每次看着进度条像老牛拉破车一样缓慢移动,心里是不…...
扩散浓度曲线计算:从实例看 Pandat 代算与自行操作
扩散浓度曲线计算(Pandat代算或自己操作) 实例33: Al-4.06at%Mg/Al扩散偶在781K下退火36960s,Mg元素浓度随距离的变化曲线及实验数据对比如图a所示;Al-11at%Mg/Al扩散偶在773K下退火86400s,Mg元素浓度随距离的变化曲线及实验对比如图b所示&am…...
League Akari:英雄联盟终极智能助手完整使用指南
League Akari:英雄联盟终极智能助手完整使用指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否厌倦了在英雄联…...
PredRNN++:从单元到系统,逐层拆解与实战解析
1. PredRNN核心单元拆解 PredRNN作为视频预测领域的里程碑模型,其核心创新在于Causal LSTM和GHU两大单元的设计。我们先从代码层面看看它们如何运作。 1.1 Causal LSTM的三明治结构 打开CausalLSTMCell.py文件,你会发现这个单元像三明治一样分为三层&…...
Abaqus纤维复合材料三点弯曲力学仿真全解析
Abaqus纤维复合材料三点弯曲力学仿真(vumat子程序inp文件obd文件视频文件快速建模软件)在材料力学的研究领域,纤维复合材料凭借其优异的性能被广泛应用。而通过Abaqus进行三点弯曲力学仿真,能有效探究其力学特性。今天咱就来唠唠这…...
群晖ARPL界面IP显示正常但Synology Assistant搜不到?试试这5个排查步骤
群晖ARPL界面IP显示正常但Synology Assistant搜不到的深度排查指南 当你兴奋地完成黑群晖的ARPL引导安装,在启动界面看到系统已经成功获取IP地址,却突然发现Synology Assistant工具死活搜不到这个IP时,那种从云端跌入谷底的感觉我太熟悉了。这…...
