以下内容参考了《精通Java Web整合开发(JSP+Ajax+Struts+Hibernate)》和《自己动手写Struts——构建基于MVC的Web开发框架》里面的内容。
概述
MVC模式,即模型-视图-控制器(MVC,Model-View-Control)是一种交互界面的结构组织模型。
模型(Model),代表的是应用的业务逻辑,包含应用程序的核心功能,它表示企业数据和业务规则。模型封装了应用程序的状态。在MVC模式中,模型要处理的任务很多,为了能使一个模型能给多个视图提供数据,那么要让模型与数据格式无关。
视图(View),应用的视图层,提供模型的表示。它是应用程序的界面,是用户能看到并与之交互的界面。在视图层中,没有发生真正的处理。视图层只是展示由模型提供数据的一种方式,因此,视图只能访问模型的读方法,而不能访问模型的写方法。视图对控制器一无所知,当改变模型时,视图应得到通知。
控制器(Control),提供应用的处理过程控制,控制器对用户的输入做出反应,它创建并设置模型。控制器相当于一个中转站,它本身不处理和输出任何数据。控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后确定用哪个视图来显示模型处理返回的数据,从而把响应结果送回到客户端。
MVC模式的结构
用户提交的请求导致控制器改变模型或视图,或者同时改变模型或视图。一旦控制器改变了模型的数据,就会通知所有依赖的视图进行自动更新;从另一方面讲,只要控制器选择了相应的视图,视图就会从模型中获取数据来进行刷新。
MVC模式的设计思想
MVC模式的设计思想就是:把原来开发人员针对一个系统的输入、输出、处理流程编程的方式改变为按照模型层、视图层、控制层进行分解,从而使得整个系统责任明确、接口清晰,加快了开发流程。
1、 模型层
模型就是业务流程、状态处理及业务规则的制定。模型一般有两类:业务逻辑模型和数据模型。模型接受视图请求的数据,并返回最终的处理结果。业务流程的处理过程对另外两个层(View和Control)来说是封闭的。在MVC模式中,我们要把应用模型按一定的规则抽取出来,抽取的层次是关键,这也是判断开发人员是否优秀的依据。数据模型主要指实体对象的数据保存,即持久化。数据模型实现了对视图和模型之间交互的支持。实现把“做什么(业务处理)”和“怎么做(业务实体)”分离,这样就可以实现业务逻辑的重用。业务模型的设计是MVC最主要的核心部分。
2、 视图层
视图就是客户和系统进行交互的界面,作为视图来讲,它只是展示由模型提供的数据的一种方式。它可以是一个HTML页面或者是其它的方式等等。
在MVC设计模式中,视图仅限于处理视图上数据的采集和处理,以及用户的请求,不包括视图上业务流程的处理,业务流程的处理和状态的改变交给模型层处理。
3、 控制层
控制层就像一个中转站,它接受用户请求,并根据用户请求将模型与视图匹配在一起,共同完成用户的请求。控制层不做任何的数据处理,它就是一个分发器,选择什么样的模型以及视图,就可以完成什么样的用户请求。为了能够控制和协调每个用户跨越多个请求的处理,控制机制应该以集中的方式进行管理。用户提交一个表单或者点击一个链接,控制层在接受请求后,它本身并不处理业务信息,而是根据用户的请求类型,把用户的信息传递给相对应的模型,告诉模型做什么,等模型处理完毕后,再把模型处理后的数据选择符合要求的视图返回给用户。这样,一个模型就可能对应多个视图,一个视图可能对应多个模型。这样的话,我们可能会在控制层进行一些简单的数据转换等操作。
模型、视图与控制器之间的分工协作关系如下:
关系图说明如下:
模块名称 | 分工 | 协作 |
模型M | 1、抽象系统应用的功能 2、封装系统的状态 3、提供使用系统功能的方法和路径 4、管理数据的存储和一致性 5、当数据发生变化时通知相关组件 | 1、当系统状态改变时通知视图 2、响应视图的状态查询 3、提供对控制器的操作途径 |
视图V | 1、抽象数据表示 2、表示针对用户的数据 3、维护与模型的数据一致性 | 1、显示模型的数据 2、接收模型的数据更新通知更新视图 3、接受用户输入的数据传给控制器 |
控制C | 1、抽象用户和系统的时间的语意映射 2、把用户输入映射到系统事件 3、根据用户输入和上下文情况选择合适的显示数据 | 1、接收用户请求 2、调用某个模型处理用户请求 3、 将处理结果送给某个视图进行显示 |
总结MVC的处理过程如下:
首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型的数据,并通过视图层展示给用户。
基于MVC的Web框架
一般情况下,实现一个基于MVC的Web框架示意图如下: