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;
    }
}
相关推荐
技术无疆14 分钟前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
架构文摘JGWZ3 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
拾光师4 小时前
spring获取当前request
java·后端·spring
aPurpleBerry4 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏4 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
xujinwei_gingko4 小时前
Spring IOC容器Bean对象管理-Java Config方式
java·spring
2301_789985944 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
IT学长编程4 小时前
计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·毕业设计·springboot·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·教师科研管理系统
m0_571957584 小时前
Java | Leetcode Java题解之第406题根据身高重建队列
java·leetcode·题解
程序猿小D5 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa