MVC是一种软件设计模式,最初是为SMALLTALK-80语言提出来的,但后来在JSP开发中渐渐得到广泛应用,并且成为Sun公司推荐的J2EE平台的设计模式。Sun公司提出的Model2开发模型就是基于MVC设计模式的应用,在Web应用程序开发中,MVC框架应用非常广泛,特别适合应用在大型的、比较复杂的项目开发中。
MVC框架即是模型-视图-控制器(Model-View-Controller)设计模式。其中,M代表Model,V代表View,C代表Controller。MVC的核心思想是将来一个应用程序的数据业务处理功能(模型)、表示功能(视图)和控制功能(控制层)在3个不同的部分上分别实现。MVC的目的是增加代码的复用性,减少数据描述和应用操作的可耦合度,并提高代码的可读性。同时,也可以使软件的可维护性、可扩展性、可修复性、灵活性以及封装性大大提高。
模型:模型是应用程序的业务处理层,负责所有业务流程的处理和业务规则的制定。模型处理由控制器转发来的视图的请求数据,并将最终的处理结果返回给视图。
视图:视图是应用程序的表示层,代表用户交互界面。在Web应用中,交互界面可能是HTML界面,也有可能是XML界面、Applet界面或其他界面。一个应用甚至可以对应多个视图。MVC对视图的操作包括对视图上数据的采集和处理,以及对用户的请求处理,但并不负责对视图上的业务流程的处理。
控制器:控制器的作用实际上就是一个分发器。负责决定将请求数据转发给什么样的模型组件,以及决定选择什么样的视图来显示模型返回的数据。同视图一样,控制器本身也不处理任何业务信息。
基于MVC的应用程序对某个用户请求时的处理过程如下:
1. 终端用户通过该应用程序发出了一个请求,该请求被转发给Controller(控制器)。
2. 控制器收到该请求后,会检查该请求,然后决定使用什么业务逻辑来处理该请求,这时控制器会将该请求转发给一个相应的业务组件去处理。
3. 模型中包含处理该用户请求的所有业务组件,并且也执行用户所需要的全部数据存取。代表终端用户查询检索出的任何数据都被打包返回给控制器。
4. 控制器接收从模型返回的数据,并选择显示这些数据的相应的视图,并将视图返回给用户。
MVC的优点:
1. 有利于程序的维护和功能的扩展。在MVC框架中,3个层在功能和结构上是相互独立的,每个层负责实现各自的功能。如果某个层的需求发生了变化,则只需要更改相应层中的代码即可,而不会影响到其他层中的代码。
2. 有利于开发中的分工。在MVC框架中,由于把应用程序划分成了3个层,可以很好地实现开发中的分工。网页制作人员可以开发视图层,熟悉业务的人员可以去开发业务层,其他的人员可以开发控制层。
3. 有利于组件的重用。MVC框架的分层开发模式,有利于组件的重用。如控制层可以成为一个独立的组件,表示层可以做成一个通用的界面,而业务处理层也可以成为一个独立的功能模块,从而可以把这些组件应用到其他的项目开发中。
MVC的缺点:
1. 与设计模式的缺点相同,增加了工程解决方案的复杂性,在提高中大型项目开发效率的同时降低了小项目的开发效率,处理流程复杂造成了性能的下降。
2. 没有解决如何提供Rich Client的问题,仍然需要大量的开发。提供Rich Client无法避开JavaScript,传统的MVC框架几乎从来没有把JavaScript列入考虑范围。简单地忽视JavaScript对于提高页面的表现能力没有任何帮助,复杂的JavaScript的开发工作还是由程序员来承担。
3. MVC中View的开发仍然采用基于form的请求/响应模式,因此仍然具有这一模式的所有缺点。MVC不可能解决表示层的所有问题,只解决了表示层一部分重要问题。MVC除了对开发人员有意义外,并没有给最终用户带来很多商业价值,最终用户关心的是软件的外在质量,而不是程序员所关心的内在质量。
MVC还是一个非常优秀的软件设计模式,不然Sun也不会把它推荐为J2EE的设计模式,而且还风靡了那么多年。任何设计模式都有其固有的局限性,没有哪一种方法可以解决所有问题的。所以说,MVC本身没有缺点,只是不同的理解和不同的实现带了的不同的问题。作为开发者的我们,就是要不断的追求完美来弥补实现带来的缺点。IBM/360 之父布鲁克斯(Frederick Phillips Brooks, Jr.)说过:“我认为学习编程的最困难部分,是将做事的方式往追求完美的方向调整。”Java Web有很多基于MVC框架,比如人人知晓的Struts,后劲猛起的Spring MVC,还有WebWork、Turbine、Maverick框架。