什么是應用分層
引用分層是一種軟件開發思想 將應用程序分為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;}
}