SSM整合快速学习

news2024/11/13 9:59:32

目录

步骤:

一、环境搭建

1.创建JdbcConfig配置类

2.创建JdbcConfig配置类

3.创建MybatisConfig配置类

4.创建jdbc.properties

5.创建SpringMVC配置类

6.创建Web项目入口配置类

二、功能模块开发

步骤1:创建数据库及表

步骤2:编写模型类

步骤3:编写Dao接口

步骤4:编写Service接口和实现类

步骤5:编写Contorller类

三、统一结果封装

四、统一异常处理

异常处理器的使用

步骤1:创建异常处理器类

步骤2:让程序抛出异常

步骤3:运行程序,测试

异常处理器类返回结果给前端

项目异常处理方案

步骤1:自定义异常类

步骤2:将定义的异常包成自定义异常

步骤3:在异常处理器类中处理自定义异常

总结

五、拦截器

​编辑拦截器的实现

步骤1:创建拦截器类

步骤2:配置拦截器类

总结

拦截器参数

前置处理方法

后置处理方法

完成处理方法

拦截器链配置

 配置多个拦截器

步骤1:创建拦截器类

步骤2:配置拦截器类

那多个拦截器是如何执行的呢?

步骤:

一、环境搭建

1.创建JdbcConfig配置类

2.创建JdbcConfig配置类

3.创建MybatisConfig配置类

4.创建jdbc.properties

5.创建SpringMVC配置类

6.创建Web项目入口配置类

二、功能模块开发

步骤1:创建数据库及表

步骤2:编写模型类

这里是以一个商品类举例的

步骤3:编写Dao接口

步骤4:编写Service接口和实现类

步骤5:编写Contorller类

三、统一结果封装

我们现在可以发现一个问题,在Controller层中增删改、查询单个、查询所有返回给前端的数据不统一。这对于前后端交互是很不方便的。

这个时候就可以使用一个类将数据返回结果统一一下。如下图所示。

这里我们设置的统一返回结果类为:

这里面用到了Code,所以也要定义一下返回码Code

修改Controller

四、统一异常处理

在代码执行中出现异常是不可避免的,异常主要分以下几种

  • 框架内部抛出的异常:因使用不合规导致

  • 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)

  • 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)

  • 表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)

  • 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)

  1. 各个层级均出现异常,异常处理代码书写在哪一层?

    所有的异常均抛出到表现层进行处理

  2. 异常的种类很多,表现层如何将所有的异常都处理到呢?

    异常分类

  3. 表现层处理异常,每个方法中单独书写,代码书写量巨大且意义不强,如何解决?

    AOP、

SpringMVC已经为我们提供了一套解决方案

如何使用呢?

异常处理器的使用

步骤1:创建异常处理器类

步骤2:让程序抛出异常

步骤3:运行程序,测试

异常处理器类返回结果给前端

项目异常处理方案

上述的异常处理方法是一个统一的概念,没有对异常进行分类,下面我们对异常进行分类。

  • 业务异常(BusinessException)

        用户在页面输入内容的时候未按照指定格式进行数据填写,如在年龄框输入的是字符串

  •  系统异常(SystemException)

        项目运行过程中可预计但无法避免的异常比如数据库或服务器宕机

  • 其他异常(Exception)

        编程人员未预期到的异常,如:用到的文件不存在

将异常分类以后,针对不同类型的异常,要提供具体的解决方案:

  • 业务异常(BusinessException)

    • 发送对应消息传递给用户,提醒规范操作

      • 大家常见的就是提示用户名已存在或密码格式不正确等

  • 系统异常(SystemException)

    • 发送固定消息传递给用户,安抚用户

      • 系统繁忙,请稍后再试

      • 系统正在维护升级,请稍后再试

      • 系统出问题,请联系系统管理员等

    • 发送特定消息给运维人员,提醒维护

      • 可以发送短信、邮箱或者是公司内部通信软件

    • 记录日志

      • 发消息和记录日志对用户来说是不可见的,属于后台程序

  • 其他异常(Exception)

    • 发送固定消息传递给用户,安抚用户

    • 发送特定消息给编程人员,提醒维护(纳入预期范围内)

      • 一般是程序没有考虑全,比如未做非空校验等

    • 记录日志

具体要怎么实现呢?

步骤1:自定义异常类

  • 让自定义异常类继承RuntimeException的好处是,后期在抛出这两个异常的时候,就不用在try...catch...或throws了

  • 自定义异常类中添加code属性的原因是为了更好的区分异常是来自哪个业务的

步骤2:将定义的异常包成自定义异常

具体的包装方式有:

  • 方式一:try{}catch(){}在catch中重新throw我们自定义异常即可。

  • 方式二:直接throw自定义异常即可

步骤3:在异常处理器类中处理自定义异常

在这里面定义的会将异常信息返回给前端

总结

项目的整个异常处理方式如下图

五、拦截器


拦截器的实现

步骤1:创建拦截器类

让类实现HandlerInterceptor接口,重写接口中的三个方法。

就是拦截器中的preHandler方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法,如果返回false,则代表拦截,后面的就不会再执行了。

步骤2:配置拦截器类

这里配置的是对/books,发送http://localhost/books ,就会看到如下输出

如果发送http://localhost/books/100会发现拦截器没有被执行,原因是拦截器的addPathPatterns方法配置的拦截路径是/book

总结

拦截器的整个执行流程如下:

当有拦截器后,请求会先进入preHandle方法,

如果方法返回true,则放行继续执行后面的handle[controller的方法]和后面的方法

如果返回false,则直接跳过后面方法的执行。

拦截器参数

前置处理方法

后置处理方法

使用率不高

完成处理方法

使用率不高

这三个方法中,最常用的是preHandle,在这个方法中可以通过返回值来决定是否要进行放行,我们可以把业务逻辑放在该方法中,如果满足业务则返回true放行,不满足则返回false拦截。

拦截器链配置

如果一个项目中有多个拦截器。该如何配置,执行顺序又是怎么样的

 配置多个拦截器
步骤1:创建拦截器类

跟前面一样再定义一个拦截器类

步骤2:配置拦截器类

跟前面一样就是多写了一遍

那多个拦截器是如何执行的呢?

和栈一样,先进后出。

  • 当配置多个拦截器时,形成拦截器链

  • 拦截器链的运行顺序参照拦截器添加顺序为准

  • 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行

  • 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

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

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

相关文章

Unlikely argument type for equals(): int seems to be unrelated to Long

代码审查不规范: Unlikely argument type for equals(): int seems to be unrelated to Long check package code_check;public class Obj {public Obj(){}private Long mail;public Long getMail(){return mail;}public void setMail(Long mail){this.mail mail;…

【OpenCV C++20 学习笔记】提取图片中的水平和垂直对象

提取图片中的水平和垂直对象 原理实操——去除五线谱的五线二进制化提取垂直对象完善边缘和最终输出图片黑白反转平滑 完整代码 其他图片元素提取实践提取水平线条提取音符轮廓 原理 在腐蚀和膨胀操作中,通过卷积核(kernel),或者结构元素(structuring e…

在优化微信、支付宝小程序用户体验时有哪些关键指标

在优化小程序用户体验时,有几个关键指标需要特别关注,这些指标不仅能够帮助评估当前的用户体验状况,还能为后续的优化工作提供明确的方向。以下是一些关键指标及其解释: 1. 日活跃用户(DAU) 是指每天使用…

搭建Mybatis,实现数据库增删改

在pom.xml文件中粘贴下列&#xff0c;加载maven依赖 <?xmlversion"1.0"encoding"UTF-8"?> <projectxmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&…

2024年武汉东湖高新区职称第二批次开始了

众所周知&#xff0c;武汉市东湖高新区职称一年两批次&#xff0c;今年下半年第二批水平能力测试报名也已经开始了&#xff0c;请注意报名时间&#xff0c;别错过&#xff01;&#xff01; 2024年武汉东湖高新区第二批次水测报名时间&#xff1a;&#xff08;一&#xff09;网上…

letcode 分类练习 哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

letcode 分类练习 哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和 242.有效的字母异位词 分别定义两个字母哈希表就可以了 class Solution { public:bool isAnagram(string s, strin…

sql注入-常见注入方法复现

环境演示均已sql-labs为例 1、报错注入 1.1常用的报错注入的函数 掌握好extractvalue、updatexml、floor报错&#xff0c;floor报错较难需要多理解&#xff0c;updatexml较为常用 定义 报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。是一种页面响应形式…

MySQL练习题(五)

环境搭建&#xff08;MySQL:8.0.25&#xff09;: CREATE TABLE DEPT (DEPTNO int PRIMARY KEY,##部门编号DNAME VARCHAR(14), ##部门名称LOC VARCHAR(13) ##部门地址 ); INSERT INTO DEPT VALUES (10, ACCOUNTING, NEW YORK); INSERT INTO DEPT VALUES (20, RESEAR…

sqllab靶场练习第1~15关

1、第一关 代码解析 if(isset($_GET[id]))//判断获取的id字段是否为空 { $id$_GET[id]; //logging the connection parameters to a file for analysis. $fpfopen(result.txt,a);//打开这个文件&#xff0c;记录操作的日志 fwrite($fp,ID:.$id."\n"); fclose($fp);…

Java、PHP、Node 操作 MySQL 数据库常用方法

一、Java 操作 MySQL 数据库 1、Java 连接 MySQL 数据库 1. 使用 JDBC 驱动程序连接 使用这种方式&#xff0c;首先需要导入 MySQL 的 JDBC 驱动程序依赖&#xff0c;然后通过 Class.forName() 方法加载驱动程序类。其创建连接的过程相对直接&#xff0c;只需提供准确的数据库…

我不喜欢蔚来的原因

商业逻辑 蔚来主打的是换电和服务。 先说服务&#xff0c;这种极其依赖人工&#xff0c;打造极致尊贵感的服务&#xff0c;是完全无法随着销售规模扩大而降低成本的&#xff0c;相反&#xff0c;如果要保持相同水准的服务&#xff0c;可能会导致成本随着规模扩大而增高&#x…

桥田动态|盛夏官宣 · 桥田全新品牌形象正式发布

VISUAL IDENTITY 2024品牌革新 桥田智能品牌VI系统升级发布 Hi 各位伙伴们&#xff0c;很高兴的告知大家&#xff0c;我们的品牌形象VI和官方网站全面升级。全新的LOGO设计和官方网站将为您带来更为直观和互动的体验。 1 品牌标识 Brand identity 全新LOGO&#xff0c;彰显…

学习STM32(3)--STM32单片机中断的应用

1 引 言 本次实验旨在深入探究STM32F103单片机中断的应用。通过实验&#xff0c;我们将全面掌握STM32F103中断的定义、NVIC&#xff08;Nested Vectored Interrupt Controller&#xff0c;嵌套向量中断控制器&#xff09;的使用和开发&#xff0c;以及外部中断&#xff08;E…

SpringBoot AOP 简单的权限校验

本篇文章的主要内容是通过AOP切面编程实现简单的权限校验。 书接上回登录与注册功能 我们的用户表里面不是有role(权限)这个字段吗 在JWT令牌的生成中&#xff0c;我们加入了role字段。 那么接下来&#xff0c;我们就可以通过这个字段来实现权限校验。 我这里就很简单&#x…

pywinauto:Windows桌面应用自动化测试(七)

前言 上一篇文章地址&#xff1a; pywinauto&#xff1a;Windows桌面应用自动化测试&#xff08;六&#xff09;-CSDN博客 下一篇文章地址&#xff1a; 暂无 一、实战常用方法 1、通过Desktop快速获取窗口 通过之前章节我们了解到控制应用的方法为Application&#xff0…

实战OpenCV之环境安装与配置

OpenCV是什么 OpenCV&#xff0c;英文全称为Open Source Computer Vision Library&#xff0c;是一个开源的计算机视觉和机器学习软件库。它设计用于提供一系列功能强大的算法&#xff0c;以帮助开发者处理图像和视频数据&#xff0c;实现各种视觉任务&#xff0c;包括&#xf…

Nginx进阶-常见配置(三)

nginx 变量 Nginx的配置文件使用的语法的就是一门微型的编程语言。既然是编程语言&#xff0c;一般也就少不了“变量”这种东西。 Nginx配置文件使用的语法主要包括以下几个方面&#xff1a; &#xff08;1&#xff09;配置块 (Block Directives): Nginx配置文件由多个嵌套的…

渗透8-05作业

第十五关: 利用时间盲注 拦截并放到intruder里 请求的参数替换或改写一下 uname1 OR IF(SUBSTRING((SELECT database()), 2, 1)e, sleep(1), 1) -- &passwd1&submitSubmit payload1设置 payload2设置&#xff08;点击从列表中添加可快速找到a到z的列表&#xff09; 开始…

Python | Leetcode Python题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; class Solution:def isPowerOfThree(self, n: int) -> bool:return n > 0 and 1162261467 % n 0

spdlog日志库--基础介绍

文章目录 1. 简介1.1. spdlog代码特点1.2. 说明1.3. spdlog架构 2. spdlog的安装2.1. 使用包管理器安装2.2. 使用源码安装2.3. 仅使用头文件 3. 相关概念3.0 常用的头文件3.1. level_enum3.2. sink3.3. logger3.4 格式输出3.5 对齐方式3.6 截断3.7 字符串格式化fmt 4. 特性4.1.…