当前位置: 首页 > news >正文

Spring第三课,Lombok工具包下载,对应图书管理系统列表和登录界面的后端代码,分层思想

目录

一、Lombok工具包下载

二、前后端互联的图书管理系统

规范

 三、分层思想

三层架构:

1.表现层

2.业务逻辑层

3.数据层


一、Lombok工具包下载

这个工具包是为了做什么呢?

他是为了不去反复的设置setting and getting 而去产生的工具包

⚠️工具包下载:推荐不要下载太新的(较高的),也不要太旧,选择一个使用人多的。

使用方法:加上注解Data之后。

我们可以使用get+属性名字()比如

此时你明明没有写get方法,但是就是会有get这个方法,这也是这个包吊的地方,

当然,假如你想有东西让他不可修改,不能访问,那么就可以特定的去写Getter,Setter

为什么前端校验之后,后端还需要校验

1.这是两个团队的事情

2.后端可能会受到攻击,不是非正常的请求

二、前后端互联的图书管理系统

规范

图书管理系统

1.登录

URL: /user/login

参数: userName=?password=?

响应:true/false

2.图书列表展示

URL:/book/getBookLsit

参数:无

响应:List<BookInfo>

登录界面的后段代码显示

package com.example.demo.demos.web;import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@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;}//验证账号密码是否正确//为什么admin放在前面,因为假如userName为NULL,这样他就会报一个空指针错误,常量放在前面,开发习惯if("admin".equals(userName)&&"admin".equals(password)){//账号密码正确//存session,一会在这个地方,记得要去测试一下没有session会怎么样session.setAttribute("userName",userName);return  true;}return  false;}}

这个session我开始一直不理解是用来干什么的,但是现在突发奇想一个念头,他的作用是,我们之前写过的博客系统,登录界面,假如登录成功,你的用户ID会变成你的用户名,换句话说,它是从你的登录开始获取您的信息,然后去对您的信息进行一系列操作

更加深刻的理解这个session像是一个医保卡,你登录之后,你的信息服务器就获取了,然后会根据您的信息为你进行接下来的服务。

Book对象

package com.example.demo.demos.web;import lombok.Data;import java.math.BigDecimal;@Data
public class BookInfo {private Integer id;private String bookName;private String author;private Integer count;private BigDecimal price;private String publish;//1.表示可借阅,2.不可借阅private  Integer status;private  String   statusCN;
}

图书管理系统的列表后端代码

采用list来去暂时存储这个图书管理系统,当然以后会连接数据库,这也就是一个暂时的存储

package com.example.demo.demos.web;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;@RestController
@RequestMapping("/book")
public class BookController {@RequestMapping("/getBookList")public List<BookInfo> getBookList() {//1.获取图书的数据//2.对图书数据进行修改,针对状态码数字(0:有货,1:没货这种)进行改变,把状态码数字转换成中文//3.返回数据List<BookInfo> bookInfos = mockData();for (BookInfo bookInfo : bookInfos) {if (bookInfo.getStatus() == 1) {bookInfo.setStatusCN("可借阅");} else {bookInfo.setStatusCN("不可借阅");}}return bookInfos;}private List<BookInfo> mockData() {List<BookInfo> bookInfos = new ArrayList<>(15);//对于已知数据量,或者大概知道这个集合的数据量时,创建list时,建议指定初始化容量for (int i = 0; i < 15; i++) {BookInfo bookInfo=new BookInfo();bookInfo.setId(i);bookInfo.setBookName("图书"+i);bookInfo.setAuthor("作者"+i);bookInfo.setCount(new Random().nextInt(200));bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));bookInfo.setPublish("出版社"+i);bookInfo.setStatus(i%5==0?2:1);bookInfos.add(bookInfo);}return bookInfos;}
}

 三、分层思想

MVC也是有分层的思想(过时),最后最好是要把代码分层,现在牛逼的思想

三层架构:
1.表现层

接受请求,返回结果

2.业务逻辑层

业务的逻辑处理,主要处理业务相关的逻辑

3.数据层

处理数据,包含数据的存储,获取(增删改查)

Control:接受请求,参数是否合法,结果响应

Service:真正干活部分

Dao:数据部分

然后我们要把上面的代码通过架构的思想,把它给变成架构中有层次的代码

Control->Service->Dao

层次的调用关系

Control

package com.example.demo.demos.book.controller;import com.example.demo.demos.book.BookInfo;
import com.example.demo.demos.book.service.BookService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;@RestController
@RequestMapping("/book")
public class BookController {private BookService bookService=new BookService();@RequestMapping("/getBookList")public List<BookInfo> getBookList() {//1.获取图书的数据//2.对图书数据进行修改,针对状态码数字(0:有货,1:没货这种)进行改变,把状态码数字转换成中文//3.返回数据List<BookInfo>bookInfos=bookService.getBookList();return bookInfos;}}

Dao

package com.example.demo.demos.book.dao;import com.example.demo.demos.book.BookInfo;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class BookDao {public List<BookInfo> mockData() {List<BookInfo> bookInfos = new ArrayList<>(15);//对于已知数据量,或者大概知道这个集合的数据量时,创建list时,建议指定初始化容量for (int i = 0; i < 15; i++) {BookInfo bookInfo=new BookInfo();bookInfo.setId(i);bookInfo.setBookName("图书"+i);bookInfo.setAuthor("作者"+i);bookInfo.setCount(new Random().nextInt(200));bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));bookInfo.setPublish("出版社"+i);bookInfo.setStatus(i%5==0?2:1);bookInfos.add(bookInfo);}return bookInfos;}
}

Service

package com.example.demo.demos.book.service;import com.example.demo.demos.book.BookInfo;
import com.example.demo.demos.book.dao.BookDao;import java.util.List;public class BookService {private BookDao bookDao=new BookDao();public List<BookInfo> getBookList() {List<BookInfo> bookInfos = bookDao.mockData();for (BookInfo bookInfo : bookInfos) {if (bookInfo.getStatus() == 1) {bookInfo.setStatusCN("可借阅");} else {bookInfo.setStatusCN("不可借阅");}}return bookInfos;}
}

这样代码就符合三层架构的思想了

相关文章:

  • Git修改远程仓库名称
  • element中el-table表头通过header-row-style设置样式
  • TCP_报文格式解读
  • esp32-s3部署yolox_nano进行目标检测
  • STM32-SPI 中断
  • 【自用】ASCii 8*16 点阵字模
  • 2023亚太地区五岳杯量子计算挑战赛
  • Vue在Computed计算属性下,获取Promise then的返回值无效为空
  • 限流、熔断、降级、线程池隔离
  • 【数电笔记】11-最小项(逻辑函数的表示方法及其转换)
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • 一篇文章带你详细了解C++智能指针
  • 2023年第十二届数学建模国际赛小美赛C题雪崩防范求解分析
  • Mysql安全之基础合规配置
  • 服务器数据恢复—服务器重装系统导致逻辑卷发生改变的数据恢复案例
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Angular Elements 及其运作原理
  • input的行数自动增减
  • JavaScript HTML DOM
  • java小心机(3)| 浅析finalize()
  • js操作时间(持续更新)
  • js中forEach回调同异步问题
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • ubuntu 下nginx安装 并支持https协议
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • webpack4 一点通
  • 闭包--闭包之tab栏切换(四)
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 和 || 运算
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 坑!为什么View.startAnimation不起作用?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信小程序设置上一页数据
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 怎么将电脑中的声音录制成WAV格式
  • raise 与 raise ... from 的区别
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #pragma 指令
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)网络优化与超参数选择--九五小庞
  • (转)大道至简,职场上做人做事做管理
  • (转)大型网站的系统架构
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET面试题(二)
  • .NET中使用Redis (二)
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [20170705]diff比较执行结果的内容.txt
  • [20171106]配置客户端连接注意.txt
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [Codeforces1137D]Cooperative Game