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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于JAVA语言的中学生家校互联系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 课堂表现模块2.3 考试成绩模块2.4 家校留言模块2.5 校园通知模块 三、系统设计3.1 用例设计3.2 实体类设计3.2.1 课堂表现实体类设计3.2.2 考试成绩实体类设计3.2.3 家校留言实体类设计3.2.4 校园通知实…

AWS 专题学习 P8 (ECS、EKS、Lambda、CloudFront、DynamoDB)

文章目录 什么是 Docker&#xff1f;操作系统上的 DockerDocker 镜像存储Docker vs. Virtual MachinesDocker 入门AWS 中的 Docker Containers Management Amazon ECSEC2 Launch TypeFargate Launch TypeECS 的 IAM RolesLoad Balancer IntegrationsData Volumes (EFS)ECS Serv…

HCIA——20应用层:C/S、P2P、peer

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

产品经理学习-产品运营《用户运营策略》

⽤户画像与⽤户运营策略 什么是用户画像 对产品运营而言&#xff0c;用户画像就是对用户的各种特征贴上标签通过这些标签将用户分成不同的用户群体 为用户提供有针对性的服务。 制作用户画像是为了专注和精准 使产品的服务对象更加聚焦&#xff0c;更加专注&#xff1b;根据产…

红包封面免费送1000个,你设计,我出额度

相信最近大家或多或少都知道了吧&#xff0c;腾讯又又又给大家&#xff0c;准确的说是给一年勤奋的公众号/视频号博主一个福利 根据不同博主的粉丝、更新频度以及作品质量&#xff0c;给力博主们免费制作红包封面的福利 比如我这个号&#xff0c;有6000额度 那这6000个&#…

Python武器库开发-武器库篇之Fofa-API使用(四十六)

Python武器库开发-武器库篇之Fofa-API使用(四十六) FOFA&#xff08;FOcus Observation of Futures Assets&#xff09;是一款专业的网络资产搜索引擎&#xff0c;旨在帮助企业发现和评估网络上的潜在安全风险。FOFA的基本原理是通过搜索引擎的方式&#xff0c;按照关键词对互…

Civil 3D安装教程,免费使用,带安装包和工具,一分钟轻松搞的安装

前言 Civil 3D是一款面向基础设施行业的建筑信息模型&#xff08;BIM&#xff09;解决方案。它为基础设施行业的各类技术人员提供了强大的设计、分析以及文档编制功能&#xff0c;广泛适用于勘察测绘、岩土工程、交通运输、水利水电、市政给排水、城市规划和总图设计等众多领域…

【Spring 篇】MyBatis核心配置文件解密:数据之门的守护精灵

欢迎来到MyBatis的幕后花絮&#xff0c;今天我们将深入解析MyBatis的核心配置文件&#xff0c;这个神秘的数据之门的守护精灵。这份配置文件是连接你的应用程序和数据库之间的纽带&#xff0c;也是整个MyBatis舞台背后的幕后工作者。在这篇博客中&#xff0c;我们将揭开核心配置…

ES框架详解

ES框架详解 1、全文检索的介绍 ​ 那么对于一般的公司&#xff0c;初期是没有那么多数据的&#xff0c;所以很多公司更倾向于使用传统的数据库&#xff1a;mysql&#xff1b;比如我们要查找关键字”传智播客“&#xff0c;那么查询的方式大概就是:select * from table where …

vue3项目eslint配置、配置prettier(格式化配置)

文章链接: 全部配置链接 第一步:eslint配置、配置prettier(代码格式化):点击链接 (1) .eslint.cjs—eslint配置文件 (2).eslintignore—校验忽略文件 (3).prettierrc.json添加规则 (4).prettierignore忽略文件 prettierrc规范说明: npm install -D eslint-plugin-import…

修复uni-simple-router@2.0.7版本query参数null的bug

问题&#xff1a;query参数为null或者为空时&#xff0c;插件内部参数校验问题导致的会报错&#xff1a;TypeError: Cannot convert undefined or null to object at Function.keys 源码修改如下&#xff1a; 通过打补丁的方式修复query参数类型校验问题 1. 安装patch-packag…

SPI 动态服务发现机制

SPI&#xff08;Service Provier Interface&#xff09;是一种服务发现机制&#xff0c;通过ClassPath下的META—INF/services文件查找文件&#xff0c;自动加载文件中定义的类&#xff0c;再调用forName加载&#xff1b; spi可以很灵活的让接口和实现分离&#xff0c; 让API提…

Packet Tracer - 配置第 3 层交换和VLAN间路由

地址分配表 设备 接口 IP 地址/前缀 MLS VLAN 10 192.168.10.254 /24 MLS VLAN 10 2001:db8:acad:10::1/64 MLS VLAN 20 192.168.20.254 /24 MLS VLAN 20 2001:db8:acad:20::1/64 MLS VLAN 30 192.168.30.254/24 MLS VLAN 30 2001:db8:acad:30::1/64 MLS …

免费三款备受推崇的爬虫软件

在信息爆炸的时代&#xff0c;爬虫软件成为了数据采集、信息挖掘的得力工具。为了解决用户对优秀爬虫软件的需求&#xff0c;本文将专心分享三款备受推崇的爬虫软件&#xff0c;其中特别突出推荐147采集软件&#xff0c;为您开启爬虫软件的奇妙世界。 一、爬虫软件的重要性 爬…

Hive数仓框架详解

Hive框架详解 1、Hive的介绍 ​ Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 ​ 本质是将SQL转换为MapReduce程序。 ​ 主要用途&#xff1a;用来做离线数据分析&#xff0c;比直接用MapRed…

Python圣诞主题绘图:用turtle库打造冬日奇妙画面【第31篇—python:圣诞节】

文章目录 Python圣诞主题绘图导言代码结构概览详细解析drawlight函数tree函数xzs函数drawsnow函数五角星的绘制 完整代码代码解析总结 Python圣诞主题绘图 导言 圣诞季节是个充满欢乐和创意的时刻。在这个技术博客中&#xff0c;我们将深入探讨如何使用Python的turtle库创建一…

MySQL LIKE 子句

昨天介绍了 MySQL 数据库使用 DELETE 语句来删除数据&#xff0c;今天主要讲解下 MySQL LIKE 子句。 通过前几天的讲解&#xff0c;我们知道&#xff0c;在 MySQL 中使用 SELECT 命令来读取数据&#xff0c; 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。 W…

QWidget: Must construct a QApplication before a QWidget 20:10:25: 程序异常结束。

如果你在Windows上混合并匹配了Release和Debug的dll&#xff0c;则会导致这种情况。我的链接的库是release的版本&#xff0c;也就是qwt.dll&#xff0c;但是点击Qt Creator的运行按钮默认是debug启动&#xff0c;所以报错了&#xff0c;Qt Creator运行按钮里选择release就可以…

x-cmd pkg | jieba - 中文结巴分词工具

目录 简介首次用户功能特点竞品分析进一步阅读 简介 结巴中文分词&#xff08;jieba&#xff09;是一款在 Python 环境下使用的开源中文文本分词工具。它支持多种分词模式&#xff0c;包括精确模式、全模式和搜索引擎模式&#xff0c;同时支持繁体分词和自定义词典。因其易用性…

PXE批量高效网络装机

总结 1实验流程只能抄老师&#xff0c;记忆浅 2排错能力几乎无 3 指令用的太死&#xff0c; 一 系统装机的三种引导方式 启动 操作 系统 1.硬盘 2.光驱&#xff08;u盘&#xff09; 3.网络启动 pxe 重装系统&#xff1f; 在已有操作系统 新到货了一台服务器&#xff…