刘萍芬
摘要:基于B/S的软件开发需要一种科学的软件开发模式,MVC模式的设计思想为软件的健壮性、可维护性和可扩展性提供了有力的支持。文章介绍了MVC模式的体系结构及功能,给出了多界面控制的设计与实现,使用MVC模式开发软件充分体现了该模式的优点,增加了项目开发的效率和复用性。
关键词:MVC设计模式;多界面;XML
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)09-2227-04
MVC(Model-View-Controler,模型-视图-控制器)是Xeror PARC 在八十年代为编程语言Smalltalk-80所发明的一种软件设计模式[1,2],至今已被广泛使用,是一种划分系统功能的方法,其为开发交互式应用系统提供了一个优秀的设计模式,受到越来越多开发者的欢迎。MVC模式三维目的是增加代码的重用率,减少数据表达、数据描述和应用操作的耦合度,同时也使得软件可维护性、可修复性、可扩展性、灵活性以及封装性得以提高。
1 MVC模式体系结构及功能分析
MVC把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层,即模型层、视图层、控制层[3]。
模式的核心就是做到三层甚至多层的松散耦合,是一种面向动态内容的实现方式。在MVC模式中,应用程序被强制分成三个核心部件:模型(Model)、视图(View)、控制器(Controller)。它们各自处理自己的任务。其模式结构如图1所示。
视图是实现模块的外观,它是应用程序的外在表现。它可以访问模型的数据,但不能改变这些数据,也不了解模型的情况,同时也不了解控制器的情况。当模型发生改变时,视图会得到通知。一个模型可以由多个视图,而一个视图理论上可以同不同的模型关联起来。
模型包含了应用程序的核心,它封装了应用程序的数据结构和事物逻辑,集中体现了应用程序的状态。它能够处理部分的事物逻辑和数据结构,能够与数据库和文件系统进行交互,承担维护应用程序的责任。
控制器封装的是外界作用于模型的操作。通常,这些操作会转发到模型上,并调用模型中相应的一个或多个方法。一般控制器在模型视图之间起到了沟通的作用,处理用户在视图上的输入,并转发给模型处理。这样模型和视图两者之间可以做松散耦合,甚至可以彼此不知道对方,而由控制器连接起这两个部分。
2 多界面控制的设计
2.1 客户端视图组件设计
PB,Dephi等客户端通过本地的Dll与服务器端进行数据交互,Dll设计的好坏直接影响客户端的处理方式和数据格式的转化处理。Dll设计应该提供尽可能多的接口以便对尽可能多的视图组件的数据进行封装。
通过对PB和Dephi的视图组件的研究发现,针对每个视图组件封装一个函数不太现实,而且不利于后面的扩展。新的组件加进来必须提供新的处理转化函数。因为每个视图组件都有数据抽取的功能,可以把对组件的封装处理转化为对数据的封装处理。
输入规范中分为信封头和信封尾,在头信息中包含用户登陆的用户名、密码、用户登陆会话标识和调用的EJB组件的标识名等。在信封体中包含两种请求数据类型:单参数数据和参数集合。
输入规范中同样也包含信息头和信息体。信息头包含用户登陆会话对象标识。信息体中也包含两个返回格式:单个返回结果和结果集。
出错规范也分为信息头和信息体,信息头中和输出规范一样,包含用户的登陆会话对象标识。信息体中包含出错的代码标识和错误描述信息。
把对数据的处理分为输入数据,输出数据和出错数据,对输入数据分为单数据参数输入和参数集输入,对输出数据也做同样处理,分为单结果输出和多结果集输出。
2.2 服务器端控制组件设计
服务器端的设计主要包括控制层和模型层的设计,控制层中主要为控制组件的设计,模型层的设计主要为业务组件的设计和持久层的设计。博弈控制组件的设计是服务器端设计的核心,控制组件中包括格式转化转发器、数据格式转化组件和业务组件的调用接口。
格式转化转发器(也称集中控制器)根据客户端的请求头信息判断客户端的类型,如果请求头信息的headFormat字段值为xml,根据format.properties配置文件信息转发给XMLEvenlopConvert数据格式转化器,如果请求头信息中的heafFormat的值为map,则根据配置文件转发给MapEvenlopConvert数据格式转化器,如果是其他取值,则根据配置文件信息转发给对应的数据格式转化器,这样设计的好处是容易扩展新的数据交换协议和添加新的数据格式转化器,而不需要更改程序的代码。同样,当中间层处理完后,把结果返回给数据格式转化转发器,转发器根据配置文件信息转发给对应的数据格式转化器,转化器把结果转化成客户端需要的格式返回给客户端。当前系统中只用到两种格式,xml格式为PB,Dephi客户端发送的数据格式,map为浏览器发送的请求对象数据封装格式。格式转化转发器在系统中充当集中控制器的角色。如图2所示。
数据格式转化组件主要是对客户端传输进来的数据格式转化为中间层处理的统一的数据格式,同时把中间层处理返回的数据格式转化为客户端需要的格式。
其中RequestEvenlop是传输给中间层的数据对象,而ResponseEvenlop是中间层处理后返回结果的数据对象。
数据格式转化器必须提供可以把客户端发送过来的数据转化成RequestEvenlop数据结构,同时能够把中间层的结果ResponseEvenlop转化为客户端需要的格式,数据格式转化器接口的类图如图3所示。
其他的数据格式转化器必须实现该接口并根据客户端的数据格式实现convertToEvenlop和convertFromEvenlop方法,图4为XMLEvenlopConvert和MapEvenlopConvert实现BaseEvenlopConvert的类图。
控制组件根据xml的配置信息调用相应的业务组件,通过工厂方法获取业务组件实现,然后调用业务组件中相应的业务方法。
3 多界面控制的实现
3.1 客户端Dll实现
客户端的Dll主要是根据视图组件的数据构造符合系统SOAP XML规范的数据流。
Dll的实现主要是根据LdjSoap的接口实现对应的函数,主要实现代码如下,其中引用到公用的Apache xml解析库Xercesc:
3.2 服务器端控制器实现
1)转发器主要实现
转发器通过读取配置文件来获取数据格式转化器,通过把请求数据或者返回结果给对应的数据格式转化器转化成期望的数据格式,并调用对应的请求处理器进行业务处理。
通过把format.properties文件放到classpath路径下,FormatRedirector读取format.properties文件并缓存到静态变量formatPro中:
FormatRedirector根据从http请求对象中读取的头信息和流数据信息获取对应的数据格式转化器进行转化处理:
2)数据格式转化器主要实现
格式转化器是服务器端实现的重点,它把各种不同的数据请求对象转化成业务组件需要的数据结构RequestEvenlop,同时把业务组件返回的ResponseEvenlop数据结构转化成客户端需要的数据形式,如xml等。
本模块中的所有处理结构都是以XML形式返回给客户端,PB等客户端通过dll解析获取,浏览器客户端通过JS调用DOM对象处理获取。
把ResponseEvenlop转化成XML文本形式相对比较简单,下面实现如何把xml等对象转化成RequestEvenlop数据结构。
主要用到两种转化器XMLEvenlopConvert和MapEvenlopConvert。
MapEvenlopConvert对http请求对象进行数据格式转化,根据RequestEvenlop结构特点,很容易的从HttpServletRequest获取到请求数据:
Map dataMap=httpServletRequest.getParameterMap(); //获取请求数据的名-值对。
之后可以直接把dataMap对象设置为RequestEvenlop的Body。
XMLEvenlopConvert把客户端传过来的xml文本格式转化成RequestEvenlop数据结构。
客户端传过来的Soap xml信息主要包括文档头信息和体信息。头信息主要包括用户名、密码、功能点等;体信息是主要的业务数据。系统通过HeadParser把头信息解析到RequestEvenlopHead,主要代码如下:
系统通过注册一序列反序列化器来实现对信息体的解析。不同的块结构用不同的反序列化器解析,系统提供有StringDeserializer, VectorDeserializer, HashMapDeserializer实现对普通参数、参数集合和行记录集合的解析处理。
通过QnameMapping注册已有的解析器种类,每种类型的解析器都继承Deserializer接口并提供对应的实现方法(系统通过提供一个Deserializer的默认实现DeserializerImpl,其他的类型扩展它实现):
SOAPHandler是一个SAX XML事件触发解析的默认实现,通过SAX可对xml的不同元素进行解析。DeserializerImpl扩展SOAPHandler实现事件触发解析功能。系统StringDeserializer主要是对Soap xml规范中的para元素解析,的实现如下:
系统的整个解析动作通过DeserializationContext(实际上是通过DeserializationContextImpl)触发,XMLEvenlopConvert通过DeserializationContext的deserialize方法把xml数据流作为参数传进去,通过getValue()获取解析后的RequestEvenlop的信息体。
4 结论
由上文可以看出,使用MVC模式开发软件充分体现了该模式的优点,增加了项目开发的效率和复用性。MVC的优点表现在以下几个方面:
1) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。
2) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。
3) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。
4) 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
参考文献:
[1] Leff A,Rayfield J T.Web-Application Development Using the Model/View/Controller Design Pattern[C].Fifth IEEE International Enterprise Distributed Object Computing Conference,September,2O01.
[2] 任中方,张华.MVC模式研究的综述[J].计算机应用研究,2004,21(10):1-4.
[3] Bergsten H.JSP设计[M].3版.北京:中国电力出版社,2004.
[4] 周必水,倪慧莉.简单对象访问协议SOAP的研究与分析[J].微电子学与计算机,2002(5).
[5] Wei Ruan Gong Si.XML3.0技术内幕[M].北京:清华大学出版社,2001.
[6] EITEL H M.XML编程技术大全[M].北京:清华大学出版社,2002.
[7] 孙卫琴.精通Struts:基于MVC的JAVA Web设计开发[M].北京:电子工业出版社,2004.