Spring成长之路—Spring MVC

        在分享SpringMVC之前,我们先对MVC有个基本的了解。MVC(Model-View-Controller)指的是一种软件思想,它将软件分为三层:模型层、视图层、控制层

        模型层即Model:负责处理具体的业务和封装实体类,我们所知的service层、pojo都属于模型层

        视图层即view:它是前端的交互页面,也就是用户可以直观看到的东西,例如登录界面,商城界面

        控制层即Controller:它负责接收请求的接收和分发,将请求分发给指定的业务逻辑

1、什么是Spring MVC

        简单来说,SpringMVC是Spring对MVC设计思想的一种实现,实现的一个用于接收Web请求,响应请求的模块,其简易架构如图所示:

        其中,核心组件及其作用如下:

  1. DispatcherServlet:前端控制器,不需要开发,由MVC框架提供

    作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求,相当于是一个中转站的功能,将请求发给其他组件前必须要经由它

  2. HandlerMapping:处理器映射器,不需要开发,由框架提供

    作用:根据请求的url、method等信息查找Handler,即控制器方法

  3. Handler:处理器,需要工程师开发,就是Controller

    作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理

  4. HandlerAdapter:处理器适配器,不需要开发,由框架提供

    作用:通过HandlerAdapter对处理器(控制器方法)进行执行

  5. HandlerInterceptor:拦截器, 需要工程师开发

    作用:实现请求响应的共性处理

  6. ViewResolver:视图解析器(前缀+viewname+后缀),不需要工程师开发,由框架提供

    作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView

  7. 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框架的讲解就暂时结束啦后续随着博主的功力增加会不断更新(#^.^#),

写作不易,如果你认为博主写的不错!

请点赞、关注、评论给博主一个鼓励吧,您的鼓励就是博主前进的动力。

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

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

相关文章

5G_射频测试_参考规范(一)

参考规范&#xff1a; • Base Station (BS) conformance testing&#xff08;重点limitation&#xff09;Directory Listing /ftp/Specs/archive/38_series/38.104 (3gpp.org) • Conducted conformance testing&#xff08;传导测试&#xff09;3GPP 38.141-1 6.7 Tran…

跟着pink老师前端入门教程-day08

二十一、案例前期铺垫 21.1 CSS属性书写顺序&#xff08;重点&#xff09; 建议遵循以下顺序&#xff1a; 1. 布局定位属性&#xff1a;display / position / float / clear / visibility / overflow&#xff08;建议 display 第一个写&#xff0c;毕竟关系到模式&#xff…

UI -- React

React 模板 React UI package.json同级components/slButton/element.jsx import React from react;const el ({ text, onClick }) > {return (<button onClick{onClick}>{text}</button>); };export default el;components/function.js export const ceshi…

LLM之RAG实战(十九)| 利用LangChain、OpenAI、ChromaDB和Streamlit构建RAG

生成式人工智能以其创造与上下文相关内容的能力彻底改变了技术&#xff0c;开创了人工智能可能性的新时代。其核心是检索增强生成&#xff08;RAG&#xff09;&#xff0c;将信息检索与LLM相结合&#xff0c;从外部文档中产生智能、知情的响应。 本文将深入研究使用ChromaDB构建…

阿里云GPU服务器ECS实例规格详细说明

阿里云GPU服务器提供GPU加速计算能力&#xff0c;GPU卡支持A100、V100、T4、P4、P100、A10等&#xff0c;NVIDIA V100&#xff0c;GPU实例规格是什么意思&#xff1f;如搭载NVIDIA V100的ecs.gn6v-c8g1.2xlarge、A10卡ecs.gn7i-c32g1.8xlarge、T4卡ecs.gn6i-c4g1.xlarge、P4卡e…

AndroidStudio

一 安卓开发环境搭建 1.1 环境介绍 # 做安卓开发&#xff0c;需要会 Java 开发&#xff0c;需要安卓 SDK &#xff0c;需要一款编辑器&#xff0c;需要软件测试环境 ( 真机&#xff0c;虚拟机 ) # 早期开发安卓 app &#xff0c;需要使用 eclipse 安卓 SDK &#xff0c;自…

三.Winform使用Webview2加载本地HTML页面

Winform使用Webview2加载本地HTML页面 往期目录创建Demo2界面创建HTML页面在Demo2窗体上添加WebView2和按钮加载HTML查看效果 往期目录 往期相关文章目录 专栏目录 创建Demo2界面 经过前面两小节 一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定…

三国游戏(第十四届蓝桥杯)

题目 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z&#xff08;一开始可以认为都为 0&#xff09;。 游戏有 n个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i个事件发生时会分别让 X,Y,Z 增加 A i , B…

广和通AI解决方案“智”赋室外机器人迈向新天地!

大模型趋势下&#xff0c;行业机器人将具备更完善的交互与自主能力&#xff0c;逐步迈向AI 2.0时代&#xff0c;成为人工智能技术全面爆发的重要基础。随着行业智能化&#xff0c;更多机器人应用将从“室内”走向“室外”&#xff0c;承担更多高风险、高智能工作。复杂的室外环…

Java基本概念(新手入门)

目录 软件安装&#xff1a;Java初学者软件安装与idea快捷键-CSDN博客 第一节 1.java与C语言的区别 2.jdk&#xff0c;jre&#xff0c;jvm是什么&#xff0c;他们之间的关系 3. java的包package 4.Java的注释 5.第一个程序讲解与基础语法 6.一带而过 java入门第一节__…

方便又好用,必须吹爆这几个良心工具!

生成式人工智能已经彻底改变了各个行业。尽管使用的都是相同的大模型&#xff0c;但有的能让明星表演出“科目三”&#xff0c;而有的则能将真人变成动漫主角。 那么&#xff0c;让我们回到开发人员的视角来看&#xff0c;GenAI对日常工作会有哪些影响呢&#xff1f;虽然我们向…

代码随想录二刷 | 二叉树 | 把二叉搜索树转换为累加树

代码随想录二刷 &#xff5c; 二叉树 &#xff5c; 把二叉搜索树转换为累加树 题目描述解题思路递归法迭代法 代码实现递归法迭代法 题目描述 538.把二叉搜索树转换为累加树 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&…

分布式 session

分布式 session 种 session 的时候需要注意范围&#xff0c;也就是 cookie.domain。 比如两个域名&#xff1a;a.heo.com&#xff0c;b.heo.com。如果要共享 cookie&#xff0c;可以种一个更高层的公共域名&#xff0c;比如 heo.com。 当服务器 A &#xff08;localhost:808…

基于ECS服务器搭建FTP服务

vsftpd&#xff08;very secure FTP daemon&#xff09;是一款在Linux发行版中最受推崇的FTP服务器。vsftpd支持匿名访问和本地用户模式两种访问方式。匿名访问方式任何用户都可以访问搭建的FTP服务&#xff1b;本地用户模式只支持添加的本地用户访问搭建的FTP服务。 说明: 匿…

前端实现贪吃蛇功能

大家都玩过贪吃蛇小游戏&#xff0c;控制一条蛇去吃食物&#xff0c;然后蛇在吃到食物后会变大。本篇博客将会实现贪吃蛇小游戏的功能。 1.实现效果 2.整体布局 /*** 游戏区域样式*/ const gameBoardStyle {gridTemplateColumns: repeat(${width}, 1fr),gridTemplateRows: re…

新买电脑配置不低却卡顿?

目录 前言&#xff1a; 电脑卡顿的原因 Windows 10必做的系统优化 禁用 IP Helper 关闭系统通知 机械硬盘开启优化驱动器功能 开启存储感知 前言&#xff1a; 新买的电脑配置不低&#xff0c;但却卡顿甚至程序不反应&#xff0c;这是怎么回事儿&#xff1f; 其实并不…

代码随想录day32 贪心算法训练

122.买卖股票的最佳时机 II 题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&a…

Java中泛型的详细介绍

引言&#xff1a; Java语言中的泛型是一种强大的特性&#xff0c;它允许我们在编写代码时指定类、接口和方法的参数类型。通过使用泛型&#xff0c;我们可以提高代码的重用性、可读性和安全性。在本博客中&#xff0c;我们将详细介绍Java中泛型的知识。 一、泛型的基本概念 泛型…

《Linux C编程实战》笔记:Linux信号介绍

信号是一种软件中断&#xff0c;它提供了处理一种异步事件的方法&#xff0c;也是进程惟一的异步通信方式。在Linux系统中&#xff0c;根据POSIX标准扩展的信号机制&#xff0c;不仅可以用来通知某进程发生了什么事&#xff0c;还可以给进程传递数据。 信号的来源 信号的来源…

信号处理专题设计-基于边缘检测的数字图像分类识别

目录 一、实验目的 二、实验要求 三、实验原理 1.卷积神经网络&#xff08;CNN&#xff09;模型 2.边缘检测 3.形态学操作 4.鲁棒性 四、实验过程 1.数据预处理 2. 网络的构建 3.模型的训练 4.边缘检测和形态学操作相关代码 5.模型训练结果 6.关键信息的保存 五、实验测试与评估…