什么是应用分层
引用分层是一种软件开发思想 将应用程序分为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;}
}