mvc模式和架构,MVC架构模式分离表示层和模型层耦合关系
1、MVC体系架构设计模式是用来帮助系统设计人员控制"变化"的一种设计模式
MVC体系架构设计模式是上世纪80年代在Smalltalk-80中出现的一种软件设计模式,
尽管它源于桌面程序(Desktop),但现在也被广泛地应用于B/S模式的Web应用程序开发中。
但如果希望传统的MVC模式能够继续应用于B/S模式的Web应用程序开发中,需要进行完善和扩展,从而产生出Web MVC模式的概念。因此,本文中所涉及的MVC更准确地定义应该称为Web MVC——在B/S模式的Web应用程序设计和开发中应用MVC架构模式。
(1)MVC架构体系设计中的三个元素——模型、视图和控制器
基于MVC架构体系设计的软件应用系统可以分解为模型、视图和控制器三个组成部分,它们分别对应于应用系统中的业务逻辑和数据、用户界面、用户请求处理和数据同步等功能实现。
1)模型(Model)是软件应用系统程序的主体部分,它表示软件应用系统中的业务数据或者业务逻辑。在J2EE系统平台中的"模型"可以采用如下两种方式来实现:其一是采用JavaBean组件实现——封装数据的实体JavaBean和业务逻辑处理功能的JavaBean;其二是应用EJB组件实现——会话Bean处理业务逻辑,实体Bean封装和存取数据。
2)视图(View)是软件应用系统程序中与用户界面相关的部分,是最终用户看到并与之相互交互的系统界面。
3)控制器(Controller)主要是根据最终用户在操作使用软件应用系统时的输入,控制用户界面内的数据显示状态和更新模型对象的状态,最终达到保持视图的显示结果与模型状态的一致性。
(2)应用MVC体系架构设计模式可以分离"视图"和"模型"之间的耦合关系
应用MVC的设计理念来观察一个企业软件应用系统,在软件应用系统中的"用户界面"(视图)发生变动的可能性是最大的,而控制部分(控制)的变动则次之,业务逻辑部分(模型)一般是相对比较稳定的。
如下示图为读者都很熟悉的即时通讯QQ软件,为了满足不同的应用环境中的用户需要,分别提供如下的三种版本:PC版本、Web浏览器版本和移动App版本,但这三个不同版本的主要差别表现在界面(视图变化),而后台服务器端相关的通讯则应该是统一和一致的程序(模型稳定)。
因此,为业务逻辑编写的功能实现代码不应该和反映用户界面的功能实现代码相互混杂在一起,而是应该尽可能地独立和分离,并由系统中的控制器组件来担当两者交互的中介。
而应用MVC体系架构设计模式可以分离软件应用系统中的"视图"和"模型"之间的耦合关系,从而可以重用一个稳定的"模型"而分别提供不同应用环境下的"视图"。因此MVC体系架构设计模式是用来帮助软件应用系统设计人员控制"变化"的一种设计模式。
2、Web MVC(也就是 J2EE平台中的"JSP Model Two构架模式"的升级)体系架构设计模式
(1)Web MVC体系架构设计模式的产生
在1999年2月的JavaWorld大会上,由Govind Seshadri博士提出了Web MVC体系架构设计模式(Govind Seshadri在 Understanding JavaServer Pages Model 2 architecture 一文中清楚地指出了JSP Model 2是一种 MVC 模式。)。它是对Smalltalk-80中的MVC的改进和完善,以适用于基于Http协议的Web软件应用系统的体系架构设计中。
由于Http协议是无状态的,因此在Web应用系统中如果继续沿用传统的MVC体系架构设计模式(也就是Smalltalk-80中的MVC),则其中的"模型"和"视图"之间不能直接应用Observer模式(观察者设计模式)进行状态改变的通知——也就是传统的MVC不适用于Web浏览器的应用环境中。
因此,有必要对传统的MVC体系架构进行改造和完善以适用于Web软件应用系统的体系架构设计中。
(2)Web MVC体系架构设计模式中的控制器如何设计实现
要将传统的MVC体系架构设计模式改造以适用于Web浏览器的应用环境,需要对其中的"控制器"进行修正和完善——在Web浏览器的应用方式下将改由J2EE Servlet组件实现"模型"和"视图"之间的"代理"以承担MVC体系架构设计模式中的控制器角色——它调度"模型"组件和通知"视图"组件更新显示(当然,在JSP页面中可以通过转发forward或重定向redirect等形式的响应输出实现)。
如下示图为Web MVC体系架构设计模式中的"视图"、"控制器"和"模型"三者之间的交互关系示图。
3、MVC体系架构设计模式能够分离表示层逻辑和业务层逻辑
为了能够提高软件应用系统中表现层组件的可维护性,不应该将涉及系统中的业务功能方面的程序代码与完成显示功能的HTML标签或者服务器端标签(如JSP标签等)混合在一起。否则,当开发人员需要更改Web页面内容或者扩展Web页面的新功能时,将会带来很大的修改工作量,甚至会破坏原有软件应用系统的稳定性。
如下示图所示的JSP页面(*.jsp文件)中包含有大量的Java程序代码和服务器端的JSP标签(未附录显示),这样的JSP页面是不容易维护和功能扩展的。
MVC体系架构设计模式最大的价值体现在,它倡导分离软件应用系统中的表示层和业务处理层之间的耦合关系。因此,应用MVC体系架构设计模式可以解决上述的问题,它是达到分离"模型"和"视图"之间的耦合关系的一种架构模式,从而可以保证系统表示层组件只负责显示功能而不再直接藕合有功能实现的代码。
而当软件应用系统需要提供对另一种形式的客户端支持时——也就是"视图"发生调整,软件应用系统的设计和开发人员只需要重新设计一套新的表示层组件,而软件应用系统的核心业务功能和数据访问操作功能则无需进行任何的变化和修改——读者可以参考"PC版本"、" Web浏览器版本"和"移动App版本"这三个不同版本的QQ程序的实现示例。
4、支持MVC架构体系设计模式的开源框架——Struts2应用框架
(1)Struts2应用框架是源自于Webwork的一个MVC框架
Struts2应用框架是由一组相互协作的Java程序类、J2EE Servlet和JSP标签等元素所构成,它们组成一个可重用的 Web MVC的体系系统架构。
在技术实现的本质上,Struts2应用框架其实是对WebWork框架的升级,因此也就同样具有与WebWork2相同的特性——前置拦截器(Interceptor)、运行时表单属性验证、类型转换,强大的表达式语言(OGNL,the Object Graph Notation Language)和控制反转IoC(Inversion of Control)容器等。
(2)Struts2应用框架中的"控制器"不再采用Servlet组件承担
在Struts2应用框架在的"视图"部分继续采用标准的JSP页面,"模型"组件也继续应用普通的JavaBean组件承担,但其中的"控制器"则不再采用标准的Web MVC模式中的J2EE Servlet组件承担,而是由"前端控制器"组件和"后端业务控制器"组件两者相互配合完成控制调度的功能。
其中的"前端控制器"组件主要完成对Web请求的预处理,并调用相关的请求处理的"后端业务控制器"Action组件中对应的功能方法;而"后端业务控制器"组件则根据所接收到的Web请求的类型分别调用"模型"组件中不同的业务功能方法,完成最终的功能处理,并将处理的结果返送到相关的"视图"表现层JSP页面中显示输出。
如下示图为Struts2应用框架中的"前端控制器" 组件和"后端业务控制器"组件之间的结构关系示图,其中的拦截器组件完成系统通用的功能实现,为基于Struts2应用框架的软件应用系统提供统一的功能服务。
而其中的ActionProxy类(其实是一个接口,最终应用的是它的功能实现类)为"后端业务控制器"组件的代理类(应用了代理设计模式),通过在"前端控制器" 组件和"后端业务控制器"组件之间添加一个ActionProxy代理类的主要目的是分离"前端控制器" 组件和"后端业务控制器"组件之间耦合关系,从而可以保证"后端业务控制器"组件能够脱离J2EE Servlet容器的应用环境,有利于对"后端业务控制器"组件的单元测试和J2EE Servlet容器外的开发实现。
5、支持MVC架构体系设计模式的开源框架——Spring MVC组件
(1)Spring框架也提供有对MVC架构体系设计模式的具体实现
Spring框架中的MVC组件可以使用多种不同的表示层实现技术(在Spring MVC组件中内置了对JSP、Velocity模版和XSLT等以及其它视图实现技术的支持),同样也是"请求-驱动"类型的MVC框架并且是围绕前端控制器DispatcherServlet组件而设计的。如下示图为Spring框架中的MVC组件的"视图"和"控制器"相互交互的结构示图。
但在Spring MVC中能够应用控制反转技术促进软件应用系统中的表示层和模型层组件之间的松耦合,同时也能够应用面向切面(AOP)编程的技术支持,从而允许通过分离应用的业务逻辑与系统服务。
(2)Spring MVC组件的主要技术特性
1)轻量和非侵入式:从大小与开销两方面而言,Spring应用框架都应归属为轻量级。此外,Spring应用中的对象不依赖于Spring本身的特定类。
2)控制反转:Spring应用框架通过控制反转(IoC)的技术促进了松耦合。
3)面向切面(AOP):Spring包含对面向切面编程的丰富支持,从而分离应用的业务处理逻辑与系统功能服务。
4)基础功能服务:Spring应用框架也提供了很多基础功能服务和相关的技术支持,如事务管理、持久性框架集成等等以及控制器、验证器、命令对象、表单对象、模型对象、Servlet分发器、处理器映射、视图解析器等等。
项目实训及课程设计指导——Web表示层典型功能实现的应用实例
项目实训及课程设计——如何合理地设计软件应用系统Web表示层
软件项目实训及课程设计指导——如何对课程设计中的项目进行选型
软件项目实训及课程设计指导——实体类结构和类关系的设计示例
软件项目实训及课程设计指导——软件系统设计中的概要设计示例
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com