Web应用代码生成系统的设计与实现

时间:2022-04-13 01:02:14

Web应用代码生成系统的设计与实现

摘 要:代码生成工具的使用可以大幅度减少开发人员编写重复性代码的工作量,提高Web应用开发的质量和效率。在代码生成系统中,设计一种基于MVC设计模式的新型Web应用开发框架,将Web应用分为视图层、控制层和模型层,每层各司其职,代码结构清晰,在此基础上采用JET模板和Xpath相结合的代码生成方法生成重复性代码。实验证明,该系统可快速构建Web应用。

关键词:代码生成系统;MVC;JET;Web应用

中图分类号:TP311

0 引 言

早期Web应用使用ASP,JSP等技术进行编码,将页面显示、业务逻辑和数据库操作大部分都集中在页面代码中,维护困难,不利于分工协作。随着Web技术的飞速发展,Web组件的开发方式成为主导,MVC设计模式是其中的典型,各种框架也纷纷出现,如Struts,Spring框架等,在很大程度上降低了Web开发的难度,但也存在很多不足,如难于掌握,配置复杂等,对于很多Web应用项目并不适用。在此基于MVC模式,并结合大量设计模式,设计一种新型的Web应用开发框架,代码结构清晰,复杂度低,易于理解,并且配置简单,加强了系统的可扩展性,降低了软件开发成本。

基于Web应用本身的特点,采用上述框架开发Web应用,对于不同模块而言,各层次代码在实现上有很大的相似性,开发人员需要重复编写大量代码,严重影响了软件开发速度。代码生成技术的引入,在很大程度上可以解决这一问题,大大减少了软件开发中枯燥且重复的编码工作,更进一步加快了Web应用的开发。

在此采用模型驱动(MDA)开发的思想,设计并实现了一个面向Web应用的代码生成系统,在开发人员简单配置下,能够快速构建Web应用,显著提高了Web应用的开发效率。

1 Web应用体系结构

[BT3]1.1 MVC设计模式

MVC设计模式是基于J2EE的Web应用开发的首选模式,它强制性地将应用程序的输入、处理和输出分开,使应用程序分成模型层、控制器、视图层,并各自处理自己的任务。

模型层封装了数据和对数据的操作,是应用程序的主体部分。MVC三个部件中,模型层拥有最多的处理任务。同一个模型可被多个视图重用,提高了应用的可重用性。通过模型层,可以确定需要操作的数据、业务处理方法以及需要设计什么样的视图层页面[3]。

控制层用来处理业务逻辑,负责视图和模型之间的交互,控制对用户输入响应方式和流程。它主要负责两方面的动作:把用户的请求分发到相应的模型;将模型的改变及时反应到视图上[4]。

视图层是模型的表示,用于管理用户请求并做出相应的响应。对于Web应用程序,视图主要指HTML或JSP页面。视图向用户显示相关的数据,并能接收用户的输入数据,提交给Web服务器进行处理。但是它并不进行任何实际的业务处理[5]。

综上,基于MVC的设计模式开发Web应用,┟恳徊悛在处理程序上都有明确的任务与功能,实现了系统结构层次清晰及各层间的解耦,从而大大提高了代码的灵活性和复用性。

[BT3]1.2 Web应用框架结构

本文框架结构基于MVC设计模式,并使用了大量优秀的设计模式,如模板模式、工厂模式、适配器模式等,篇幅有限,不再赘述。

框架将目标系统分为模型层、控制层、视图层三层。其中,视图层通过JSP实现,控制层通过Servlet来实现,而模型层则通过实体Entity来实现。三者之间的交互模式如图1所示。

Servlet充当控制的角色,它接收请求,并且根据请求信息将它们分发给适当的JSP页面来产生响应[6]。Servlet控制器还根据JSP视图的需求生成实体Entity的实例并输出给JSP环境。JSP视图可以通过直接调用Entity实例的方法得到Entity中的数据。

下面对各层次模型在Web系统中的作用以及实现方法进行详细阐述。

[BT4]1.2.1 模型层

Web应用架构模型层由实体实现,如图2所示。

CommonEntity执行基本的实体操作,包含属性table,property以及与数据库的操作等。具体操作的实体均继承自这个统一的抽象类CommonEntity,各业务对象的实体对应于其具体对应的数据库表,包含数据库表的基本属性字段的表示信息。

各个具体的实体类在结构上非常相似,都是get和set方法,只是具体的属性不同,保持了良好的面向对象设计风格。这样,有利于从目标代码中抽象出统一的结构作为模板,使模型层代码的生成更为简单。

[BT4]1.2.2 控制层

对于系统的控制层,采用Servlet实现,如图3所示。通过CommonServlet设置一些基本功能,其中包括访问控制、日志处理等信息。然后由较具体的类继承这个CommonServlet,它们实现各自的执行方法,但是并不具体。例如,对于Web应用的基本功能:增加、删除、修改、查询操作,与业务对象无关的实现操作都抽象在二级抽象类Addservlet,Deleteservlet,Updateservlet及Queryservlet中,各业务对象对应的具体模块中相应操作的Servlet继承二级抽象类,完成具体操作。这在很大程度上减少了代码的重复,提高了代码的利用率。

各个模块对应的Servlet在结构上具有很大的相似性,很容易提炼出统一结构作为模板。应用代码生成器,可以使Web开发速度得到很大提高。

[BT4]1.2.3 视图层

视图层为显示提供一个数据模型,用于管理用户的请求并做出相应的响应。不同的业务逻辑对应不同的页面,如添加页面add.jsp、列表页面list.jsp等,且根据用户需求的不同,选择多种页面风格,对于不同对象,只是显示的内容有所不同。本文框架的设计使视图层大大简化,同一种类型的页面对于各个模块而言,包含大量的结构相似代码,同样适于使用代码生成工具实现。

通过以上分析可知,这里所采用的Web应用框架结构,在根据MVC模式划分的每一层中,都将大量的通用操作封装在抽象类中,具体业务对象继承抽象类实现具体的业务逻辑,在很大程度上减少了代码的重复率。

具体业务对象的增加、删除、修改、查询等功能在系统各模块中的处理方式相似,开发人员手动开发重复率很高,交互页面也存在大量的重复设计。这类代码非常适合于使用代码生成工具实现,代码生成技术的引入将大大地减少重复工作,减少开发的工作量。

根据对目标系统的分析,可最终确定需要生成哪些目标代码,主要有:

(1) 视图层:各业务对象的add,list,update页面(delete直接用Servlet实现);

(2) 控制层:各业务对象进行add,delete,update,query操作所对应的Servlet;

(3) 模型层:各业务对象相应的entity。

2 代码生成器的设计

[BT3]2.1 代码生成方式

由第1.2节可知,各层目标代码由代码生成器自动生成。关于代码生成器,比较典型的几种生成方式包括:

(1) 使用XSLT把XML转为Java源代码。

采用XSLT处理器完成模板解析和变量替换,并使用样式表语言,免去为文本定制规范的工作[7]。

(2) 面向属性编程。主要是XDoclet,

XDoclet使用类似JavaDoc标记的注释向类、方法和字段等语言特征添加元数据。随后,它利用这些额外的元数据自动生成配置文件、源代码等。

(3) 基于MDA。

主要是AndroMDA,它是在模板技术和XDoclet两项技术的基础上实现Code Generation的。

(4) 基于模板解析。

通过模板解析引擎将输入数据替换模板文件中可变部分生成目标代码,能够生成Java,C/C++,SQL等各种语言代码。采用模板方式生成代码,可减小复杂性和增加可读性,是代码生成的主要实现手段[8]。

在本文的代码生成系统中,根据第1.2节中对目标代码的分析,需对每一层进行模板的提取,输入XML文件中包含具体的用户需求信息,二者进行相应融合,即可逐层生成目标代码。

成熟的模板引擎主要有Velocity,JET等,Velocity通过调用JDOM完成对XML文档的解析,编码量大,而基于EMF框架的JET模板引擎采用Xpath查询语言完成对XML文档的解析,大大减少了编码量,从而使代码生成过程更为快速,已经越来越多的被使用。

综上,在本文代码生成系统中,代码生成器部分使用JET模板引擎,以XML文件为输入数据模型,采用JET模板和XPath相结合的代码生成方法。

[BT3]2.2 基于JET模板的代码生成器

基于JET的代码生成过程包括:加载以XML格式存储的数据模型,通过XML Schema对模型进行结构完整性和语义一致性检查,检查通过,则执行模板引擎(控制文件),将模板文件与XML文件中的内容合并以生成目标代码。生成过程如图4所示。

下面对代码生成器的各部分进行说明:

(1) XML文件验证(XML Validator)。

XML文件用来存储和交换数据,采用层化关系,允许每个节点具有属性,使动态参数容易被获得。XML文件定义相关数据信息,标签名是模板中待替换参数,标签值则用于代替模板中待替换的参数[9]。

利用XML Schema对XML文件的语法格式及有效性进行验证,以保证代码生成的质量。XML Schema指定XML文档所允许的组织结构和必须包含的内容,如:文档中元素属性、子元素的数量、属性等。

(2) 模板文件。

在采用JET语言编写模板文件时,JET使用类JSP的语法,包括目标代码中的相同部分及各JET标签,可接受输入对象作为参数,可直接使用Java代码执行循环、声明变量或执行逻辑流程控制(脚本)[10] 。

JET支持Xpath查询语言,标签中select属性通过括号({ 和 })包含动态的XPath表达式,对XML文档中标签名和标签值进行解析,读取相关元素及属性信息。

(3) 控制文件。

JET是功能强大且灵活的模板引擎,包装在Eclipse建模框架EMF之内,通过控制文件main.jet控制代码的生成。JET编译器为每一个代码模板创建一个Java源文件,并在生成代码之前自动将代码模板编译成JavaClass文件,然后接受用户输入的参数,产生目标代码。控制文件中最重要的标记是,它将执行一个模板并将结果转储至指定文件。

3 代码生成系统的实际验证

[BT3]3.1 代码生成系统的总体结构

以一个简单的Web信息系统为例,利用本文代码生成系统,可生成各层目标代码。当业务对象发生变更或需要维护时,只需要修改相关代码生成系统的输入模型就可以重新生成目标代码,使Web应用的可维护性大大提高。

该代码生成系统的总体结构如图5所示,主要包含模型库、模板转换库、代码生成器三大部分。

模型库用于存放描述数据模型信息的XML文件,模板转换库中,以目录树的形式存放不同类别的模板;另外,模板转换库还存放有成熟的,具有特定功能的代码片断,有使用需要时,将其绑定到模板中的相应位置。代码生成器通过控制文件,从模型库选择需要的XML文件,模板转换库选择相应的模板文件,从而生成Web应用。

模型库以及模板转换库的采用能够提高XML文件和各类型模板文件的使用率,从而提高代码生成系统的可维护性及可扩展性。

[BT3]3.2 代码生成系统各部分介绍

[BT4]3.2.1 数据模型的输入及验证

数据模型包含用户需求的所有数据源,前期的数据源越准确、丰富,其结果也就越符合下一道工序的要求。因此,只有对系统的模型描述得准确和完整,才能更准确地生成Web应用代码。本代码生成系统针对完整的Web应用,因此XML文件中包含了用户所提供的Web应用各模块全部信息。

以下所示的程序中XML文件按照用户需求将数据对象的信息分成几个模块进行描述,程序中展示了代码生成系统输入XML文件的部分内容,包含栏目、文章、用户等模块。

对于每一个模块,在具体描述上都与Web应用的三层结构相对应,分别从视图层、控制层和模型层三方面对系统模型进行描述。

据此,XML文件分为四层进行描述,以栏目模块的模型层为例,四层分别为Webinfo,App,Model,Attr。其中,标签名,如Attr层的name,type是模板中待替换的参数,而标签值,如ColumnID,ColumnName,String则用于代替模板中待替换的参数。这些描述表示栏目模块模型层代码中包含两个属性,分别为ColumnID,ColumnName,类型都是String。

Webinfo[CD*2]PSM层指定系统XML文件中Schema 定义书的位置和名称。只有通过Schema验证,生成过程才能顺利进行。

[BT4]3.2.2 模板文件

根据第1.2节对代码生成系统目标代码的分析,可以归纳出需要抽象的模板,主要有:

视图层:add,list,update页面模板;

控制层:add,delete,update,query的Servlet模板;

模型层:entity模板。

[JP2]以模型层为例,对于XML文件中包含的几个模块,都对应着相同的模板文件,如以下程序所示。select属性包含Xpath路径,通过路径表达式可得到XML文件中的相应信息。

[BT4]3.2.3 控制文件

代码生成器控制文件如以下程序所示。

控制文件指定模板文件及生成代码的路径及名称,执行时选定输入文件webinfo.xml,即可生成所需代码文件。由第3.2.2节所示程序可知,根元素Webinfo[CD*2]PSM下包含三个app元素,则利用,即可同时生成articleEntity.java,columnEntity.java以及userEntity.java三个文件。各个文件的结构是一样的。

同样,对于控制层而言,利用写好的模板文件delete.jet,add.jet,update.jet,query.jet,可以通过代码生成器生成各个模块的delete,add,update,query代码文件;对于视图层而言,利用模板文件jspadd.jet,list.jet,jspupdate.jet,即可生成相应添加、列表、修改等页面代码。

这样,通过代码生成系统的使用,大大减少了手工编写重复代码,提高了软件开发的效率。

4 结 语

在此设计了一种基于MVC模式的新型Web应用框架结构,将Web应用分为视图层、控制层、模型层,每一层都有明确分工,层次清晰,结构明显。在各层中,将大量的通用操作封装在抽象类中,具体业务对象继承抽象类实现功能,使代码更为简洁、清晰。这样,涉及到业务对象的代码通过代码生成器生成,进一步减少重复性代码的编码量。

该代码生成系统已经在一个Web应用系统的开发项目中经过测试和检验。实践证明,使用该代码生成系统开发Web应用,可以大幅度提高Web应用开发的质量和效率,但本文所研究的代码生成系统,只能生成具有增加、删除、修改、查询功能的Web应用,对于更加复杂的需求,还需进一步扩充模板库,以及对XML文件的描述语言进一步细化。

要实现可以满足更多需求的Web应用代码生成系统,还需要进一步更深入的工作。

参 考 文 献

[1]孙茂增,李凤华,都婧.基于Velocity的J2EE应用代码生成系统[J].仪器仪表用户,2008,15(1):105[CD*2]106.

[2]Hailpern B,Tarr P.Model[CD*2]driven Development: the Good,the Bad and the Ugly[J].IBM Systems Journal,2006,48(3):451[CD*2]461.

[3]李宪军.基于J2EE的Web应用框架研究[D].大连:大连海事大学,2007.

[4]王广峰.模型驱动的J2EE Web应用生成器的设计与实现[D].济南:山东大学,2006.

[JP2][5]Rod Johnson.J2EE Development Frameworks[J].Computer,2005,1(1):107[CD*2]110.[JP]

[JP2][6]Ken Kennedy,Bradley Broom,Arun Chauhan.Telescoping Languages:A System for Automatic Generation of Domain Languages\[J\].Procedding of the IEEE,2005,93(2):266[CD*2]297.[JP]

[7]陈翔,王学斌,吴泉源.代码生成技术在MDA中的实现[J].计算机应用研究,2006(1):148[CD*2]149.

[JP2][8]Hugge N,Wagner B.A New Function Block Modeling Language Based on Petri Nets for Automatic Code Generation [J].IEEE Trans.on Industrial Informatics,2005,1(4):226[CD*2]237.[JP]

[9]戴周林.DaPerM:一种用MDA开发数据持久层应用的方法的设计与实现[D].上海:复旦大学,2006.

[10]尹彦均.Web应用代码自动生成平台中代码生成系统的研究与实现[D].北京:北京工业大学,2007.

作者简介 宋 微 女,1982年出生,河北保定人,硕士研究生。研究方向为Web应用与基础。

李亚芬 女,1963年出生,北京人,高级工程师,硕士研究生。主要研究领域为Web应用与基础、数据库、计算机控制系统。

上一篇:内容分发网络的研究 下一篇:超短波频段脉冲产生器的设计及硬件实现