1.MVC和三层架构之间的关系

MVC: model —- view —- Controller

三层架构:展示层,应用层,数据访问层

  1. MVC只是三层架构中的展现层,M是数据模型,是包含数据的对象,通常我们使用springMVC中有个一个包叫做model,里面的类就是用来和V--view视图页面进行交互的,C就是controller控制器,接受请求,调用模型层和数据库交互得到数据,将数据返回给视图,负责整体的接受数据和逻辑处理,处理HTTP请求的必须经过的中介。

1.1 Model的职责

  1. 数据、行为、方法是Model的主要内容;
  2. 实际工作中,Model是MVC中代码量最大,逻辑最复杂的地方,因为关于应用的业务逻辑也要在这里表示;
  3. 注意与Controller区分开。Model是处理业务方面的逻辑,Controller只是简单的协调Model和View之间的关系。Controller 和套套一样,应该越薄越好。只要是与业务有关的,就该放在Model里面。好的设计,应该是胖Model,瘦Controller。

2.1 三层架构以及领域模型中的四种实体类 - 图1

1.2 View的职责

  1. 一切与显示界面无关的东西,都不应该出现在view里面。**View只从Model中获取数据**

1.3 Controller的职责

对于Controller,主要是响应用户请求:决定使用什么视图、需要准备什么数据用来显示。
以下是有关Controller的设计原则:

  1. 用于处理用户请求,因此,对于request的访问代码应该放在Controller里面,比如doGET、doPOST等。但仅限于获取用户请求数据,不应该对数据有任何操作或预处理,这应该放在model里面。
  2. 调用model类的方法,对model进行写操作。调用视图渲染函数,形成对用户request的response。
  3. 一般不要有html代码等其他表现层的东西,这应该是属于view的内容。

当用户通过浏览器发送请求到视图层(view)时,控制层(controller)分发调用模型层(model),进行数据库查询,接下来模型层(model)再将数据库查询到的数据返回给控制层(controller),控制层(controller)再将其返回给视图层(view),view层通过web页面把数据信息显示给用户。

以前,很多人认为可以直接在Controller层就调用model层来进行数据库的交互。但是这是不严谨的,耦合性太强,违背了MVC的初衷,即解耦。所以随着MVC学习的深入,慢慢地又加入到了业务层Service和数据访问层Dao:

D(Dao)数据访问对象——与数据库建立连接,封装了对数据库的CURD操作
S(Service)业务逻辑模型——做一些业务逻辑地处理,并给Controller返回结果
V(View)视图——是展示给用户的最终页面。视图负责将数据以用户友好的形式展现出来,负责收集展示数据。
C(Controller)控制器——接收用户传递过来的数据,将数据封装到实体类中,调用业务逻辑模型,进行业务逻辑的处理,根据业务逻辑模型返回的结果,进行不同的视图跳转。

2.领域模型中四种实体类

VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
PO(PersistentObject):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

  • 用户发出请求(可能是填写表单),表单的数据在展示层被匹配为VO。
  • 展示层把VO转换为服务层对应方法所要求的DTO,传送给服务层。
  • 服务层首先根据DTO的数据构造(或重建)一个DO,调用DO的业务方法完成具体业务。
  • 服务层把DO转换为持久层对应的PO(可以使用ORM工具,也可以不用),调用持久层的持久化方法,把PO传递给它,完成持久化操作。