SSM整合快速学习

目录

步骤:

一、环境搭建

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.rhkb.cn/news/392565.html

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

相关文章

Java面试题--JVM大厂篇之Java中Parallel GC的调优技巧与最佳实践

目录 引言: 正文: 1. 理解Parallel GC的工作原理 2. 常见痛点与解决方案 痛点一:长时间暂停 痛点二:频繁的Minor GC 痛点三:内存溢出 3. 调优参数推荐 4. 实战经验分享 结束语: 引言:…

定时任务-xxl-job

一. 为什么定时任务可以定时执行 定时任务可以定时执行的原理是通过操作系统提供的定时器实现的。 以下是定时任务能够准时执行的基本原理和相关技术: 操作系统的调度器: 操作系统(如Linux、Windows等)内部都有一个调度器&#x…

electron 配置、打包 -报错解决

目录 一、配置途中遇到的问题: 二、 make 配置好后开始打包 三、Electron-builder 打包报错 一、配置途中遇到的问题: 1. 安装 yarn add electron -D 一直卡在这里失败 一直卡可以使用下面这个,然后再重新装依赖 1. 采用新的镜像地址 npm …

机械学习—零基础学习日志(高数22——泰勒公式理解深化)

核心思想:函数逼近 在泰勒的年代,如果想算出e的0.001次方,这是很难计算的。那为了能计算这样的数字,可以尝试逼近的思想。 但是函数又不能所有地方都相等,那退而求其次,只要在一个极小的范围,…

Modbus-RTU详解

目录 Modbus-RTU协议 帧结构示例 CRC16校验算法 CRC16算法的过程 modbus-rtu的使用 发送数据 接收数据 tcp网口完整实现modbus-rtu协议 使用NModbus4实现modbus-rtu协议 安装NModbus4库。 串口实现NModbus4 Modbus-RTU协议 Modbus RTU 协议是一种开放的串行协议,广…

GroupMamba实战:使用GroupMamba实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

26集 ESP32 AIchat启动代码分析-《MCU嵌入式AI开发笔记》

26集 ESP32 AIchat启动代码分析-《MCU嵌入式AI开发笔记》 这集我们分析代码如何组织起来,如何编译 先用sourceinsight把代码加进工程。 新建一个sourceinsight工程,把AI-CHAT代码加进来,之后把ESP IDF代码加进来,之后把ESP-ADF加…

大语言模型(LLM)文本预处理实战

大语言模型(LLM)文本预处理实战 文章目录 大语言模型(LLM)文本预处理实战2.1 理解词嵌入2.2 文本分词2.3 将 token 转换为 token ID2.4 添加特殊上下文 token2.5 字节对编码 (BytePair Encoding, BPE)2.6 使用滑动窗口进行数据采样…

sql注入部分总结和复现

一个端口对应一个服务 联合查询注入 所有的程序中,单双引号必须成对出现 需要从这个引号里面逃出来 在后面查询内容 ?id1 要查库名,表名,列名。但是联合查询要知道有多少列,所以通过order by 去查询 order by # 通过二分法…

Cartopy简介和安装

Cartopy 是一个开源免费的第三方 Python 扩展包,由英国气象办公室的科学家们开发,支持 Python 2.7 和 Python 3,致力于使用最简单直观的方式生成地图,并提供对 matplotlib 友好的协作接口。初学Cartopy,欢迎指正&#…

算法回忆录(3)

11. 假设有7个物品&#xff0c;它们的重量和价值如下表所示。若这些物品均不能被分割&#xff0c;且背包容量M&#xff1d;150&#xff0c;设计算法求解怎么装才能使得获取的价值最大&#xff1f;请写出伪代码。 #include <stdio.h>#define MAX_ITEMS 100 #define …

新手小白嵌入式单片机教程,ESP32

1.什么是ESP32。 ESP32是一款由乐鑫信息科技&#xff08;Espressif Systems&#xff09;推出的高度集成的低功耗系统级芯片&#xff08;SoC&#xff09;&#xff0c;它结合了双核处理器、无线通信、低功耗特性和丰富的外设&#xff0c;特别适用于各种物联网&#xff08;IoT&am…

Robot Operating System——深度解析单线程执行器(SingleThreadedExecutor)执行逻辑

大纲 创建SingleThreadedExecutor新增Nodeadd_nodetrigger_entity_recollectcollect_entities 自旋等待get_next_executablewait_for_workget_next_ready_executableTimerSubscriptionServiceClientWaitableAnyExecutable execute_any_executable 参考资料 在ROS2中&#xff0c…

python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链

1. 简述 本次爬取维基百科“百科全书”词条页面内链&#xff0c;仅发送一次请求&#xff0c;获取一个 html 页面&#xff0c;同时不包含应对反爬虫的知识&#xff0c;仅包含最基础的网页爬取、数据清洗、存储为 csv 文件。 爬取网址 url 为 “https://zh.wikipedia.org/wiki/…

数据结构:基于顺序表实现通讯录系统(含源码)

目录 一、前言 二、各个功能的实现 2.1 初始化通讯录 2.2 添加通讯录数据 2.3 查找通讯录数据 2.4 删除通讯录数据 2.5 修改通讯录数据 2.6 展示通讯录数据​编辑 2.7 销毁通讯录数据 三、添加菜单和测试 四、完整源码 sxb.h sxb.c contact.h contact.c test.c 一、前…

【隐私计算篇】混淆电路之深入浅出

入门隐私计算的阶段&#xff0c;一般都会涉及对于混淆电路的学习&#xff0c;这是因为混淆电路是多方安全计算中的基础密码原语&#xff0c;也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理&#xff0c;今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…

不同角色路由权限配置(六)

一、启用方式 配置开启config/config.ts。同时需要 src/access.ts 提供权限配置 export default {access: {},// access 插件依赖 initial State 所以需要同时开启initialState: {}, };这里以扩展的路由配置为例&#xff0c;配置只有admin权限才能查看的页面 1、在src/acces…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第3天

目录 一&#xff0c;列表-无序和有序的定义列表 二&#xff0c;表格-基本使用与表格结构标签 三&#xff0c;合并单元格 四&#xff0c;表单-input标签 五&#xff0c;表单-下拉菜单 六&#xff0c;表单-文本域 七&#xff0c;表单-label标签 八&#xff0c;表单-按钮 …

【已解决】页面操作系统功能,诡异报错500nginx错误

【已解决】页面操作系统功能&#xff0c;诡异报错500nginx错误&#xff0c;后台没有任何报错信息 不知道啥原因 清理了浏览器缓存 也没有效果 还有一个表现情况&#xff0c;同样的操作&#xff0c;有时可以又是不行 因为报错ng的代理问题&#xff0c;检查了ng配置 后续经过同…

【C/C++】C语言和C++实现Stack(栈)对比

我们初步了解了C&#xff0c;也用C语言实现过栈&#xff0c;就我们当前所更新过的有关C学习内容以栈为例子&#xff0c;来简单对比一下C语言和C。 1.C中栈的实现 栈的C语言实现在【数据结构】栈的概念、结构和实现详解-CSDN博客 &#xff0c;下面是C实现的栈&#xff0c; 在St…