维普资讯 http://www.cqvip.com 2008年第3期 文章编号:1006-2475(2008)03-0120-04 计算机与现代化 JISUANJI YU XIANDAIHUA 总第151期 一种适合快速开发行业应用的Web框架 朱伟林,骆志刚,赵翔,吴小山,孙浩轩 (国防科学技术大学计算机学院软件研究所,湖南长沙410073) 摘要:针对行业应用,本文基于Struts框架技术,通过剪裁和扩充Struts框架,构建了一个适合于快速开发行业应用的 Web框架。该框架结构清晰、配置灵活、可扩展性好、易于学习与使用。框架的稳定性、高效・li ̄.*-q-重用性已经通过实际 项目的检验。 关键词:Web应用框架;Struts;MVC;DBPool 中图分类号:TP391 文献标识码:A A Web Framework for Fast Industrial Application Development ZHU Wei-lin,LUO Zhi—gang,ZHAO Xiang,WU Xiao—shan,SUN Hao—xuan (College of Computer,National Univ.of Defense Technology,Changsha 410073,China) Abstract:Based on Stmts framework,this paper proposes a Web framework of evident structure,flexible configuration,well ex- pansibility,easyforlearning and using,which aim atindustrial applications.Thisframework is constructed by pruning and exten- ding Struts.Appllcation oftisfhrmewaorkin several pracitcal projects provesthatitisofhish stability,eficiency andreusbiaily.t Key words:Web ap cation framework;Stutrs;MVC;DBPool 0 引 言 随着Intemet的迅速发展,采用B/S(浏览器/服 务器)方式构建应用系统的需求不断增多,对于快速 开发Web应用的要求也越来越强烈。在Web应用系 统开发过程中经常要面临的问题是:如何利用已有的 是可复用的。Web框架是一组可以简化和加速Web 开发的构件,这些组件遵循一定的规则。目前,开源 的Web框架比较多,其中应用得比较多的有: Struts L 、WebWork L 、Spring MVC L 、Tapestry、JSF 等。这些框架的作用都是使开发者更加快速和方便 地建立web应用程序。 我们选择Struts框架加以剪裁和扩充,并应用到 web技术及组件?如何使以往系统建设过程中应用 良好的程序或组件得到重用?如何降低新系统建设 之初的技术培训成本?如何提高相同行业的多个系 统建设的效率与效果? 本文以行业应用为背景,基于优秀的开源项目 Struts¨]结合Java.Script技术、JSP技术及MVC设计 思想,构建一个结构清晰、配置灵活、可扩展性好、易 于理解与学习使用的Web应用框架。 ,1 技术背景 框架(_Framework)是可重用的、半成品的应用程 序,可以用来产生专门的定制程序 引。框架蕴涵特 电信行业的应用开发之中。 Struts是一个开源软件,是Apache软件基金下 Jakarta项目子项目。初始的代码基础从2000年5月 开始开发,直到2001年6月发布1.0版本。目前的 稳定版本是1.3.5,最高版本已经到了2.0.1。 Struts依靠大多数开发者已熟知的标准技术,比 如JavaBeans、Java servlet以及JavaServer Page(JSP)。 通过基于标准的技术、“填空式”的软件开发方法, Struts可以减轻在创建新项目时那些极费时间的工 作 。 Struts框架是MVC模式的一个体现,它提供了分 定领域的体系结构设计以及解决策略,并经实践检验 收稿日期:2007-03.15 别实现模型(Mode1)、视图(View)和控制器(Control一 作者简介:朱伟林(1980.),男,湖南衢阳人,国防科技大学工程硕士研究生,研究方向:J2EE、P2P网络技术,网格计算。 维普资讯 http://www.cqvip.com 2008年第3期 朱伟林等:一种适合快速开发行业应用的Web框架 121 ler)的组件。Struts框架有4个核心组件:ActionServ— let、Action Classes、Action Mapping(包括ActionFor- 框架的工作原理如图3。 ward)、ActionFrom Bean 。 图1显示了Struts的工作原理。 图1 Struts工作原理图 Struts框架基本遵循如图2所示的控制流 。 图2 Struts的控制流图 2 Web应用框架的构建 多数行业,如电信、银行、电力等,其共有的特点 是:大数据量、大并发量、频繁数据库访问、高复杂度、 界面要求高、安全性和保密性强、应用需求变更频繁 (因为业务发展快)、要求快速响应和实现需求。在 应用Web框架时也需要根据行业应用的特点对框架 进行一定的剪裁和扩充。 由于Struts框架发布比较早,利用Struts开发的 应用非常多,因此它也成为Web应用MVC模式中 VC部分事实上的标准。我们选择Struts框架作为基 础,通过对Struts框架进行剪裁和扩充,构建一个适 合于快速开发行业应用的Web框架。 我们从以下5个方面对Struts框架进行剪裁与 扩充: (1)把XML配置文件改为文本配置文件; (2)页面数据校验由动态生成的Javascript脚本直接在客 户端完成; (3)查询结果翻页处理; (4)使用第三方数据库连接池包,并扩充开发; (5)代码生成器开发与应用。 2.1剪裁后框架总体 经过上述的5方面的剪裁和扩充之后,剪裁后的 图3剪裁后框架的工作原理图 从图3中可以看出,Struts—config.xml配置文件 换成了Struts.properties文本文件,前台JSP页面增加 了两个辅助组件:UIChecker、PageDivider,Model层则 使用辅助组件MyPool来访问数据库。 UIChecker组件主要实现页面中数据的校验。 PageDivider组件主要实现大量数据在结果页面 中的分页处理。 MyPool组件则是对开源数据库连接池包DBPool L2 的 封装类,Model层的组件只需凋用MyPool组件即可完成对数 据库的访问。 DBPool数据库连接池包,需要一个配置文件: dbpoo1.Properties。 CodeProducer是我们根据框架中的各部分都是 相对比较固定的情况,扩充编写的一个代码生成器。 2.2配置文件修改 . 从图3中可以看出,在剪裁后并扩充的框架中, Struts框架的Struts—config ̄xml配置已经被Struts.prop— erties文本文件所代替。用文本文件代替XML配置 文件的好处有两方面:(1)开发时配置起来比较简 单,开发人员更容易掌握;(2)在Web容器加载配置 文件时效率更高,当应用系统的模块很多时,Struts— config.xml文件往往比较大,而系统读取文本文件比 读取并解析XML文件要快。 在Struts.properties配置文件中,采用key=value 的形式进行配置,约定key的命名采用模块名加操作 名的方式,因此不会出现key重名的问题。 配置信息的读取由框架中的ProprtiesOperate组 件完成,它把Struts.propetries文件的(key,value)对 读取到一个全局变量urlMappings中,urlMappings的 数据类型是HashMap。ProprtiesOperate读取配置文 件的行为,由ActionServlet组件的init方法触发。 2.3页面数据校验脚本由UIChecker组件动态生成 在Struts框架中,对JSP页面中数据项的校验需 维普资讯 http://www.cqvip.com 122 计算机与现代化 2008年第3期 要在请求发送到服务器端才能处理,这一方面增加了 开销,另一方面增加了安全风险。因此我们去掉了 Struts的Validator部分,并增加UIChecker组件来处 理页面数据的校验。 在UIChecker组件中,提供动态生成JavaScript 脚本到JSP页面的方法。生成的JavaScript脚本主要 完成数据类型的校验(如整数、数字、日期、邮箱、电 话号码、身份证号码等)、数据长度校验、空串校验 等。页面数据校验事件直接在客户端执行。 UIChecker只需要知道需要校验的对象所在的 FORM名称、校验对象的名称、校验不通过时的提示 信息,即可给调用者(JSP页面)返回所需的全部 JavaScript脚本。 在JSP页面中调用UIChecker组件的代码片段如 下: <!一-javascript校验一> <%UICheeker uiCheck=new UICheeker(); uiCheek.setFormName(”MyForm”); uiCheek.fueNaturalNum(”NUMI”,”销售任务(台)必须 填数字”); out.pfintln(uiCheck.uiCheekScript());%> 客户端数据校验提示信息如图4。 图4客户端JavaScript脚本校验数据效果图 2.4查询结果翻页处理 在行业应用中,大多数查询模块的查询结果会非 常多,在一个页面中显示所有查询结果不现实,所以必 须对查询结果分页显示。我们在Struts框架中加人一 个PageDivider组件来实现查询结果的分页处理。 在JSP页面中只需要调用PageDivider组件,并 传入结果集以及Aciton的名称,即可获得分页处理的 所有脚本。 PageDivider组件与MyPool配合起来还可以减少 返回结果集的大小,一次只需要从数据库中检索一页 的记录即可。结果集总大小可以由MyPool执行一条 动态SQL语句而获得。该动态SQL语句由MyPool 产生。 在JSP页面中调用PageDivider组件的代码片段 如下: <%PageDivider divider=new PageDivider(); out.pfintln(divider.pageDiivder(rl,”Sell—month—query. do”));//传人查询结果集与Action%> 在JSP页面中调用PageDivider后的界面如图5。 颤 l嘲-照 页王莉 I]簟 页, 删 嘲 图5分页处理效果图 2.5数据库连接池包的应用与扩充开发 虽然Web服务器通常都自带有数据库连接 池 剖,并可以在Web应用中使用,但是使用特定 Web服务器的数据库连接池会给应用的移植带来一 些不便。另外,在每一个业务逻辑处理Bean中都重 复编写调用数据库连接池的代码也是一件非常繁琐 的事情。因此在Struts框架中加人一个MyPool组件 来实现数据库连接的处理。 在MyPool组件中实现了所有应用中可能调用方 法,并且应用代码中不再需要对数据库连接的申请及 释放进行干预,也隐藏了使用哪一个连接池包的细 节,应用代码中只需要简单调用MyPool组件提供的 方法即可。在MyPool组件中我们目前使用的数据库 连接池包是:DBPool ,DBPool是一个优秀的开源数 据库连接池项目。 在业务Bean中调用MyPool的代码片段如下: String sql=”…”: try{result=MyPool。getReslutSet(WebKeys.MYPOOL— SOURCE,sq1); if(reslut。next()){.一} }catch(SQLException e){.・-} 2.6代码生成器 由于剪裁后的框架的各个部分比较固定,开发应 用一个模块的步骤也比较固定,因此我们在Struts框 架中增加了一个代码生成器组件:CodeProducer。该 生成器组件只需配置需要访问的库表、模块路径,以 及库表和模块的说明文字,即可自动生成一个简单模 块的85%以上的代码,包括配置文件及代码注释等。 使用该代码生成器,要求首先创建好数据库表,并 在每—个字段的comment中填人说明信息(这也通常是 数据表创建的要求),其中说明信息前一位约定为T、c、 R、K中的—个字母,T表示该字段采用文本框显示,C表 -;w ̄qz段采用下拉框显示,R表示该字段采用单选按钮 标识,K表示该字段采用多选按钮标识。 在填人库表名、模块路径,以及库表和模块的说 明文字后,运行该程序,即可自动生成代码。 使用时所填写的信息的代码片段如下: public class CodeProdueerI・・・ public static void main(String[]a ){ 维普资讯 http://www.cqvip.com
2008年第3期 朱伟林等:一种适合快速开发行业应用的Web框架 123 CodeProducer producer=new CodeProducer(); 的开发。这些系统的使用情况良好,业务变更与扩充 灵活快速,业务处理效率高。 该框架还有一些需要提高的地方,比如性能的进 步优化、界面开发的进一步耦合等等。下一步在新 的行业应用开发中,将通过引入其它开源项目的组件 一// ¥ ¥¥¥ 请在下面填人这几 个必须参数 ¥ ¥ Stirng TableName=”SYSPARAM”;//数据表名 Stirng TableNameCn=”系统参数表”;// ̄E明信息 Stirng ModulePath=”base.sysparam”;//模块路径 Stirng ModulePathCn=”基础信息管理.>系统参数配 置”;//模块路径说明 if((TableName!=null&&!TableName.equals(””))&& (ModulePath!=null&&!ModulePath.equals(””))){…} else{Debug.print(”您没有输入相关参数或者您的输入 不全!”,4);} } 来解决这些问题。 参考文献: [1]The Apache Software Foundation.Strum技术主页[EB/OL]. http://jakarta.apache.org/struts/index.html,2001 ̄1-01. [2](;ites Winstanley,DBPool技术主页[EB/OL].http:// homepeges.nil&am.CO.uk/ ̄slink/java/DBPool/,X1 ̄.O501.- [3]Ted Husted,等.实战Struts[M].黄若波,程峰,程繁科 译.北京:机械工业出版社,2005. 3 结束语 我们以行业应用为背景,通过对开源web框架 Struts进行一些剪裁与扩充,构建一个结构清晰、配置 [4]张桂元,贾燕枫.Stmts开发入门与项目实践[M].北 京:人民邮电出版社,2005. [5] [英]Patirck Lightbody,Jason Carcirra.WebWork in Ac- tion[M].Manning Publications Co.,2006. [6]林信良.Spring技术手册[M].北京:电子工业出版社, 2006. 灵活、可扩展性好、易于学习与使用的Web应用框 架。该框架能很好地被应用于行业web应用的开发 中,使用该框架将能提高开发效率、减少培训成本、减 少重复劳动、提升应用效果。目前,该框架已经应用 于4个中型电信行业系统(大客户管理系统、集团客 户管理系统、代理商管理系统、客户关系管理系统) (上接第119页) [7] 黄伟.在JSP中使用连接池优化数据库访问效率[J].计 算机应用,2002,22(4):67-70. [8]周彩兰,陈才贤.基于Java的Web数据库连接池高效 管理策略[J].武汉理工大学学报,2004,26(5):3841. 可以看到这里的代码使用了类似XPath的语法 来获取数据。相对的维护性、扩展性较强,代码也较 容易理解。这里有一些统计数据,一般情况下一个 120—150M的BasicXML的处理,会占用200—250M 左右的内存。VTD的内存效率是DOM的4到6倍。 而在处理速度上也较快,基本上只需要60秒左右就 能把EDI文件格式化成最终的数据。可以说无论是 时间上还是空间上VTD都能够满足现有企业对EDI 这种超大型数据文件的处理要求。 以下是一组取自VTD网站的数据比较(VTD网站: http://vtd—xm1.soureeforge.net/): DOM defe DOM full VTD.XML Ind 3结束语 VTD作为一种新兴的XML处理技术,虽然它还 存在着一些不足之处,但是它为我们提供了一种非常 高效的XML处理方式,为XML的发展扫除了技术上 red(ms) po—smal1.xml(6, 780 b(ms) 1.6892 exing(ms) 0.O62 2.186 ytes) po.。medium.xml 的一大障碍,在EDI这种B2B的超大数据交换场景 中将发挥非常大的作用。 参考文献: (112,238 bytes) 31.94 26.69325 0.816 po—big.xml(1, 286060.,823 bytes) 57 274.12 10.248 [1]维基百科(中文网站).B2B[DB/OL].http://zh.wikipe- dia.or#wiki/B2B,2007-09-14. [2]维基百科(英文网站).Electronic Data Interchange介绍 [DB/OL].http://en.wlkipedia.org/wiki/Electronic—Data —Interchange。2007-12.18. (下转第126页)