Spring MVC 应⽤分层

什么是应用分层
引用分层是一种软件开发思想 将应用程序分为N个层次每个层次负责各个职责 其中MVC是常见的设计模式这就是应用分层的具体体现

目前主流的开发方式是前后段分离后端开发工程师不再需要关注前端的实现,对此就需要分为表现层,数据层,业务逻辑层

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

下面通过一个项目来实现应用分成代码重构

图书管理系统

登录:⽤⼾输⼊账号,密码完成登录功能
列表展⽰:展⽰图书

服务器代码
创建图书类

package com.example.book;import lombok.Data;import java.math.BigDecimal;
import java.util.Date;@Data
public class BookInfo {//图书 IDprivate Integer id;//书名private String bookName;//作者private String author;//数量private Integer count;//定价private BigDecimal price;//出版社private String publish;//状态0-无效1-允许借阅private Integer status;private String statusCN;//创建时间private Date createTime;//更新时间private Date updateTime;}

创建UserController类 验证登录接口

package com.example.book.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 name, String password, HttpSession session){//账号或密码为空if(!StringUtils.hasLength(name) || !StringUtils.hasLength(password)){return false;}//模拟验证数据账号密码正确if("admin".equals(name) && "admin".equals(password)){session.setAttribute("username",name);return true;}//账号密码错误return false;}
}

获取图书列表

package com.example.book.demos.web;import com.example.book.BookInfo;
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;@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;}//获取图书信息private 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)逻辑处理:负责逻辑处理的代码
(3)数据访问:负责数据的操作增删查改等
在这里插入图片描述

public List<BookInfo> getList()

数据访问

 List<BookInfo> books = mockData();//处理页面展示for(BookInfo book : books){if(book.getStatus() == 1){book.setStatusCN("可借阅");}else {book.setStatusCN("不可借阅");}}

逻辑处理

 return books;

请求数据和响应
我们把上面的代码分为上诉的三个部分
然后上面三个部分之中我们可以在Spring实现
Controller:控制层
Service:业务逻辑层
Dao:数据访问层

代码重构
我们先创建对应包路径

在这里插入图片描述
代码拆分
控制层

package com.example.book.demos.web.controller;import com.example.book.model.BookInfo;
import com.example.book.service.BookService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RequestMapping("/book")
@RestController
public class BookController {@RequestMapping("/getList")public List<BookInfo> getList(){BookService bookService = new BookService();List<BookInfo> books = bookService.getBookList();return books;}
}

业务逻辑层

package com.example.book.service;import com.example.book.dao.BookDao;
import com.example.book.model.BookInfo;import java.util.List;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;}}

数据访问层

package com.example.book.dao;import com.example.book.model.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> 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;}
}

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

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

相关文章

FPGA DMA IP核使用指南

摘要 本文旨在介绍FPGA中DMA(Direct Memory Access)IP核的使用,包括其基本框架、测试代码编写以及仿真波形的分析。DMA是一种允许外围设备直接与内存进行数据交换的技术,无需CPU的介入,从而提高了数据传输的效率。 1. 引言 在现代FPGA设计中,DMA IP核因其…

Day15—图像爬虫与简单处理

图像爬虫是一种专门用于从互联网上下载图像的网络爬虫。除了文本内容,图像也是网站中的重要组成部分,它们可以用于多种目的,如图像识别、内容分析、数据备份等。 环境准备 首先,确保你的环境中已安装Python和必要的库。如果没有安装Pillow库,可以通过以下命令安装:pip in…

Leetcode刷题笔记6

34. 在排序数组中查找元素的第一个和最后一个位置 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;暴力查找 [1, 2, 3, 3, 3, 4, 5] t 3 从前往后扫描暴力查找&#xff0c;最坏情况下O(N) 优化 利用数组有序的…

【LLM多模态】综述Visual Instruction Tuning towards General-Purpose Multimodal Model

note 文章目录 note论文1. 论文试图解决什么问题2. 这是否是一个新的问题3. 这篇文章要验证一个什么科学假设4. 有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f;5. 论文中提到的解决方案之关键是什么&#xff1f;6. 论文中的…

随想录 Day45 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

随想录 Day45 1049. 最后一块石头的重量 II 494. 目标和 474.一和零 1049. 最后一块石头的重量 II 题目链接 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起…

带你学习Mybatis之Mybatis全局配置文件

Mybatis全局配置文件 <?xml version"1.0" encoding"UTF-8"?><configuration> <!-- 配置 --> <properties/> <!-- 属性 --> <settings/> <!-- 设置 --> <typeAliases/> <!-- 类型别名 -->…

车载以太网的未来:OPEN Alliance下17个技术委员会的最新进展与行业影响(下)

从上篇介绍来看&#xff0c;TC1-TC8大多数处于暂停或完成状态。而TC9-TC17在2023年都有不同程度的进展&#xff0c;让我们继续探索藏在其中的车载以太网的发展和挑战。 TC9 Automotive Ethernet Channel & Components&#xff08;in progress&#xff09; TC9的目标是为通…

[初始计算机]——计算机网络的基本概念和发展史及OSI参考模型

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;网络通信基础TCP/IP专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月30日11点59分 &#x1f004;️文章质量&#xff1a;96分 ​ 目录 &#x1f310;计算机网络概述 &#x1f4af;…

opencv是什么?它有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

1.opencv是什么&#xff1f; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;旨在提供一系列丰富的图像处理和计算机视觉算法&#xff0c;以及用于构建实时图像处理和机器视觉应用程序的开发工具。它最初由英特尔开发…

使用QT可视化操作信号与槽函数详解

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、QT信号与槽机制概述 三、实际操作步骤 四、案例演示 五、总结 一、引言 在…

中国养生保健元宇宙-探索养生保健新领域

在全球化和科技迅速发展的今天&#xff0c;元宇宙作为一种全新的互联网应用和社会形态&#xff0c;正逐步渗透到人们生活的各个方面。特别是在养生保健领域&#xff0c;中国的元宇宙概念正在引领一场革命&#xff0c;将古老的养生智慧与现代科技完美融合&#xff0c;为人们打造…

单片机建立自己的库文件(1)

文章目录 前言一、代码模块化是什么&#xff1f;二、使用步骤1.以LCD1602作为例子2.将LCD1602 相关的代码抽取到另外一个文件中 三、调用LCD1602.h1.新建一个工程项目&#xff0c;将LCD1602.h添加到工程中2.在主函数上加入 #include <LCD1602.h> 总结 前言 提示&#xf…

进口铝合金电动隔膜泵

进口铝合金电动隔膜泵是一种高效、可靠的工业泵&#xff0c;其特点、性能与应用广泛&#xff0c;以下是对其的详细分析&#xff1a; 特点 材质与结构&#xff1a; 采用铝合金材料制造&#xff0c;具有良好的耐腐蚀性和轻量化特点。铝合金材质使得泵体结构紧凑、轻便&#xff…

svg实现一个圆形以及方形的环形进度条

1. svg实现圆形进度条 效果图&#xff1a; 1. 写个假接口&#xff1a; let res {curLegendList: [{ progress: "87", name: "进度1",color:"#00fe41" },{ progress: "66", name: "进度2" ,color:"orange"},{ p…

gitlab服务器迁移(亲测有效)

描述&#xff1a;最近公司迁移gitlab&#xff0c;我没有迁移过&#xff0c;经过网上查找资料最终完成迁移&#xff0c;途中也遇到挺多坑和两个问题&#xff0c;希望能帮到你。 新服务器安装gitlab 注意&#xff1a;新服务器gitlab版本也需要和旧版本一致。 首先查看原Gitlab…

基于Python实现地震数据可视化的设计与实现

基于Python实现地震数据可视化的设计与实现 “Design and Implementation of Earthquake Data Visualization using Python” 完整下载链接:基于Python实现地震数据可视化的设计与实现 文章目录 基于Python实现地震数据可视化的设计与实现摘要第一章 引言1.1 研究背景1.2 研究…

RabbitMQ(三)SpringBoot整合,可靠性投递,死信队列,延迟队列,消费端限流,消息超时

文章目录 整合Springboot概述消费者生产者 消息可靠性投递故障原因解决方案生产者端消息确认机制&#xff08;故障情况1&#xff09;故障情况2解决方案故障情况3解决方案 消费端限流概念 消息超时概念队列层面&#xff1a;配置队列过期消息本身&#xff1a;配置消息过期 死信队…

C++中的虚函数和纯虚函数

目录 摘要 虚函数&#xff08;Virtual Functions&#xff09; 定义 用法 纯虚函数&#xff08;Pure Virtual Functions&#xff09; 定义 用法 需要避开的坑 总结 摘要 在C中&#xff0c;我们经常会在开发中使用到虚函数&#xff08;Virtual Functions&#xff09;和…

如何有效屏蔽手机上的骚扰电话20240530

如何有效屏蔽手机上的骚扰电话 引言 最近&#xff0c;我的手机经常接到954开头的7位数字座机电话&#xff0c;这些骚扰电话让我非常困扰。由于我经常点外卖&#xff0c;无法屏蔽所有陌生号码&#xff0c;因此需要一个既能屏蔽特定前缀的骚扰电话&#xff0c;又不影响日常生活…

英伟达(NVIDIA)H100性能及应用场景

英伟达H100是一款性能强大的GPU芯片&#xff0c;其关键性能参数和应用领域可以归纳如下&#xff1a; 一、性能参数 架构&#xff1a;H100采用了新一代的Hopper架构&#xff0c;拥有高达1.8万亿次/秒的张量处理能力和高达840 TFLOPS的FP8张量性能。CUDA核心数&#xff1a;H100…