楼仔
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 的计算结果向用户提供相应响应。它使视图与模型分离。

流程步骤:
-
用户通过View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等; -
服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的Model,对用户请求进行处理Model 处理; -
将处理结果再交给 Controller(控制器其实只是起到了承上启下的作用); -
根据处理结果找到要作为向客户端发回的响应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 端的后端接口。
技术派项目的分层结构讲完了,如果还有什么问题,可以在技术派知识星球,给我们提问哈。
作者介绍