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

目录

一、前提

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

三、拦截器

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

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

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

相关文章

Postman 接口自动化测试教程:入门介绍和从 0 到 1 搭建 Postman 接口自动化测试项目

关于Postman接口自动化测试的导引,全面介绍入门基础和从零开始搭建项目的步骤。学习如何有效地使用Postman进行API测试,了解项目搭建的基础结构、环境设置和测试用例的编写。无论您是新手还是经验丰富的测试人员,这篇教程都将为您提供清晰的指…

IIC 接口

IIC 接口 IIC总线概述IIC总线简介IIC总线通信过程IIC总线寻址方式 IIC总线信号实现起始信号、停止信号字节传送与应答同步信号 IIC典型时序 IIC总线概述 IIC总线简介 IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线,主要用于近距离、低速的芯片之间…

SpringBoot集成图数据库neo4j实现简单的关联图谱

社交领域:Facebook, Twitter,Linkedin用它来管理社交关系,实现好友推荐 图数据库neo4j安装: 下载镜像:docker pull neo4j:3.5.0运行容器:docker run -d -p 7474:7474 -p 7687:7687 --name neo4j-3.5.0 ne…

信息熵、KL散度、交叉熵、互信息、点互信息

信息熵 信息量 信息量是对信息的度量,衡量事件的不确定性,越小概率的事件发生了产生的信息量越大。我们应该用什么形式的函数表达信息量呢?除了随着概率增大而减少,这个函数还有具有以下性质: 如果有两个事件x和y彼…

云消息队列 Confluent 版正式上线!

作者:阿里云消息队列 前言 在 2023 年杭州云栖大会上,Confluent 成为阿里云技术合作伙伴,在此基础上,双方展开了深度合作,并在今天(3月1日)正式上线“云消息队列 Confluent 版”。 通过将 Co…

vue3学习(续篇)

vue3学习(续篇) 默认有vue3基础并有一定python编程经验。 chrome浏览器安装vue.js devtools拓展。 文章目录 vue3学习(续篇)1. element-ui使用2. axios 网络请求1. 简介2. 操作 3. flask-cors解决跨域问题1. 简介2. 操作 4. 前端路由 vue-router1. 简单使用2. 配置路径别名和…

基于远程NDIS的Internet共享设备驱动出现感叹号(Windows 仍在设置此设备的类配置 代码 56)解决办法

USB共享网络出现了RNDIS/MBIM设备驱动显示感叹号(Windows 仍在设置此设备的类配置。 (代码 56))的情况的解决办法: 1.设置中搜索安全模式/更改高级启动选项->立即重新启动 2.重启后界面中选择疑难解答->高级选项->启动设置->屏…

触发HTTP preflight预检及跨域的处理方法

最近在做需求的过程中,遇到了很多跨域和HTTP预检的问题。下面对我所遇到过的HTTP preflight和跨域的相关问题进行总结: 哪些情况会触发HTTP preflight preflight属于cors规范的一部分,在有跨域的时候,在一定情况下会触发preflig…

迭代的 CKKS 高精度自举

参考文献: [KDE23] Kim A, Deryabin M, Eom J, et al. General bootstrapping approach for RLWE-based homomorphic encryption[J]. IEEE Transactions on Computers, 2023.[BCC22] Bae Y, Cheon J H, Cho W, et al. Meta-bts: Bootstrap** precision beyond the …

Java基础概念 7-计算机中的数据存储

目录 Java基础概念 7-计算机中的数据存储 计算机的存储规则 进制 十进制:0123456789 二进制:01 常见的进制 不同进制在代码中的表现形式 计算机为什么用二进制存储数据? 进制之间的转换 任意进制转十进制 公式: 系数*基数的权次幂 相加 二进制转十进制** 八进制转…

基于springboot+vue的智能无人仓库管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Java电梯模拟升级版

Java电梯模拟升级版 文章目录 Java电梯模拟升级版前言一、UML类图二、代码三、测试 前言 在上一版的基础上进行升级,楼层采用享元模式进行升级,并对楼层对象进一步抽象 一、UML类图 二、代码 电梯调度器抽象类 package cn.xx.evevator;import java.ut…

cuda WSL2 无需单独安装

https://docs.nvidia.com/cuda/wsl-user-guide/index.html 这个写的很详细

正则化解决过拟合

拟合 蓝色的圈代表数据,红色的线和绿色的线分别代表我们学习到的曲线。 绿色曲线相对红色曲线更加平滑。绿色曲线才是我们想要的,红色曲线从某种程度上讲是过拟合的,可以从图上看到他的误差是很小的,每个点的误差都是很小很小的。…

纯css+html实现拟态开关按钮面板

适合智能家居的开关面板UI 参考:https://drams.framer.website/

网络聊天室

Ser.c #include<myhead.h> #define SER_IP "192.168.159.148" #define SER_PORT 6666//因为客户端发送给服务器的消息是不同类型&#xff0c;所以定义结构体比较方便 typedef struct msg_TYPE {char type; // L:登录  C:聊天  Q:退…

flowable的java class task,也叫服务任务

源码地址12级程序猿-新年正当红/flowable-ui和服务任务 启动flowable-ui-app 浏览器输入下面的地址 http://localhost:8080/flowable-ui/#/ 在服务任务这里设置java类的路径 com.dmg.flowabledemo.task.MyServiceTask 当请假任务完成之后&#xff0c;自动触发这个服务任务…

网络信息安全:nginx漏洞收集(升级至最新版本)

网络&信息安全&#xff1a;nginx漏洞收集&#xff08;升级至最新版本&#xff09; 一、风险详情1.1 nginx 越界写入漏洞(CVE-2022-41742)1.2 nginx 缓冲区错误漏洞(CVE-2022-41741)1.3 nginx 拒绝服务漏洞&#xff08;CNVD-2018-22806&#xff09; 二、nginx升级步骤 &…

奥壹oelove婚恋交友v10.0_10.1情感导师插件_商城插件SQL数据库导入升级方法

大家注意哈奥壹oelove的系统默认是不含情感导师插件和商城系统的&#xff0c;这两个插件需要再官方独立购买&#xff0c;有幸公司付钱购买了系统及两套商业插件&#xff0c;可以看我昵称找我注明CSDN我已经把数据库及模板文件提取出来了&#xff0c;先说下数据库把&#xff0c;…

基于Mindspore,通过Resnet50迁移学习实现猫十二分类

使用平台介绍 使用平台&#xff1a;启智AI协作平台 使用数据集&#xff1a;百度猫十二分类 数据集介绍 有cat_12_train和cat_12_test和train_list.txt train_list.txt内有每张图片所对应的标签 Minspore部分操作科普 数据集加载 Mindspore加载图片数据集就直接调整成这种…