Spring MVC 应⽤分层

什么是应用分层

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

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

表现层:就是展⽰数据结果和接受⽤⼾指令的,是最靠近⽤⼾的⼀层;

业务逻辑层:负责处理业务逻辑, ⾥⾯有复杂业务的具体实现;

数据层:负责存储和管理与应⽤程序相关的数据

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

图书管理系统

登录:⽤⼾输⼊账号,密码完成登录功能

列表展⽰:展⽰图书

服务器代码

创建图书类

java 复制代码
package com.example.book;

import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

@Data
public class BookInfo {
    //图书 ID
    private 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类 验证登录接口

java 复制代码
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;
   }
}

获取图书列表

java 复制代码
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)数据访问:负责数据的操作增删查改等

java 复制代码
public List<BookInfo> getList()

数据访问

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

逻辑处理

java 复制代码
 return books;

请求数据和响应

我们把上面的代码分为上诉的三个部分

然后上面三个部分之中我们可以在Spring实现

Controller:控制层

Service:业务逻辑层

Dao:数据访问层

代码重构

我们先创建对应包路径

代码拆分

控制层

java 复制代码
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;

    }
}

业务逻辑层

java 复制代码
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;
    }

}

数据访问层

java 复制代码
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;
    }
}
相关推荐
徐*红18 分钟前
java 线程池
java·开发语言
尚学教辅学习资料19 分钟前
基于SSM的养老院管理系统+LW示例参考
java·开发语言·java毕设·养老院
2401_8576363919 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
1 9 J21 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
Code apprenticeship21 分钟前
Java面试题(2)
java·开发语言
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
霖雨3 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404193 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言