2024年4月16日发(作者:)

Struts2架构中的Commons-fileupload组件应用技术

李静梅;王超宇

【摘 要】基于HTTP传输协议的Web网页中,采用嵌人Commons-fileupload组

件的Struts2框架,实现了文件的上传与下载.利用OGNL表达式提取Session持久

层中的文件名,并利用此文件名实现下载文件的动态更名.灵活利用struts2.0自身

提供的字段类型,提高下载的鲁棒性.并列举实例体现整合技术和动态文件下载的实

用性,最后通过与以往2种常用开发框架的对比数据加以验证说明.

【期刊名称】《应用科技》

【年(卷),期】2011(038)004

【总页数】5页(P39-43)

【关键词】上传下载;Struts2架构;Commons-fileupload组件;OGNL表达式

【作 者】李静梅;王超宇

【作者单位】哈尔滨工程大学,计算机科学与技术学院,黑龙江,哈尔滨,150001;哈尔

滨工程大学,计算机科学与技术学院,黑龙江,哈尔滨,150001

【正文语种】中 文

【中图分类】TP311.1

随着Internet的飞速发展,越来越多的人参与到网络活动中.博客、Email等网络

应用如雨后春笋般大量涌现,它们充分利用了现有的网络资源,不仅给人们的生活

带来了巨大的方便,同时也正在逐渐影响、改变着人们的日常生活方式.网络应用

的大量涌现,使得在Web页面上完成基于HTTP超文本传输协议的上传下载功能

显得越来越重要.针对这一问题,近几年科研院所和一部分公司提出了一些行之有

效的可行性框架和解决方案.Struts2就是众多框架中的佼佼者.Struts2凭借其良好

的扩展性,使其在Web应用中展现出了特有的优势.

Common-fileupload是由阿帕奇基金会旗下的java开源社区Jakarta社区开发

的一款组件,主要作

OGNL expression用是提供文件管理功能.Jakarta社区是一个非常成熟的社区,

不仅有着稳定的开发团队,而且参与过Tomcat的研发,因此在利用Tomcat为

服务器的网络应用程序中,Common-fileupload组件在速度和稳定性上都具有一

定的优势.

1 Struts2框架

Struts2是Struts系列框架的第2代产品.是在Struts1和WebWork的技术基础

上进行了合并,形成的全新的框架.全新的Struts 2框架与Struts1存在着巨大的

差别.Struts2大量地借鉴WebWork相关技术,采用拦截器来处理用户的请求,

这样的设计降低了框架的耦合性,提高了框架的性能.

1.1 Struts2的体系结构

Struts2与传统的Struts框架在整个体系结构上有了很大的变化.下面对Struts2

的体系机构作下简要的介绍.图1为Struts2的体系结构图.

图1 Struts2体系结构

利用struts2体系结构展开的工作严格遵循下述开发流程:

1)浏览器发送一个请求;

2)核心控制器FilterDispatcher根据请求决定调用合适的Action;

3)WebWork的拦截器自动对请求应用调用功能,如验证等;

4)回调Action的execute方法,该execute方法根据请求的参数来执行一定的

操作;

5)Action的execute方法处理的结果信息将被输出到浏览器中,支持多种形式

的视图.

1.2 Struts2中的拦截器

Struts2框架以拦截器为所有功能的基础.根据WebWork的中文文档,其解释为

——拦截器是动态拦截Action调用的对象.拦截器提供了一种机制,不仅使开发者

可以定义一个在action执行前、后执行的代码,而且可以在一个action执行前阻

止其执行,同时还能提供一种可以提取action中可重用部分的方法.当请求到达

Struts2的拦截器时,Struts2会查找配置文件,并根据其配置文件实例化拦截器

的对象,然后串成一个列表(list),最后按照FIFO算法调用列表中的拦截器实

例化改对象.

2 文件上传

2.1 常用上传方式

基于HTTP传输协议的文件上传主要有手工上传和框架上传2种方式.

采用手工文件上传方式时是由表单元素中的enctype属性决定提交表单的方式,

并最终由该属性决定最终是以字符串方式还是以二进制编码方式提交请求.当

enctype的值为multipart/formdata时,无法直接通过HttpServletRequest的

getParameter方法获取请求参数的值,需要通过二进制流来获取请求内容,从而

实现文件的上传.这种传统手工编码方式相当繁琐,因此很少被采用.

框架上传方式是将手工上传中的一些可以由计算机自动执行的部分,由框架替程序

员完成,这样大大简化了编程,使程序更易于维护和管理.框架中的解释器通过分

析HTTP请求中的二进制流,解析出二进制流中所包含的全部表单域,并分析出

每个表单域的类型.基于框架的文件上传,允许开发者以简单的方式来取得文件域

的内容字节、文件名以及文件内容等信息.

目前主流上传下载组件主要有3种,分别是COS、JspSmartUpload和

Commons-fileupload.这 3 种组件的最大作用是提供自己的请求解释器,并通过

自身提供的解释器解析HTTP请求.Struts2由于其自身优秀的模块化设计,使程序

员可以在其上添加任何一种组件,实现自己的不同要求.经过标准测试发现,当采

用JspSmartUpload组件进行文件上传时,若上传文件大于200 M,

JspSmartUpload自身会因为堆栈溢出而崩溃,给程序带来不可预知的隐患,因

此本组件并不适合负载较重、稳定性要求比较高的应用.而COS组件单就性能上来

说,要略高于Commons-fileupload,但由于 Struts2与 Commons-fileupload

有更高的契合度,整合较为方便,因此选择后者成为实际上传时所采用的组件.

2.2 基于Commons-fileupload组件的上传

Commons-fileupload组件最重要的组成部分是自己提出的请求解释器.Struts2

采用拦截器列表实现具体功能,因此并未提出自己的请求解释器.通过上面的分析

知道,要利用框架实现文件上传,在程序提出一个上传请求后,Struts2框架本身

无法解析这样处理请求,因此文中在实现上传这个功能时的主要贡献就是将

Commons-fileupload组件中的请求解释器集成到Struts2.0框架中,通过

traditional-API实现整合的方案[1-3].在测试了上述整合方案后,发现利用

traditionalAPI实现文件上传占用的内存较多,上传速度较慢.通过阅读官方资料

发现common-fileupload组件提供了2种请求解释器,分别是TraditionalAPI

和StreamingAPI这2种方式.经具体测试发现,利用StreamingAPI方式实现上

传,能有效降低内存占用量,并能提高上传速度.因此这里采用StreamingAPI解

释器实现文件上传.当有multipart/formdata请求时,Struts2.0中的拦截器会将

请求拦截下来,并通过配置文件中关于解释器的配置信息,调用Commons-

fileupload组件中相应的请求解释器对请求作出分析,通过isFormfiled()方法

判断表单是一个普通的表单还是一个文件域,最后将解析出来的信息按照数据流方

式传给Struts2框架的拦截器,Struts2将对数据进行进一步的操作.

图2 文件上传的过程流程

实现文件上传的功能逻辑关系如图2所示.

在上述理论指导下,在此按照文件上传功能逻辑关系图进行了实际开发,通过实际

程序验证了上述理论.Struts2中的Action并不负责处理HttpServletRequest请

求,只是通过拦截器获得文件内容、文件名称和文件类型3个属性值.文件提交到

后台时,拦截器通过3个属性值来过滤文件,同时将获得的属性值传递给

Commons-fileupLoad组件的解释器,如果程序在完成上述关系图上任何一步出

错时,拦截器都会返回错误信息.

3 文件下载

3.1 利用Stream类型字段解决字符库不匹配问题

下载文件时,一般将传输数据的数据类型定义为数据库中的数据类型[4-5],这

样的优势是数据不需进行转换就可在前台页面与数据库之间来回传递并显示,降低

了编程的难度.但其也存在一个致命的缺陷,就是如果数据库与前台页面字符集不

匹配,将造成前台页面显示乱码现象.

经过分析与研究发现,在Struts2框架中有一种Stream结果类型,它的本意是处

理流类型的数据,例如图片和音乐.通过试验发现只要对数据进行适当的更改,

Stream这个字段类型除了可以处理图片、声音等数据外,还可以很好地解决字符

库不匹配问题.在提取数据库中数据时,利用 StringBufferInput-Stream函数将数

据转换成二进制流信息,然后通过Stream字段将二进制流信息传到程序的前台,

在前台利用解析程序将二进制流信息还原成原始信息进行展示.由于采用ASCII码

形式传送数据,字符库不匹配问题消弭于无形,大大提高了系统的鲁棒性.

3.2 利用OGNL表达式提取session内的文件名

OGNL(object-graph navigation language)是一种功能强大的表达式语言,

通过表达式语法,可以实现存取对象的任意属性、调用对象的方法、遍历整个对象

的结构图、字段类型转化等功能.

通过OGNL强大的存取功能,实现了文件下载时的动态更名.当用户点击下载时,

后台程序中的OGNL表达式会在整个程序的Session持久层中按照ID号提取文

件名,并在调用Windows下载API之前将文件名以动态赋值的方式传给下载API,

这样在下载对话框中显示出来的就已经是要下载的文件名,而并非像传统的处理方

式那样,在下载完毕后更新文件名.用户可以在下载的过程中直观地了解自己所下

载文件的名字.

动态文件下载的基本流程如图3所示.

图3 实现的下载功能过程流程

4 Struts2与2类常用开发框架比较

Struts2框架是在Struts1和WebWork的技术基础上进行了合并,形成的全新的

框架.在大量吸收原有框架的优点后,Struts 2已经是一个非常具有实用价值的

MVC框架.

与传统Struts框架相比,Struts2在Action类的实现上更为方便,在线程安全和

可测试方面做得都要更好.

Struts2相比WebWork来说,不再提供内在的IoC容器支持,转而将Spring作

为缺省实现,扬长避短,提高了用户体验,同时Struts2还全面引入了Dojo.

5 应用实例测试

文件上传下载在工作流引擎中的应用相当广泛,选择一种高效的文件上传下载在工

作流引擎中有其重要的实用价值.

jBPM(java业务流程管理)是一种基于J2EE的轻量级工作流管理系统,其后成

为JBoss企业中间件平台的一个组成部分,改名为JBoss jBPM.

以Struts2框架为jBPM开发的工作流引擎,便捷地增加一个文件上传下载模块.

整合思想是利用Struts2作为工作流引擎的MVC框架,将Commons-Fileuplod

作为容器,把Struts2的控制与业务逻辑组件相分离.

下面是嵌入了Commons-fileUpload组件的Struts2框架关于上传下载应用的配

置文件和核心代码:

1)配置文件核心代码:

上述代码为实现将Commons-fileupload组件中的解释器嵌入到Struts2中的配

置文件代码和通过Stream字段类型以二进制流的形式传输数据库内数据的核心代

码.下面为了凸显文中提出整合方式的优势,通过标准测试上传了4次大小不同的

文件,上传不同大小文件耗时对比结果见表1.

表1 不同组件在上传文件时的耗时对比 ms组件名称2 M 20 M 45 M 200 M

COS 245 2 391 5 000 53 520 Commons-fileupload 297 3 293 6 700 76 210

JspSmartUpload 536 4 371 8 745堆栈溢出

为使对比更直观、明显,这里参照上述数据绘制了具体如图4所示,嵌入不同组

件的Struts2框架上传速度对比图.

图4 嵌入不同组件的Struts2框架上传速度对比

一般系统所要上传下载的文件大小主要集中在2~45 M区间内,但难免有可能会

出现上传下载大文件的时候,因此选择上述几个文件大小作为测试上传的测试集

[6].根据图4可以看出,上传20 M左右的文件时,采用了Commons-

fileupload和COS组件的速度性能相差无几,但是JspSmartUpload与其他2种

的差距就已经很明显了,当文件大于200 M时,JspSmartUpload已经因为堆栈

溢出而崩溃了.通过表格和对比图可以发现,采用Commons-fileupload组件的系

统无论从速度还是稳定性上都比JspSmartUpload组件有很大提高.Commons-

fileupload与COS在上传速度与稳定性上差别不大,但是Commons-fileupload

比COS更易于整合到Struts2框架中;因此从系统整体的开发效率和性能上来说,

Commons-fileupload组件无疑是最佳选择,同时也更适合以业务为主的web环

境.

6 结束语

提出了一种将Commons-fileupload组件嵌入到Struts2中形成的新框架,该框

架已成功地应用于多种文件上传下载系统中.通过实际使用证明:带有新元素的

Struts2框架,提高了文件上传下载的速度,通过文件动态更名,增加了文件上传

下载的实用性.通过实验证明了新框架在文件上传速度和准确率上的优越性.基于

Struts2形成的新框架不拘泥于一种文件形式,符合文件上传下载的通用性,有利

于文件上传下载功能的推广,具有良好的应用前景.

参考文献:

[1]WU ical method for the lateral buckling of the struts in beam

string structures[J].Engineering Structures,2008,30(9):2301-2310.

[2]SAHOO D K,GAUTERM R th and deformation characteristics

of bottle-shaped struts[J].Magazine of Concrete Research,2008,8

(9):137-144.

[3]于银山,胡正华.基于Struts2框架的 Web应用开发[J].电脑知识与技术,

2009,5(16):59-62.

[4]段旭光,李岚,董立岩,等.基于HTTP文件上传进度显示组件的设计及实现

[J].吉林大学学报:信息科学版,2006,24(1):89-93.

[5]李林珊,郑丽娅.基于JXL的数据导入导出处理[J].计算机软件与应用,

2008,27(9):95-96.

[6]刘锦锦.基于Struts框架的Web网站开发及数据分析[D].北京:北京化工

大学,2005.