您现在的位置是: IT外包 ->网络编程 ->java ->
 
本文关键字: Webwork文件上传
Webwork文件上传
作者: 不详 | 发布时间: 2007-10-09 20:10 | 信息类别: java | 访问人次:
评论 推荐 打印 编辑 】 【 关闭
  

  
  WebWork利用ognl实现的资料绑定是非常实用的功能, 能够避免繁琐调用request.getParameter, object setter, 也不需要任何的多余配置文件, 再加上转换器的功能( http://forum.javaeye.com/viewtopic.php?t=10507 ), 我们就可以用一个业务对象, 从前台一直串到后台, 再也不需要考虑String转化, 不需要DTO, 不需要FormBean了.

  如果能够把web应用上常见的上传文件也用数据绑定来实现, 那么就是非常完美了: action再也不需要了解任何web信息, 需要对具体的Object进行操作, 就调用getObject, 需要对用户上传的文件进行操作, 就调用getFile.

  在webwork2.1.5以前, wiki上有一篇文档: http://wiki.opensymphony.com/display/WW/File+Upload+Interceptor, 介绍了如何实现这种做法, 在2.1.5以后, 这个拦截器被加入了正式release版本里面: com.opensymphony.webwork.interceptor.FileUploadInterceptor

  先来看一下我们的Action:

代码
public class Upload implements Action {
private File[] uploadFiles;

public String execute() throws Exception {
//store uploadFiles ...
}

public void setUploadFiles(File[] uploadFiles) {
this.uploadFiles = uploadFiles;
}
}

  我们可以看到这个Action相当的简单, 只要定义一个File类型的属性以及setter, 我们就可以用这个File对象来作任何事情了.

  页面和普通的upload页面没有区别:

代码
<form .... enctype="multipart/form-data">
....
File 1: <input type="file" name="uploadFiles">
File 2: <input type="file" name="uploadFiles">
<form>

  需要注意栏位名称和Action的属性同名就可以了, 剩下的事情就是配置拦截器:

xml 代码
<interceptors>
<interceptor name="upload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/>

<interceptor-stack name="uploadStack">
<interceptor-ref name="upload"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>

<action name="doUpload" class="yourPackage.Upload">
<interceptor-ref name="uploadStack"/>
<result name="success">...</result>
</action>

  除此之外, 这个拦截器还提供了额外的信息: ContentType和FileName供我们使用:

   [File Name]ContentType: 文件的ContentType(可以用在做download的时候)
   [File Name]FileName: 实际的文件名

  在上面的action例子里, 那么有uploadFilesContentType和uploadFilesFileName这2个属性, 也能够被自动绑定.

  具体的代码可以参考webwork的upload example

  结论:灵活运用拦截器可以让原本复杂,繁琐的工作变得轻松,简单.

  另补充几点:

  webwork的文件上传实际上是封装了几种通用的File Upload lib,并不是自己实现的,这它包括了pell,cos,apache common三种实现。

  cos是oreilly的包,访问地址在http://servlets.com

  cos包的功能是最全面的,也是我最喜欢用的文件上传lib

  apache common 是apache的common中的一个

  pell的来源我没有考证过。

  webwork对这三个包的封装有些类似apache common logging,提供了一个通用的访问接口,至于具体用什么,则在webwork.properties中配置。

  就我的经验来看,如果你直接使用Webwork的FileUpload拦截器,我一定推荐你使用pell,因为当你上传中文文件名称的文件的时候,只有pell包会正确的获得中文文件名称,apache common会将文件名称改为xxxxxxx.tmp这样的文件名,而cos会乱码,因此我们唯一的选择只有pell。

  我不了解pell和apache common,但是webwork的封装丧失了很多cos的功能。cos需要设置request的character encoding,但是webwork的封装没有设置,所以就导致了cos的乱码问题,当然如果你单独使用cos,则会避免此类问题。

  在webwork的file upload 拦截器功能中,它提供的File只是一个临时文件,Action执行之后就会被自动删除,因此你必须在Action中自己出来文件的存储问题,或者写到服务器的某个目录,或者保存到数据库中。如果你准备写到服务器的某个目录下面的话,你必须自己面临着处理文件同名的问题,但是实际上cos包已经提供了文件重名的自动重命名规则。

  因此我的建议是不复杂的应用直接使用webwork的拦截器,复杂的应用自己写拦截器调用cos来完成。

来源:睛品网络 www.jinpn.com
评论 推荐 打印 编辑 】 【 关闭
『相关链接』
【郑重声明】【上海IT外包服务网】 刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何投资或其他建议。转载需经作者本人同意并注明出处。本网站有部分文章是由网友自由上传。对于此类文章本站仅提供交流平台,不为其版权负责。如果您发现本网站上有侵犯您的知识产权的文章,请发信至 或直接电话联系: 021-58878998
请您留言
『发表评论』
匿名发表 会员ID: 密码:

上海蝶应信息科技有限公司
上海市 +0086-21-58878998 11394019
dieying@541help.com +0086-21-58878998HappyFreeAngel@hotmail.com
Copyright@2012 IT-WAIBAO.COM Inc.沪ICP备05039378号 版权所有2005-2012管理员登陆