Web系统结构调整实例及分析
张兆雷 佟秋利
(清华大学计算机与信息管理中心 , 北京 100084)
E-mail : zhangzl@cic.tsinghua.edu
摘要基于struts的web项目在开发和维护的过程中,系统结构会逐渐偏离最初的设计,这会影响系统的性能和可维护性,为了保证系统正确运行,需要对系统结构进行修复。本文根据对校园信息化系统的一个web项目进行结构调整的实例,通过分析web系统的特性,提出适用于web系统结构修复的方法,包括实施的原则和流程。这篇文章提出的方法的优势在于通过较少的工作量就可以显著的改善web系统的结构,增强系统的可维护性。
关键字Web; MVC; struts;结构修复
中图分类号: TP311
The Application and Analysis of Web System Architecture Repair
Zhang Zhaolei Tong Qiuli
(Computer and Information Management Center of Tsinghua University,
Beijing 100084)
Abstract: As a Web Application which is based struts framework is developed and maintained, its architecture will drift, and this situation will weaken the performance and the maintainability of the system. In order to eliminate the problem, we should do some repair work on the system architecture. The writers have worked on a Web application of Campus-Wide Information Systems (CWISs) and repaired the system architecture successfully. In this paper, we will analyze the characteristic of Web system, and summarize some principle, method and the flow which could be used in the architecture repair of Web system. The highlight of our method is that we could get twice the result with half the effort and improve the system architecture and maintainability remarkably.
Keywords: web; mvc; struts; Architecture Repair
0 引言
在进行企业级web开发的过程中,设计架构[5]对开发的效率和成功率的影响越来越大。struts是近些年来众多轻量级设计架构中比较优秀的一个。struts架构采用MVC分层设计思想,将开发项目分为视图(Vie
w)、控制(Control)、模型(Model)三个不同功能层次,将业务逻辑处理和数据显示分离[1][6]。采用MVC的分层结构,主要目的是明确web系统的功能分配,减弱各个组件之间的耦合性,进行模块化的开发。模块的组件化和模块之间的低耦合性利于系统的分布式部署、提高系统的性能和可维护性。
struts提出了分层和分模块的思想,但是如何对web项目进行模块划分并没有统一的标准,而且web项目需要大量开发人员和较长时间,不易组织,需求变更频繁,因此,在web项目的开发和维护过程中,结构会逐渐偏离最初的设计。一般情况下,这个问题会影响项目的后期维护和再开发,严重的会降低系统的性能,甚至使系统崩溃。解决这个问题的方
法,主要包括两类,一类是在软件中集成在运行时进行自我修复的机制(self-repaired design)[10]。主要是通过一些原则和工具来辅助软件设计[11-16];另一类是在项目完成后对项目框架
进行分析和调整,重构系统架构(Architecture Reconstruction),消除产生问题的隐患。这类方法的研究工作主要包括:代码启发式的自底向上的结构修复[7];基于软件系统体系结构框架的结构修复[9];以及综合利用多个层面的框架进行软件系统结构修复[8]。实际工作方面,John B.Tran等人对linux下的开源软件进行结构调整的工作为我们提供了成功的范例。到目前为止,这些研究和实际工作,都还没有应用到web开发领域。Web软件开发具有其自身的特点[5],需要研究适应web特点的结构修复方法。
本文作者在实际工作中,通过分析struts框架的特点,参考linux软件项目结构调整的方法,实现了对web
项目进行结构调整的实例,取得了良好的效果。本文的主要内容是提出对web项目进行结构调整的流程和方法,与linux软件结构调整不同的地方是不仅对模块而且对系统层次划分进行调整,同时以保证数据流的完整性为原则。之后,我们会探讨结构调整活动对web系统的影响。
在第二部分中,我们将讨论一个实用性的struts的框架。然后在第三部分介绍我们进行web项目结构调整的方法。利用这种方法对一个校园信息化web系统进行结构调整的流程将在第四部分详细说明,最后,我们总结这些工作的意义、成功和不足之处,提出下一步的目标。
1 Struts框架
1.1 struts基本框架
在前面提到,struts的基本框架主要由三部分组成:视图(View)、控制器(Control)、模型(Model)。这三部分的功能划分为:
模型(Model)
分为两个部分:系统的内部状态和可以改变状态的操作(业务逻辑)[2]。内部状态通常由一组Value Object(VO)类表示。根据设计或应用程序复杂度的不同,这些VO类可以是自包含的并具有持续的状态,或只在需要时才获得数据(从底层数据库)。
视图(View)
视图主要由JSP建立,负责表单数据的显示。
控制器(Controller)
接收所有的请求,转发到业务逻辑处理模块,并将处理结果返回给页面。通过l 文件配置控制器。
1.2 实际应用框架
为了适应各种特殊的应用环境,实际开发的过程中使用的struts框架会与其基本框架略有不同。在我们应用struts框架建设校园信息化web系统的过程中,由于校园信息化web 系统规模不会很大,模型组件完成的功能比较简单,所以,为了减少工作量,对struts的模块划分进行了适当调整。
经过调整之后的struts的结构图如图1所示:
其中的调整之处主要有:
1.视图组件由JSP页面和
ActionForm共同组成。
ActionForm的功能是
存储JSP表单数据,然
后通过控制器传递给
功能模块。一般一个
ActionForm会和一个
ctionForm
或者几个JSP页面紧密
相连,所以,把它们放
在一起,方便表单的维
护。
图1 struts应用框架图
2.模型组件中,依据“模型包括业务逻辑和业务状态”,将功能划分为三个层次,最底层的Data Access Object(DAO)模块负责和数据库进行通讯,实现通用的数据库的CRUD(create、read、update、delete)操作[3]。VO是表示业务状态的模块,在VO中记录了当前业务中需要持久化保存的信息。Action模块完成具体的业务逻辑。
2 结构调整方法
在John B.Tran等人对开源软件系统进行结构修复的论文[4]中,提出了一种通过正向和反向两种途径进行结构修复的方法,参考这个方法,结合web系统的实际情况,提出适用于web系统的结构调整方法。
2.1 软件结构调整的方法
结构调整的基础是:首先要有一个软件系统结构的概念模型;其次,需要对所要修复的系统的结构进行提炼,总结出一个系统的具体结构。将这两种结构进行比较,出其中的差别之处――差异点(在John B.Tran等人的论文中称为结构异常),差异点有合理和不合理两种,对不合理的差异点,利用正向的方法进行消除;合理差异点的存在对系统是有利的,利用反向的方法进行消除。
正向的方法是,保证概念结构模型不变,清除具体结构中多余的依赖关系,主要方法是分裂和转移子系统或模块,分裂是指将一个模块分成两个或多个,转移是指将模块从一个子系统中转移到另外一个子系统中。
反向的方法是,保证在具体结构中某些合理的模块和依赖关系不变,修改最初的概念结构模型,使之能够和具体的结构相匹配,以此来清除两个模型之间的差别。
2.2 web系统结构调整方法
web是一个面向网络的服务,web系统中的数据流大部分都要通过网络来传递。现代web系统的结构是
以分层思想为基础的。所以,在对web系统进行结构调整时,必须考虑两个问题,其一是数据流的清晰完整,其次是层次划分的合理性。
图2 struts数据流图
Web系统中的数据的来源主要有两个,一是在客户端用户输入的数据,一般通过JSP页面的表单来获取;
另一个是数据库中的数据,一般通过DAO来维护。这两种数据分别位于web分层系统的最高层和最底层。数据就在这两个源之间流动。具体过程如图3。
在图2中,ActionForm 和VO 是存放数据的两个组件,DAO、Action和JSP是处理和传输数据的组件,可以看出,web数据流的特点是在任意两次传输之间都有完整的数据存储组件负责缓存和中转。ActionForm和VO对保证数据流的清晰起到了重要作用。在对web 系统进行结构调整时,需要完整地实现ActionForm和VO组件。
Web系统的层次划分是一个需要根据实际情况进行权衡的问题。系统所分的层次可以很复杂,也可以很简单。层次多,结构会比较清晰,但是会牺牲性能;层次简单,结构完整性会减弱,但是可以提高性能。struts框架实现了视图、控制器、模型三层结构。但是,一般来说,如果功能特别复杂,也可以在这三层的基础上再划分更细的层次,而如果功能很简单,也可以将不同的层次合并。
根据上述web系统的特点,我们总结出适用于web系统的结构调整的方法和原则为:1.寻差异点
2.消除正向差异点。
主要的操作是:对web系统结构的分层进行调整,包括将一个层次的模块调整导另一个层次中;将一个层次分割成多个层次,合并两个层次等。对层次进行操作的原则是,尽可能使各层的功能单一化,消除不相邻层次之间的联系,保证数据流在各个层次之间流动的清晰性。
3.消除反向差异点。
主要的操作是:在struts应用框架中添加新的模块。需要遵循的原则是保证新模块具有相对的独立性,不破坏原有的各模块之间的联系。
3 结构调整实例
3.1银行代发系统结构
清华大学银行代发系统的主要作用是加强财务工作对教师科研工作的服务,规范和理顺科研项目中人工费的代发流程。银行代发系统基于struts结构建立,处理的主要业务逻辑包
括代发员的表单填写、修改、提交;管理员的审核、批复、备份等功能。由于是面向全校的业务系统,在实际使用过程中随着用户的深入使用,系统的功能逐步扩充,结构偏离最初的设计,逐渐变得混乱,造成了在运行时出现了诸如功能失败、性能下降等问题。为了解决这些问题,迫切需要对系统的结构进行重新分析和调整。
银行代发系统的模块划分及它们之间的关系如图3所示:
图3 银行代发系统结构图
mvc实例银行代发系统主要分为三个模块:DAO 、CONTROLLER 、MODEL。其中,DAO模块完成对数据库的操作;在MODEL模块中,主要是一些业务逻辑数据,也就是VO 。这些VO保存着从数据库中读取出来的数据,并供给CONTROLLER中的业务处理逻辑使用。CONTROLLER模块中除了完成业务逻辑的Action类外,还包含ActionForm类。
银行代发系统主要的业务流程有两条:
1. 客户端-JSP-struts控制器-CONTROLLER模块-DAO
2. 客户端-Manager组件-DAO 。
数据流程有四条:
1.客户端-JSP-CONTROLLER模块—MODEL模块—DAO-数据库
2.客户端-JSP-CONTROLLER模块-数据库
3.客户端-Manager组件-MODEL模块—DAO-数据库
4.客户端-Manager组件-数据库
下面我们将具体分析这个系统的结构和struts结构之间的差别。
3.2 差异点分析
参考在第三部分中介绍的正反向结构调整方法,我们将第二节中总结的struts的应用框架作为概念模型,将上面所示的银行代发系统的框架作为具体模型,分析这两个模型之间的主要差异点,如表1所示:
表1 差异点列表
差异点合理与否
差异点说明
概念模型具体模型
ActionForm组件不合理在视图模块中在控制器模块中
Action组件不合理在模型模块中在控制器模块中
Manager组件合理不存在独立存在
Action和数据库的关联不合理通过DAO访问数据库直接访问数据库Manager和数据库的关联不合理通过DAO访问数据库直接访问数据库
3.3 调整的过程和结果
根据第三部分中总结的web系统结构调整的方法,我们分别消除正向和反向的差异点。
图4 修复后的银行代发系统结构图
首先,第一和第二个差异点都涉及到原银行代发系统(图3)中的CONTROLLER模块。我们的调整操作是将CONTROLLER模块分解成ActionForm和Action两个组件,作为两个独立的层,ActionForm应该放在视图模块中,而Action类应该放在模型模块中。
其次,对图3中的manager组件,由于它是合理的差异点,我们采用反向的消除方法,在struts结构图中保留这个组件。通过这个操作,使得系统的概念模型和具体模型保持一致。
对Action组件、Manager组件与数据库之间的不合理的关联关系,我们采用转移调用的方式来消除。例如,把Action中通过jdbc的方式对数据库的直接访问转移到通过DAO对数据库进行访问。这样就消除了这两个不合理的依赖关系,同时也保证了数据流的清晰完整。
调整后的银行代发中的组件包括:JSP页面、ActionForm、struts控制器、Action、VO、DAO、Manager。第一条业务流程变为:客户端-JSP-struts控制器-Action-DAO,Action 业务模块的功能更为明确。数据流中将CONTROLLER模块分为Actionform和Action,可以看到数据在这两个模块之间流动的过程。同时消除了两条多余的数据流,使得对数据库的访问都通过DAO组件来控制,利于保持数据的完整性。最终的结果如图4所示,与图3相
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论