【Spring MVC】如何运用应用分层思想实现简单图书管理系统前后端交互工作

前言

🌟🌟本期讲解关于SpringMVC的编程思想之应用分层~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

  

目录

📚️1.图书管理系统

1.1交互接口

1.2后端代码实现

1.对象属性的初始化

2.实现用户登录

3.实现图书获取

4.postman进行测试

1.3前端代码实现

📚️2.应用分层

2.1介绍

1.什么是应用分层

2.为什么要分层

3.如何分层(三层架构)

4.MVC 和三层架构的区别和联系 

2.2代码重构

1.建立各个功能的包

2.Dao数据层

3.Service业务逻辑层

4.Controller表现层

2.3应用分层的好处

📚️3.总结


 

📚️1.图书管理系统

和之前的几次登录的前后端交互的思路是基本一致的,通过规定前后端交互的接口的实现,我们这里要明白,这个过程的重要意义;

1.1交互接口

登录接口

如下所示:

[URL]
POST /user/login
[请求参数]
name=admin&password=admin
[响应]
true //账号密码验证成功
false//账号密码验证失败

图书列表展示

如下所示:

[URL]
POST /book/getList
[ 请求参数 ]
[ 响应 ]
返回图书列表
[
{
"id": 1,
"bookName": " 活着 ",
"author": " 余华 ",
"count": 270,
"price": 20,
"publish": " 北京⽂艺出版社 ",
"status": 1,
"statusCN": " 可借阅 "
},
...
]

 

1.2后端代码实现

1.对象属性的初始化

可以看到此时由于存在大量的是数据,所以我们需要把这些属性放在一个对象中,达到统一管理的目的;不可能直接在后端响应的参数中直接通过参数定义来进行操作;

代码如下所示:

public class BookInfo {//图书IDprivate Integer id;//书名private String bookName;//作者private String author;//数量private Integer count;//定价private BigDecimal price;//出版社private String publish;//状态 0-⽆效 1-允许借阅 2-不允许借阅private Integer status;private String statusCN;

解释:

这里小编没有定义构造函数,get与set方法,是因为:小编在上期讲解过,我们添加了lombok包中的Data的注解,所以这里进行了反编译(编译器生成代码的一种工具包),所以帮我们编写了get 与set方法;

2.实现用户登录

和之前的案例的样式基本是一致的,URL路由映射,判断拿到的参数是否符合要求,并进行对应的逻辑处理,返回对应的类型的值

代码如下所示:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public boolean login(String userName, String password, HttpSession session){if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){return false;}if("admin".equals(userName) && "admin".equals(password)){return true;}return false;}
}

解释:

第一个if判断,拿到的参数是否是为空的,如果为空那么就返回false,反之进入下一个判断;

第二个if判断,这里的文本是否是我们规定的文本(这一步就是判断密码用户是否正确)(这里写死了!)

3.实现图书获取

由于没有连接数据库,所以这里小编将进行mock的数据方式,进行数据的模拟,方便我们通过postman进行测试

代码如下所示:

@RequestMapping("/book")
@RestController
public class BookController {@RequestMapping("/getList")public List<BookInfo> getList(){//获取数据List<BookInfo> books = mockData();//处理⻚⾯展⽰for (BookInfo book:books){if (book.getStatus()==1){book.setStatusCN("可借阅");}else {book.setStatusCN("不可借阅");}}return books;}public List<BookInfo> mockData() {List<BookInfo> books = new ArrayList<>();for (int i = 0; i < 5; i++) {BookInfo book = new BookInfo();book.setId(i);book.setBookName("书籍" + i);book.setAuthor("作者" + i);book.setCount(i * 5 + 3);book.setPrice(new BigDecimal(new Random().nextInt(100)));book.setPublish("出版社" + i);book.setStatus(1);books.add(book);}return books;}
}

解释:

这里的数据模拟,大家可以简单看看,具体的数据逻辑处理就是在判断书籍的借出的状态,当这里的状态是1的时候就是不可借阅的状态,反之如果是2,就是可以借阅的状态;

4.postman进行测试

此时我们用户登录的测试,输入正确的userName与password参数进行测试:

此时的返回的值就是true,说明我们的代码是没有问题的;

1.3前端代码实现

由于小编不是专业的前端程序员,所以小编主要讲解一下前端的核心代码即可:

<script>function login() {$.ajax({url:"user/login",type:"post",data:{userName:$("#userName").val(),password:$("#password").val()},success: function (result) {if(result){location.href="/book_list.html"}else {alert("用户名或密码错误")}}})}

解释:

这里主要是通过URL进行传递参数的地址,Ajax方法实现这里的要求,拿到这里的username与password,传递给后端服务器,,拿到返回值,进行对应事务的处理;

getBookList();function getBookList() {$.ajax({type: "get",url: "/book/getList",success: function (result) {console.log(result);if (result != null) {var finalHtml = "";for (var book of result) {finalHtml += '<tr>';finalHtml += '<td><input type="checkbox" name="selectBook"value="' + book.id + '" id="selectBook" class="book-select"></td>';finalHtml += '<td>' + book.id + '</td>';finalHtml += '<td>' + book.bookName + '</td>';finalHtml += '<td>' + book.author + '</td>';finalHtml += '<td>' + book.count + '</td>';finalHtml += '<td>' + book.price + '</td>';finalHtml += '<td>' + book.publish + '</td>';finalHtml += '<td>' + book.statusCN + '</td>';finalHtml += '<td><div class="op">';finalHtml += '<a href="book_update.html?bookId=' + book.id+ '">修改</a>';finalHtml += '<a href="javascript:void(0)"onclick="deleteBook(' + book.id + ')">删除</a>';finalHtml += '</div></td>';finalHtml += "</tr>";}$("tbody").html(finalHtml);}}});}

解释:

本段代码主要是负责,拿到后端数据对象中的数据,通过循环遍历,然后拿到每一个对象后,进行每个属性的拼接;

成果展示:

点击登录后:

注意:

1.这里的数据是小编进行模拟的数据,是没有实际意义的

2.这里的前端代码是小编这里自己的模版,需要的uu可以私信小编哦~~~

📚️2.应用分层

通过上⾯的练习, 我们学习了Spring MVC简单功能的开发, 但是我们也发现了⼀些问题
⽬前我们程序的代码有点"杂乱", 然⽽当前只是"⼀点点功能"的开发. 如果我们把整个项⽬功能完成呢?

代码会更加的"杂乱⽆章"(⽂件乱, 代码内容乱)

2.1介绍

阿⾥开发⼿册中, 关于⼯程结构部分, 定义了常⻅⼯程的应⽤分层结构:

但是这个仅供参考即可;

1.什么是应用分层

应⽤分层 是⼀种软件开发设计思想, 它将应⽤程序分成N个层次, 这N个层次分别负责各⾃的职责, 多个层次之间协同提供完整的功能. 根据项⽬的复杂度, 把项⽬分成三层, 四层或者更多层.

常⻅的MVC设计模式, 就是应⽤分层的⼀种具体体现. 

2.为什么要分层

 ⼤量的代码混在⼀起,会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动⼀处就牵⼀发⽽动全⾝等问题

总结就是:“高内聚,低耦合”;

3.如何分层(三层架构)

Model(模型), View(视图)和Controller(控制器)三个层次,也就是将⽤⼾视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是⼀种标准的软件分层构。

如下图所示:

可以看到这是一个标准的MVC架构思想;

由于现在的前后端分离的原因:

所以对于Java后端开发者, ⼜有了⼀种新的分层架构: 把整体架构分为表现层、业务逻辑层和数据层. 这种分层⽅式也称之为"三层架构".

1. 表现层: 就是展⽰数据结果和接受⽤⼾指令的,是最靠近⽤⼾的⼀层;
2. 业务逻辑层: 负责处理业务逻辑, ⾥⾯有复杂业务的具体实现;
3. 数据层: 负责存储和管理与应⽤程序相关的数据 

按照上⾯的层次划分, Spring MVC 站在后端开发⼈员的⻆度上, 也进⾏了⽀持, 把上⾯的代码划分为三个部分:

• Controller:控制层。接收前端发送的请求,对请求进⾏处理,并响应数据。 •
• Service:业务逻辑层。处理具体的业务逻辑。
• Dao:数据访问层,也称为持久层。负责数据访问操作,包括数据的增、删、改、查

4.MVC 和三层架构的区别和联系 

MVC模式:强调数据和视图分离, 将数据展⽰和数据处理分开, 通过控制器对两者进⾏组合.
三层架构:强调不同维度数据处理的⾼内聚和低耦合, 将交互界⾯, 业务处理和数据库操作的逻辑分开.⻆度不同也就谈不上互相替代了,在⽇常的开发中可以经常看到两种共存的情况

但是两者的目的:都是"解耦,分层,代码复⽤"(高内聚,低耦合)

2.2代码重构

此时我们实现分层应用的思想实现上述代码的改进:

1.建立各个功能的包

此时就对应了三层架构的思想模式;

这里多了一个包就是实体类,用model来进行存储;

2.Dao数据层

此时就是负责拿到每个数据的存储:

public class BookDao {public List<BookInfo> mockData(){List<BookInfo> books=new ArrayList<>();for (int i = 0; i < 5; i++) {BookInfo book = new BookInfo();book.setId(i);book.setBookName("书籍" + i);book.setAuthor("作者" + i);book.setCount(i * 5 + 3);book.setPrice(new BigDecimal(new Random().nextInt(100)));book.setPublish("出版社" + i);book.setStatus(1);books.add(book);}return books;}
}

将这里的模拟mock数据进行存储在列表里; 

3.Service业务逻辑层

这里就是进行业务逻辑处理,这里要处理的数据就是判断这本书的状态,判断为1还是为2;

代码如下:

public class BookService {public List<BookInfo> getBookList(){BookDao bookDao=new BookDao();List<BookInfo> books=bookDao.mockData();for (BookInfo book : books) {if (book.getStatus() == 1) {book.setStatusCN("可借阅");} else {book.setStatusCN("不可借阅");}}return books;}

解释:

这里要注意,这里的数据是从哪里来的,很明显是从模拟数据包这类里来的,所以要先创建一个对象,拿到这里面的数据,然后进行相应的数据逻辑处理;

4.Controller表现层

 这里就是负责数据的获取,从前端拿到数据,并返回处理过后的数据:

这里的数据的获取就是如下的:

@RequestMapping("/book")
@RestController
public class BookController {@RequestMapping("/getList")public List<BookInfo> getList() {//获取数据BookService bookService = new BookService();List<BookInfo> books = bookService.getBookList();//处理⻚⾯展⽰return books;}
}

解释:

这里就是拿到业务逻辑处理过后的数据,所以要拿到这个对应的对象,然后返回给前端,实现数据的交互;

这里的用户也是没有变动的,小编就不在进行演示了;

2.3应用分层的好处

• 降低层与层之间的依赖, 结构更加的明确, 利于各层逻辑的复⽤
• 开发⼈员可以只关注整个结构中的其中某⼀层, 极⼤地降低了维护成本和维护时间
• 可以很容易的⽤新的实现来替换原有层次的实现
• 有利于标准化

📚️3.总结

小编本期主要讲解了关于图书管理系统简单登录,和模拟数据的展示,重点讲解了关于应用分层的概念,以及优点和如何实现,并通过应用分层的思想改进了后端代码;

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                 😊😊  期待你的关注~~~

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

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

相关文章

【Linux】项目自动化构建工具-make/Makefile

【Linux】项目自动化构建工具-make/Makefile make 和 makefile 的概念如何清理项目推导过程Linux第⼀个小程序−倒计时 &#x1f30f;个人博客主页&#xff1a;个人主页 make 和 makefile 的概念 make是一个命令工具&#xff0c;是一个解释makefile中指令的命令工具&#xf…

arcgis for js点击聚合要素查询其包含的所有要素

功能说明 上一篇讲了实现聚合效果, 但是点击聚合效果无法获取到该聚合点包含的所有点信息 这一篇是对如何实现该功能的案例 实现 各属性说明需要自行去官网查阅 官网案例 聚合API 没空说废话了, 加班到12点,得休息了, 直接运行代码看效果就行, 相关重点和注意事项都在代码注…

【计算机视觉】图像基本操作

1. 数字图像表示 一幅尺寸为MN的图像可以用矩阵表示&#xff0c;每个矩阵元素代表一个像素&#xff0c;元素的值代表这个位置图像的亮度&#xff1b;其中&#xff0c;彩色图像使用3维矩阵MN3表示&#xff1b;对于图像显示来说&#xff0c;一般使用无符号8位整数来表示图像亮度&…

javaweb-day03-前端零碎

1.Ajax &#xff08;1&#xff09;概述 &#xff08;2&#xff09;原生Ajax-繁琐&#xff0c;现已基本弃用 2.Ajax-Axios &#xff08;2&#xff09;案例 3.前端工程化 3.1 基础 3.2 vue项目 &#xff08;1&#xff09;项目目录结构 &#xff08;2&#xff09;主要开发…

论文阅读:A Software Platform for Manipulating theCamera Imaging Pipeline

论文代码开源链接&#xff1a; A Software Platform for Manipulating the Camera Imaging Pipelinehttps://karaimer.github.io/camera-pipeline/摘要&#xff1a;论文提出了一个Pipline软件平台&#xff0c;可以方便地访问相机成像Pipline的每个阶段。该软件允许修改单个模块…

Python毕业设计选题:基于django+vue的智能停车系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 车主管理 车辆信息管理 车位信息管理 车位类型管理 系统…

使用phpStudy小皮面板模拟后端服务器,搭建H5网站运行生产环境

一.下载安装小皮 小皮面板官网下载网址&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; 安装说明&#xff08;特别注意&#xff09; 1. 安装路径不能包含“中文”或者“空格”&#xff0c;否则会报错&#xff08;例如错误提示&#xff1a;Cant cha…

【jmeter】服务器使用jmeter压力测试(从安装到简单压测示例)

一、服务器上安装jmeter 1、官方下载地址&#xff0c;https://jmeter.apache.org/download_jmeter.cgi 2、服务器上用wget下载 # 更新系统 sudo yum update -y# 安装 wget 以便下载 JMeter sudo yum install wget -y# 下载 JMeter 压缩包&#xff08;使用 JMeter 官方网站的最…

【大数据学习 | Spark-Core】详解Spark的Shuffle阶段

1. shuffle前言 对spark任务划分阶段&#xff0c;遇到宽依赖会断开&#xff0c;所以在stage 与 stage 之间会产生shuffle&#xff0c;大多数Spark作业的性能主要就是消耗在了shuffle环节&#xff0c;因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。 负责shuffle…

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

Meta 发布Sapiens人类视觉模型,2D 姿势估计、人体分割、深度估计

meta提出了 Sapiens&#xff0c;人类基础视觉模型。这是一个以人为中心的视觉任务的模型。包括&#xff1a; 2D 姿势估计、人体部位分割、深度估计和表面法线预测。 此模型本身支持 1K 高分辨率推理&#xff0c;Sapiens在超过 3 亿张人类图像上预训练的模型进行微调&#xff0c…

NLP论文速读(EMNLP2024)|多风格可控生成的动态多奖励权重

论文速读|Dynamic Multi-Reward Weighting for Multi-Style Controllable Generation 论文信息&#xff1a; 简介&#xff1a; 本文探讨了文本风格在沟通中的重要性&#xff0c;指出文本风格传达了除原始语义内容之外的多种信息&#xff0c;如人际关系动态&#xff08;例如正式…

鸿蒙中的Image组件如何引用网络图片

1.引用网络图片资源 引入网络图片需要申请权限ohos.permission.INTERNET&#xff0c;此时&#xff0c;Image组件的src参数为网络图片的链接&#xff0c;为了成功加载网络图片&#xff0c;您需要在module.json5文件中申请网络访问权限 注意&#xff1a;实际可用的时候&#xff0…

七天掌握SQL--->第七天:项目实践与总结

一、项目实践 1.1 项目背景 假设我们正在开发一个名为“在线图书管理系统”的项目。该项目旨在帮助图书馆管理员管理图书的借阅、归还、库存等操作&#xff0c;同时为读者提供一个便捷的图书查询和借阅平台。 1.2 数据库设计 1.2.1 需求分析 根据项目的需求&#xff0c;我…

React Hooks中use的细节

文档 useState useState如果是以函数作为参数&#xff0c;那要求是一个纯函数&#xff0c;不接受任何参数&#xff0c;同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值&#xff0c;当以一个函数作为参数进行传入的时候需要注意&#xff…

springboot 配置跨域访问

什么是 CORS&#xff1f; CORS&#xff0c;全称是“跨源资源共享”&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一种Web应用程序的安全机制&#xff0c;用于控制不同源的资源之间的交互。 在Web应用程序中&#xff0c;CORS定义了一种机制&#xff0…

应用于蛋白-小分子柔性对接的等变VAE模型 - FlexPose 测评

FlexPose 应用于蛋白-小分子柔性对接场景下&#xff0c;能够在欧几里得空间中直接对蛋白-小分子复合结构的进行预测的等变神经网络模型&#xff0c;而无需传统的采样和评分策略。此模型考虑了蛋白氨基酸主链和侧链的柔性&#xff0c;会根据小分子的情况对氨基酸的侧链和主链进行…

【Web前端】如何构建简单HTML表单?

HTML 表单是 Web 开发中非常重要的组成部分。它们是与用户交互的主要方式&#xff0c;能够收集用户输入的数据。表单的灵活性使它们成为 HTML 中最复杂的结构之一&#xff0c;但若使用正确的结构和元素&#xff0c;可以确保其可用性和无障碍性。 表单的基本结构 HTML 表单使用…

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…

IDEA全局设置-解决maven加载过慢的问题

一、IDEA全局设置 注意&#xff1a;如果不是全局设置&#xff0c;仅仅针对某个项目有效&#xff1b;例在利用网上教程解决maven加载过慢的问题时&#xff0c;按步骤设置却得不到解决&#xff0c;原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面&#xff0c;点击f…