escapar CodingDaydreaming
Web应用一把梭:结构(简介)
MVC, 三层结构, Web, Java, Spring Boot
## Disclaimer 这个系列的文章是**结果导向**的,不盲目地追求最佳实践、不一味地追求开发速度,更不求用上最新最酷的技术,旨在用清晰易懂的语言介绍一种**我最顺手的**开发方式。有些结论下得比较武断,但**条件和例外加得太多就不易理解了**,请非目标读者的大佬们理解。 本文面向有Java基础的学生(例如上过“面向对象”课程的在校生),介绍一下工程里最常见的一些概念。 ## 框架和工具 MySQL + Spring Data JPA Spring Boot Redis(二期) AngularJS + Angular Material(二期) ## 结构 ### MVC 是Model-View-Controller的简写。 拿一张动态生成的网页(比如成绩查询的页面)举例,表达和存储源数据的部分是Model,用户眼前浏览器渲染出的内容是View,而Controller就是把Model转化成View的一系列代码。 ### B/S结构 必须打开浏览器访问和操作的应用都是B/S结构的。 B就是Browser,S就是Server,这个名词是针对早年风行的C/S结构而言的,当时客户端的都是exe之类的桌面程序。 ### 浏览器端 俗称前端,在Web 1.0的年代里,还没有这个专业岗位。直到现在,将浏览器端和服务器端的业务逻辑完全隔离,仍然是相对新派的做法,在一期的文章里,暂不涉及前端框架,而是将它直接归于服务端的表现层。 ### 服务端的三层结构 知道这个术语对面试有很大帮助,尽管它有些教条。三层结构是堆栈型的,自下而上是数据访问层、业务逻辑层、数据表示层。为了便于理解,请想象还有一个横跨三层的基础设施截面,框架就在这个截面里工作。 #### 数据访问层 Repository - Domain 数据访问层是三层结构中相对底层的,底层是指远离用户。 Domain又称领域,在最常见的情况下,Domain是Java对象、是对数据库表结构的映射,且一张表对应一个Domain。 Java对象和数据库表映射的方式由用户指定,映射操作一般由ORM库完成。 Repository是上层获取特定条件的Domain数据的工具,上层不应直接和数据库互动,因此和数据库相关的操作都写在Repository里。 #### 业务逻辑层 Service Service 是填写业务逻辑的地方。它接收从上层传来的用户输入数据、并依此对Repository发出存取指令。有时,程序自发的定时任务也会定义在这一层。所以它和轨交枢纽一样,往往是最臃肿和繁忙的一层。 Service 是单例的,单例是指,在整个程序的生命周期中,最多只有一个同类的Service实例。 #### 数据表示层 Interface Interface 是和用户连接最紧密的一层。 根据当前的习惯来说,Interface的展现方式有两类,一类直接输出HTML,另一类输出其它数据(通常是JSON,JSON是一种流行的纯文本数据格式)。 直接输出HTML也叫后端渲染。 服务端输出JSON的方式经常被用在AJAX请求中,整个服务端输出其它数据的方式叫前后端解耦,一期文章暂不介绍。 #### 横截面 Infrastructure AOP、Caching、生命周期管理、权限等和框架有关的功能可以归在此处。 ## 微观视角 以自下而上为例。 某些 Domain Object 数据自 Repository 中被(从数据库中,并经过ORM的映射)取出。 在 Service 中经过一系列业务逻辑的变换。 在 Interface 中被进一步成Data Transfer Object(DTO),并渲染到页面上或被输出成JSON。 DTO是为了保证展现用对象的逻辑和持久用的对象彻底隔离,以保障程序的性能和安全。