转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> JAVA开发 >> 正文
使用JSF和MyFaces实现文件上载         ★★★★

使用JSF和MyFaces实现文件上载

作者:闵涛 文章来源:闵涛的学习笔记 点击数:797 更新时间:2009/4/22 23:29:40
天极软件专题专区精选     到天极软件“读编交流区”畅所欲言 Google专区 POPO专区 QQ专区 QQ挂机 了解Web2.0 Flash MX 视频教程 Photoshop视频教程 网页设计视频教程 照片处理数字暗房 PPT动画演示教程 Excel动画教程集 Word动画演示教程 Windows Vista专区 特洛伊木马专区 黑客知识教程专区 防火墙应用专区 注册表应用专区 Windows API开发专区 网络编程专区 VB数据库编程专区 图像处理与多媒体编程
  Web浏览器为我们利用Web应用程序发送文件提供了一条简单的途径,但是当前版本的Java Web标准(servlets、JSP和JSF)却无法为我们提供任何帮助。幸运的是,有一些第三方框架组件(例如Apache Commons File Upload、 Apache MyFaces和Oracle ADF Faces)实现了这种特性,它们都暴露了简单的API和定制的标记(tag)。

  本文的前面一部分介绍文件上载操作是如何实现的,解释了MyFaces和通用文件上载(前者在内部使用了后者)。我们了解这些开放源代码框架组件的内部工作方式是非常重要的,因为只有这样我们才能高效率地使用它们,才能根据自己的需要对它们进行修改。本文的第二部分将介绍一个简单的应用程序,它让用户使用web浏览器上载文件。

  基于Web的文件上载

  我们把"上载"这个专业术语用得有点过滥了。Web管理员在自己的站点上发布文件的时候,它会说自己"上载"了一个文件。Web开发者在建立HTML窗体和脚本,让普通用户通过web浏览器发送一个文件的时候,他也会说自己实现了文件"上载"功能。

  这两种含义在某些方面是重叠的,因为web管理员可能使用基于web的界面来发布文件(页面、图像、脚本等等)。免费提供个人web站点的公司(例如Yahoo),实现基于web的文件上载功能的目的是为了让人们上载自己的页面。它允许任何一个拥有web浏览器和互联网访问能力的个人发布一个小型的web站点。但是,目前有一些更好的、可用于发布web内容的方式,例如FTP或安全FTP。在这种情况下,你可以利用专用的应用程序(例如FTP客户端)代替web浏览器把自己的内容上载到web服务器上。

  本文从web开发者的角度来讨论文件上载的问题。例如,一个基于web的邮件应用程序(例如Yahoo邮件),就实现了文件上载,因为只有这样,用户才能够发送那些带有附件的消息。另一个比较好的例子是找工作的web站点,它允许用户把自己的简历发送给招聘人员。本文的示例应用程序计算上载文件的散列值。你可以在自己的应用程序中对上载的文件进行任意的处理,例如把它们的内容存储在数据库中或把它们作为邮件附件发送。现在,让我们看看如何在web应用程序中实现文件上载吧。

  一个HTML窗体中可以包含一个或多个<input type="file">元素,浏览器把它们作为输入字段来显示(呈现),在这些字段中允许用户输入文件路径。在每个文件输入字段的后面,web浏览器会添加一个按钮,它会打开一个文件对话框,让用户选择一个文件(代替输入路径):


图1:包含文件输入字段的web窗体
  当用户点击窗体的"提交(Submit)"按钮的时候,web浏览器对窗体的数据进行编码,其中包括被选中的文件、文件名(或路径)和窗体的其它一些参数。接着,浏览器把编码后的数据发送给web服务器,web服务器把这些数据传递给<form>标记的action属性所指定的脚本来处理。如果你开发一个Java web应用程序,那么操作脚本可能是一个servlet(小服务程序)或JSP页面。

  由于窗体数据默认的编码方式和默认的GET方法都不适合文件上载,所以包含文件输入字段的窗体必须在<form>标记中指定multipart/form-data编码方式和POST方法:

<form enctype="multipart/form-data" method="POST" action="...">
...
<input type="file" name="...">
...
</form>
  但是事情并非这么简单,因为实现servlet和JSP规范的应用程序服务器不一定能够处理multipart/form-data编码方式。因此,你必须分析请求的输入流,例如Apache通用文件上载就是一个小型的Java程序包,它让你能够从编码的数据中获取被上载文件的内容。这个程序包的API是很灵活的,它允许你把小文件存储在内存中,把大文件存储在磁盘的临时目录中。你可以指定一个文件大小的阀值,大于这个值的文件都会被写到磁盘上,而不会保留在内存中,而且你还可以规定允许的被上载文件的最大大小。

  前面提到的org.apache.commons.fileupload程序包包含一个叫作DiskFileUpload的类,它的parseRequest()方法获取HttpServletRequest参数,并返回org.apache.commons.fileupload.FileItem实例列表。编码后的窗体数据从servlet请求的getInputStream()方法所返回的数据流流中读取。FileItem这个名字容易使人误解,因为这个接口的实例同时表现了被上载的文件和正常的请求参数。

  通用文件上载程序包所提供的API赋予了你访问分解后的窗体数据的权利,但是servlet请求的getParameter()和getParameterValues()方法却无法工作。这是一个难题,因为在输入字段、检查框、单选框和列表框后台运行的JSF组件需要调用这两个方法。我们可以利用Servlets API提供的两个特性(过滤器和请求包装器)来解决这个问题。下一部分描述了Apache MyFaces如何实现过滤器,添加了大量必要的对文件上载的支持,而不会中断已有的JSF组件。此外,MyFaces为JavaBeans提供了API,同时还提供了一个定制的JSF组件,它表现为<input type="file">元素。


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台