使用统一功能完善图书管理系统

news2025/4/6 9:13:49

目录

一、前提

二、实现强制登陆传统方式

三、拦截器

1、概念

2、拦截器

(1)定义拦截器

(2)注册拦截器

(3)运行

3、使用拦截器实现强制登陆

4、DispatcherServlet源码解析

四、适配器模式

1、适配器模式概念

2、适配器模式角色

3、适配器应用场景

五、统一数据格式返回

1、对后端响应结果进行统一

2、对于不同状态执行不同方法

3、统一功能实现

4、统一功能实现存在的问题

六、统一异常处理

七、图书管理系统部分重要代码

1、登陆功能

2、增加图书功能

3、显示图书列表功能

4、更新图书功能

5、删除图书功能


一、前提

设计一个图书管理系统,具有:登陆功能显示图书列表功能增加图书更新图书删除图书批量删除图书强制登陆。目前已经实现了前6个功能,借助myBatis,以及一些插件:分页展示、批量选择等,所涉及到的知识点前面文章已详细介绍,此处就不再详细展开了,文章后面会附上关键代码(后端响应和前端请求)。

二、实现强制登陆传统方式

除登陆页面外,在每个页面执行请求前,先根据session判断是否登陆,未登陆的返回状态码401,前端接收到401状态码后跳转到登陆页面,若已经登陆,则返回body即可,默认状态码为200。

该方式在前面博客,基于sevlet实现博客系统已实现,此处就不再编写代码了。

我们想一个问题:除登陆页面外,每次在其他页面实现请求时都要检查是否登陆,我们可否对于这些请求进行同一拦截,并进行session检验---拦截器。

三、拦截器

1、概念

是spring框架提供的功能,对于指定请求,可以在方法前后执行指定的预代码,对于请求方法前的预代码,返回结果为true是才会进入请求方法。

2、拦截器

对于强制登陆,我们希望在执行方法前就进行判断是否登陆,利用拦截器,若未登陆,结束响应。

(1)定义拦截器

实现Handlerlnterceptor接口,并重写所有方法。

①preHandle方法:目标方法执行前执行。返回true,执行目标方法;返回false,中断执行。

②postHandle方法:目标方法执行完成后执行。

③afterCompletion方法:视图渲染后执行,最后执行。

(2)注册拦截器

实现WebMvcConfigurer接口,重写addInterceptors方法。

(3)运行

3、使用拦截器实现强制登陆

(1)定义

(2)注册

(3)运行

当完成登录后就可以访问了。

4、DispatcherServlet源码解析

当tomcat服务器启动后,有一个核心类---DispatcherServlet,由他控制程序的执行顺序。

(1)该类的初始化--init方法

在其父类HttpServletBean中实现了init方法,主要用来加载 web.xml 中 DispatcherServlet 的 配置, 并调⽤⼦类的初始化。

(2)initServletBean()方法

在HttpServletBean类的init方法中,调用了其父类FrameworkServlet的initServletBean方法,主要是用来建立上下文(运行环境,WebApplicationContext容器),并加载SpringMvc配置文件中定义的bean到该容器中,最后将容器添加到ServletContext中。

(3)initStrategies()方法

在DispatcherServlet类中,调用了initDStrategies方法,该方法可以进行九大组件的初始化,如果没有配置相应的组件,就使用默认定义的组件。

(4)doDispatch()方法

DispatcherServlet类在接收到请求后,会调用doDispatch方法,进行调度,将请求转给Controller

执行步骤:①遍历所有的HandlerMapping,找到与请求对应的Handler;②遍历所有的HandlerAdapter(适配器),找到可以处理该Handler的HandlerAdapter。③执行拦截器的preHandle方法;④执行目标方法;⑤执行拦截器postHndle方法;⑥处理视图,处理完成后执行拦截器的afterCompletion方法。

四、适配器模式

上面在执行doDispatch()方法时,使用到了适配器,使得在执行不同的请求时,例如:Controller、Servlet等,这些类的调用过程类实现了适配器的接口,使得适配器对于不同请求也能做出响应。

1、适配器模式概念

用于将一个类的接口转换为客户端目标的接口。

2、适配器模式角色

(1)target:目标接口,客回端希望的接口;

(2)Adaptee:适配者,与目标接口不兼容;适配器

(3)Adapter:适配器类,通过继承或向下转型将适配者转为目标接口;

(4)client:需要使用适配器的对象。

3、适配器应用场景

可以用来补救设计上的缺陷,设计之初若解决接口不兼容的问题,就可以不使用适配器模式了。

五、统一数据格式返回

为了使代码更规范,可以使响应可以具有统一的返回格式,也提高了前端与后端人员的沟通效率。方便前端人员解析响应。

针对上述图书管理系统,进行统一数据格式返回,返回有3种状态:①未登录,401(拦截器已实现);②已登陆,但出现异常;③已登录且成功响应。

1、对后端响应结果进行统一

2、对于不同状态执行不同方法

3、统一功能实现

实现ResponseBodyAdvice接口,加上@ControllerAdvice注解,重写supports和beforeBodyWrite方法。

supports():判断是否要执行beforeBodyWrite方法,true时执行,false时不执行

beforeBodyWrite():对后端的响应结果进行从处理。

没有进行统一功能时返回的结果:

进行统一功能返回的结果:

4、统一功能实现存在的问题

(1)结果重复包装

试想一下,若我们返回的结果本来就是统一结果的类型,是否会对结果再次包装???

访问url:发现结果重复包装

做出修改:

(2)响应内容是字符串时无法进行包装

①结果是Integer类型

        

②结果是boolean类型 

③结果是String类型

    

发现报错了,500是后端代码出错。查看日志:

读源码发现:当返回的数据是⾮字符串时, 使⽤的 MappingJackson2HttpMessageConverter 写⼊返回对象;当返回的数据是字符串时, StringHttpMessageConverter 会先被遍历到,这时会认为 StringHttpMessageConverter可以使⽤。由于 StringHttpMessageConverter 重写了addDefaultHe-aders方法,所以会执⾏⼦类的⽅法,然⽽⼦类 StringHttpMessageConverter 的addDefaultH-eaders⽅法定义接收参数为String, 统一结果处理后,此时UnifiedResult类型, 所以出现类型不匹配"UnifiedResult cannot be cast to java.lang.String"的异常

解决方法:将结果修改为json类型

(3)对于异常结果无法返回正确代码状态

 

以上出现空指针异常,服务器状态码已经为500了,失败状态,结果里的200也应该为-1,代表失败,但是返回的还是200,是因为没有对异常进行处理,使得结果调用的都是success方法,对异常处理,出现异常调用fail方法。

六、统一异常处理

@ControllerAdvice+@ResponseBody+@ExceptionHandler+异常捕获

访问url:

上面异常继承关系:NullPointerException---->RuntimeException---->Exception

:若没有NullPointerException异常声明,则会报运行异常RuntimeException;若没有NullPointerException和RuntimeException异常声明,则会报异常Exception。

七、图书管理系统部分重要代码

1、登陆功能

(1)前端请求+处理后端响应:

(2)后端处理请求:

2、增加图书功能

(1)前端请求+处理后端响应:

(2)后端处理请求:

3、显示图书列表功能

(1)前端请求+处理后端响应:

(2)后端处理请求:

4、更新图书功能

(1)前端请求+处理后端响应:

(2)后端处理请求:

5、删除图书功能

(1)前端请求+处理后端响应:

(2)后端处理请求:

6、批量删除功能

(1)前端请求+处理后端响应:

(2)后端处理请求:

若需要全部源码,可以进入:葛雅宁 (ge-yaning) - Gitee.com

点击java学习下的myBookSystem

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

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

相关文章

深入剖析k8s-控制器思想

引言 本文是《深入剖析Kubernetes》学习笔记——《深入剖析Kubernetes》 正文 控制器都遵循K8s的项目中一个通用的编排模式——控制循环 for {实际状态 : 获取集群中对象X的实际状态期望状态 : 获取集群中对象X的期望状态if 实际状态 期望状态 {// do nothing} else {执行…

协议-http协议-基础概念03-http状态码-http特点-http性能-压缩和分块传输-范围请求

参考来源: 极客时间-透视HTTP协议(作者:罗剑锋); 01-状态码分类 开头的 Version 部分是 HTTP 协议的版本号,通常是HTTP/1.1,用处不是很大。后面的 Reason 部分是原因短语,是状态码的简短文字描述&#xff…

【计算机网络_应用层】TCP应用与相关API守护进程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 相关使用接口2. 代码实现2.1 日志组件2.2 Server端2.3 Client端2.3 bug解决 3. 守…

c语言数据结构(5)——栈

欢迎来到博主的专栏——C语言数据结构 博主id&#xff1a;代码小豪 文章目录 栈栈的顺序存储结构栈的插入空栈的初始化栈的删除判断空栈读取栈顶元素数据 实现顺序栈的所有代码栈的链式存储结构链式栈的初始化链式栈的入栈操作链式栈的出栈操作 实现链式栈的所有代码 栈 栈是…

[微服务]Eureka注册中心

目录 1、引言 2、Eureka的结构和作用 2.1、图解 2.2、几个重要问题⭐ 3、搭建eureka-server 3.1.创建eureka-server服务 3.2、引入eureka依赖 3.3、编写启动类 3.4、编写配置文件 3.5、启动服务 4、服务注册(user) 4.1、引入依赖 4.2、配置文件 4.3、启动多个use…

python--练习题

1.python是一种&#xff08; &#xff09;类型的编程语言 A.机器语言 B.解释 C.编译 D.汇编语言 答案&#xff1a;B 2.python语言print(中国&#xff0c;你好)的输出是&#xff08;&#xff09; A.(中国&#xff0c;你好&#xff09; B.中国&#xff0c;你好 C.中国&#xff0c…

【前端素材】推荐优质后台管理系统网页Star admin平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;通常由管理员使…

吴恩达机器学习全课程笔记第五篇

目录 前言 P80-P85 添加数据 迁移学习 机器学习项目的完整周期 公平、偏见与伦理 P86-P95 倾斜数据集的误差指标 决策树模型 测量纯度 选择拆分方式增益 使用分类特征的一种独热编码 连续的有价值特征 回归树 前言 这是吴恩达机器学习笔记的第五篇&#xff0c…

Redis 的 介绍 及 使用

redis 简介 简单来说 redis 就是一个数据库&#xff0c;不过与传统数据库不同的是 redis 的数据是存在内存中的&#xff0c;所以读写速度非常快&#xff0c;因此 redis 被广泛应用于缓存方向。另外&#xff0c;redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同…

springboot3.x 以上,官方不建议使用spring.factories

springboot2.7.x 以上,官方不建议使用spring.factories 最近公司项目升级.需要将springcloud/springboot版本升级到2.7.x以上,再升级的过程中遇到了太多的问题.总结在了如下文章中: springboot艰难版本升级之路!! springboot 2.3.x版本升级到2.7.x版本 这篇文章就重点是梳理一…

npm digital envelope routines::unsupported

问题描述&#xff1a;npm运行命令报错&#xff1a;digital envelope routines::unsupported 原因&#xff1a;node版本过高 解决方案&#xff1a;在运行命令之前加上 SET NODE_OPTIONS--openssl-legacy-provider && SET NODE_OPTIONS--openssl-legacy-provider &&a…

vSphere资源管理

一 内存、CPU、资源池和vApp 内存部分&#xff1a; 关联VM内存 我们可以超额的关联内存给VM。例如&#xff1a;ESXI物理主机内存只有8G&#xff0c;但我们可以给三个VM都分配4G内存。 2.ESXI四大高级内存控制技术 a.Page sharing&#xff08;透明的页面共享&#xff09; 虚…

PYTHON 自动化办公:压缩图片(PIL)

1、介绍 在办公还是学习过程中&#xff0c;难免会遇到上传照片的问题。然而照片的大小限制一直都是个问题&#xff0c;例如照片限制在200Kb之内&#xff0c;虽然有很多图像压缩技术可以实现&#xff0c;但从图像处理的专业来说&#xff0c;可以利用代码实现 这里使用的库函数是…

【深度学习笔记】5_4 池化层

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.4 池化层 回忆一下&#xff0c;在5.1节&#xff08;二维卷积层&#xff09;里介绍的图像物体边缘检测应用中&#xff0c;我们构造卷…

python 使用curl_cffi 绕过jax3指纹-Cloudflare 5s盾

现在越来越多的网站已经能够通过JA3或者其他指纹信息&#xff0c;来识别你是不是爬虫了。传统的方式比如换UA&#xff0c;加代理是没有任何意义了&#xff0c;所以这个时候我们就需要使用到curl_cffi 了。 1.TLS 指纹是啥&#xff1f; 在绝大多数的网站都已经使用了 HTTPS&am…

【YOLO v5 v7 v8 小目标改进】ODConv:在卷积核所有维度(数量、空间、输入、输出)上应用注意力机制来优化传统动态卷积

ODConv&#xff1a;在卷积核所有维度&#xff08;数量、空间、输入、输出&#xff09;上应用注意力机制来优化传统的动态卷积 提出背景传统动态卷积全维动态卷积效果 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 论文&#xff1a;https://openreview.net/pdf?idDmpCfq6Mg…

电商小程序10分类管理

目录 1 分类数据源2 搭建功能3 创建变量读取数据4 绑定数据总结 本篇我们介绍一下电商小程序的分类管理功能的开发&#xff0c;先看我们的原型图&#xff1a; 在首页我们是展示了四个分类的内容&#xff0c;采用上边是图标&#xff0c;下边是文字的形式。使用低代码开发&#…

Redis大数据统计

文章目录 一. 相关面试题1. 面试题一2. 面试题二 二. 统计的类型1. 聚合统计2. 排序统计3. 二值统计4. 基数统计 三. Hyperloglog1. 专业名词2. Hyperloglog使用3. Hyperloglog原理4. Hyperloglog案例 四. GEO1. 面试题2. GEO使用3. GEO案例 五. BitMap1. 面试题2. BitMap使用 …

Java+SpringBoot+Vue:招生宣传的全栈解决方案

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

《汇编语言》- 读书笔记 - 第13章-int 指令

《汇编语言》- 读书笔记 - 第13章-int 指令 13.1 int 指令13.2 编写供应用程序调用的中断例程中断例程&#xff1a;求一 word 型数据的平方主程序中断处理程序执行效果 中断例程&#xff1a;将一个全是字母&#xff0c;以0结尾的字符串&#xff0c;转化为大写主程序中断处理程序…