楼仔

V2

2023/02/21阅读:40主题:橙心

项目 MVC 分层结构

这篇文章会先讲解三层架构以及 MVC,然后再给大家讲述技术派项目的代码框架。

通过这篇文章,不仅让你掌握代码的分层结构,更重要是让你对技术派项目的整体代码结构有一个整体认知,以及它的设计理念。

基础知识

什么是三层架构 ?

三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构。

  • 表示层(UI):位于三层构架的最上层,与用户直接接触,表示层就是实现用户的界面功能,也是系统数据的输入与输出,是为用户传达和反馈信息的。
  • 业务逻辑层(BLL):是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理。同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达。
  • 数据访问层(DAL):有时候也称为是持久层,主要功能是对原始数据(数据库或者文本文件等存放数据的形式)的操作(实现数据的增加、删除、修改、查询等)。具体为业务逻辑层或表示层提供数据服务。

在三层架构程序设计中,采用面向接口编程。各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体。

层是一种弱耦合结构,层与层之间的依赖是向下的,上层对下层的调用,是通过接口实现的,而真正提供服务的是下层的接口实现类。服务标准接口是相同的,而实现类是可以替换的,这样就实现了层与层间的解耦。

什么是 MVC 架构 ?

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

  • 视图(view): 为用户提供使用界面,与用户直接进行交互。
  • 模型(model): 代表一个存取数据的对象或 JAVA POJO(Plain Old Java Object,简单java对象)。它也可以带有逻辑,主要用于承载数据,并对用户提交请求进行计算的模块。模型分为两类,一类称为数据承载 Bean,一类称为业务处理Bean。所谓数据承载 Bean 是指实体类(如:User类),专门为用户承载业务数据的;而业务处理 Bean 则是指Service 或 Dao 对象, 专门用于处理用户提交请求的。
  • 控制器(controller): 用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。它使视图与模型分离。

流程步骤:

  1. 用户通过View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等;
  2. 服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的Model,对用户请求进行处理Model 处理;
  3. 将处理结果再交给 Controller(控制器其实只是起到了承上启下的作用);
  4. 根据处理结果找到要作为向客户端发回的响应View 页面,页面经渲染后发送给客户端。

三层架构与 MVC 的区别

无论是MVC架构还是三层架构,都是一种规范,都是奔着"高耦合,低内聚"的思想来设计的。

MVC 架构主要是为了解决应用程序用户界面的样式替换问题,把视图层尽可能的和业务代码分离。

而三层架构是从整个应用程序架构的角度来分层的。当然,如果有需要的话,还可以分层。在三层架构中业务逻辑层和数据访问层要遵循面向接口编程。

技术派项目分层结构

敲重点,这个树状图就是技术派所有的目录(我把前端的内容删掉了,大家只需关注后端),大家看技术派代码前,需要先看一下这个目录结构,让大家对整个代码框架有一个全局的认识,方便大家后续更好去看代码。

每个目录我都给了备注,一目了然。

├── paicoding-api
│   └── src
│       └── main
│           └── java
│               └── com
│                   └── github
│                       └── paicoding
│                           └── forum
│                               └── api
│                                   └── model
│                                       ├── context // 请求上下文
│                                       ├── entity // 通用实体
│                                       ├── enums // 枚举值
│                                       ├── exception // 异常类
│                                       └── vo // 返回值
├── paicoding-core
│   └── src
│       └── main
│           ├── java
│           │   └── com
│           │       └── github
│           │           └── paicoding
│           │               └── forum
│           │                   └── core
│           │                       ├── cache // 缓存
│           │                       ├── common // 通用常量
│           │                       ├── config // 配置文件
│           │                       ├── permission // 权限
│           │                       ├── region // 区域信息
│           │                       └── util // 通用方法
│           └── resources
│               └── META-INF
├── paicoding-service // 后端核心逻辑
│   └── src
│       └── main
│           ├── java
│           │   └── com
│           │       └── github
│           │           └── paicoding
│           │               └── forum
│           │                   └── service
│           │                       ├── article // 文章
│           │                       │   ├── conveter // 类型转换
│           │                       │   ├── repository // 厂库
│           │                       │   │   ├── dao // DAO层,DB操作类
│           │                       │   │   ├── entity // 实体
│           │                       │   │   └── mapper // mapper
│           │                       │   └── service // 基于DAO上层封装,对标Service层
│           │                       │       └── impl
│           │                       ├── comment // 评论
│           │                       │   ├── converter
│           │                       │   ├── repository
│           │                       │   │   ├── dao
│           │                       │   │   ├── entity
│           │                       │   │   └── mapper
│           │                       │   └── service
│           │                       │       └── impl
│           │                       ├── config // 配置
│           │                       │   ├── converter
│           │                       │   ├── repository
│           │                       │   │   ├── dao
│           │                       │   │   ├── entity
│           │                       │   │   └── mapper
│           │                       │   └── service
│           │                       │       └── impl
│           │                       ├── image // 图片
│           │                       │   ├── oss
│           │                       │   │   └── impl
│           │                       │   └── service
│           │                       ├── notify // 消息通知
│           │                       │   ├── repository
│           │                       │   │   ├── dao
│           │                       │   │   ├── entity
│           │                       │   │   └── mapper
│           │                       │   └── service
│           │                       │       └── impl
│           │                       ├── sidebar // 侧边栏
│           │                       │   └── service
│           │                       ├── sitemap // 站点
│           │                       │   ├── model
│           │                       │   └── service
│           │                       ├── statistics // 数据统计
│           │                       │   ├── repository
│           │                       │   │   ├── dao
│           │                       │   │   ├── entity
│           │                       │   │   └── mapper
│           │                       │   └── service
│           │                       │       └── impl
│           │                       └── user // 用户
│           │                           ├── converter
│           │                           ├── repository
│           │                           │   ├── dao
│           │                           │   ├── entity
│           │                           │   └── mapper
│           │                           └── service
│           │                               ├── count
│           │                               ├── help
│           │                               ├── relation
│           │                               ├── user
│           │                               └── userfoot
│           └── resources
│               ├── META-INF
│               └── mapper
├── paicoding-ui // view层,PC 界面
└── paicoding-web // Controller层,界面与后端交互逻辑
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── github
        │   │           └── paicoding
        │   │               └── forum
        │   │                   └── web 
        │   │                       ├── admin // 运营后台接口 
        │   │                       │   └── rest
        │   │                       ├── common // 通用接口
        │   │                       ├── component // 组建接口
        │   │                       ├── config // 配置接口
        │   │                       │   └── init
        │   │                       ├── error // 异常接口
        │   │                       ├── front // 前端界面接口
        │   │                       │   ├── article // 文章
        │   │                       │   │   ├── rest // api接口
        │   │                       │   │   ├── view // 页面嵌入接口
        │   │                       │   │   └── vo // 返回值
        │   │                       │   ├── comment // 评论
        │   │                       │   │   └── rest
        │   │                       │   ├── home
        │   │                       │   │   ├── helper
        │   │                       │   │   └── vo
        │   │                       │   ├── image
        │   │                       │   │   ├── rest
        │   │                       │   │   └── vo
        │   │                       │   ├── login
        │   │                       │   │   ├── rest
        │   │                       │   │   ├── view
        │   │                       │   │   └── vo
        │   │                       │   ├── notice
        │   │                       │   │   ├── rest
        │   │                       │   │   ├── view
        │   │                       │   │   └── vo
        │   │                       │   ├── search
        │   │                       │   │   ├── rest
        │   │                       │   │   ├── view
        │   │                       │   │   └── vo
        │   │                       │   └── user
        │   │                       │       ├── rest
        │   │                       │       ├── view
        │   │                       │       └── vo
        │   │                       ├── global // 全局接口
        │   │                       │   └── vo
        │   │                       └── hook // 勾子,框架方法
        │   │                           ├── filter // 处理请求
        │   │                           └── interceptor // 注入全局的配置信息
        │   ├── resources // 资源信息
        │   │   ├── data
        │   │   └── liquibase // 初始化DB数据
        │   │       ├── changelog // DB变更
        │   │       └── data // DB数据
        │   └── resources-env // 环境配置
        │       ├── dev // 本地环境
        │       ├── pre // 预上线环境(目前不用)
        │       ├── prod // 线上配置
        │       └── test // 测试环境
        └── test // 测试用例

目录看完了, 我们再结合文章开头的基础知识,给大家再讲讲 MVC 和三层结构,理论和实际结合起来。

从 MVC 分层结构来看,分别如下:

  • 视图(view): paicoding-ui,PC 界面
  • 模型(model):paicoding-service,后端核心逻辑
  • 控制器(controller):paicoding-web,界面与后端交互逻辑

从三层结构来看,分别如下:

  • 表示层(UI):paicoding-web,将后端数据吐出来
  • 业务逻辑层(BLL):在 paicoding-service 里面,以 com/github/paicoding/forum/service/article 目录为例,service 就是业务逻辑层,对 DAO 层的封装;
  • 数据访问层(DAL):在 paicoding-service 里面,以 com/github/paicoding/forum/service/article 目录为例,repository 就是 DAL 层,也称为 DAO 层,负责和 DB 的交互。

结语

所以大家去 Debug 代码时,代码的入口就在 MVC 的 Controller 层,也就是 paicoding-web,其中 paicoding/forum/web/admin 是后台,其它的就是 PC 端的后端接口。

技术派项目的分层结构讲完了,如果还有什么问题,可以在技术派知识星球,给我们提问哈。

分类:

后端

标签:

后端

作者介绍

楼仔
V2