- 浏览: 1333765 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
Web 门户为用户提供了访问各种资源和服务的中心网关。与此同时,它们还为用户提供了与其他用户进行资源共享的平台。从照片到音频、视频文件再到研究用的科学数 据集,用户可以共享任何内容。因此,文件上载是 Web 门户的一种基本的必备功能。
当今的 Web 门户在很大程度上依赖于 Java portlet 技术。虽然很多使用 Ajax 的开发人员都给出了各种各样的文件上载进度条解决方案,但我们还没有听说过哪个是基于 portlet 的。本文展示了如何开发基于 Ajax 的文件上载 portlet,此 portlet 能显示文件上载过程的进度条。此 portlet 对于那些想要共享大型音频、视频和科学文件的人士尤其有用。
要跟上本文的进度,您应该对使用 Java Servlets 和 JavaServer Pages (JSPs) 进行 Web 开发十分熟悉。而且,还必须了解门户和 portlet 技术的开发。当然,如果您对 portlet 技术还不怎么精通,也不要现在就放弃本文,因为您会在本文中看到对 portlet 技术的简单介绍,以及一些有用的资源可用来帮助您加快学习的进程。
在测试本文给出的这个文件上载 portlet 前,可以考虑尝试使用一种遵从 JSR 168 规范的门户框架,比如 IBM® WebSphere® Portal Server、Apache Pluto、eXo 平台或 Liferay Portal。我们在本文中使用的是 Apache Pluto 1.0.1、JDK 5.0 Update 10 和 Apache Ant Version 1.6.5。
一般地,可以将 portlet 视为一种 Web 组件。Portlet 与 servlet 类似,但前者更关注于应用程序的表示层。portlet 的典型输出是 HTML 片断,这些片断可由 Web 门户随后再组装起来。Portlet 本身由 portlet 容器管理。portlet 的主要特性包括:
- 多模式 :portlet 可以在不同的模式下有不同的视图。例如,除了查看 模式,portlet 还支持编辑 模式以便用户可以设置其自身的首选项。
- 多个窗口状态 :portlet 可以最小化、最大化等。
- 可定制参数 :portlet 可以定义参数,而这些参数可以由用户定制。
要获得有关 portlet 的更多详细信息,可以参考 Java Portlet Specification 1.0,JSR 168(JSR 168 的后续版本 JSR 286 预计会于 2007 年后半年发布,其中包含了一些改进,比如 portlet 间通信和 portlet 过滤器)。相关链接,请参看 参考资料 。
文件上载 portlet 的基石是 Apache Commons FileUpload 包(本文也称之为 FileUpload)。除了支持 servlet 内的文件上载外,Apache Commons FileUpload Version 1.1 包还支持 portlet 中的文件上载。本文使用的是 Apache Commons FileUpload 版本 1.2。
基本上,开发文件上载进度条需要两步:
- 在服务器端检索文件上载过程
- 从门户服务器进行客户端的文件上载检索和显示
FileUpload 包支持使用侦听器检索文件上载过程。在文件上载 portlet 的 doUpload()
方法(称为 uk.ac.dl.esc.gtg.myportlets.fileupload.FileUploadPortlet
,
包括在本文 下载
部分所提供的源文件中),通过调用 setProgressListener()
方法为 PortletFileUpload
设置过程侦听器,如 清单 1
所示:
- DiskFileItemFactory factory = new DiskFileItemFactory();
- PortletFileUpload pfu = new PortletFileUpload(factory);
- pfu.setSizeMax(uploadMaxSize); // Maximum upload size
- pfu.setProgressListener(new FileUploadProgressListener());
侦听器 FileUploadProgressListener
(参见 清单 2
)可实现 org.apache.commons.fileupload.ProgressListener
接口。update()
方法自动由 FileUpload
包调用以刷新有关所传输字节数的最新信息。在本文的实现中,每传输 10KB 数据则更新一次进度。这有助于防止更新进行得太频繁。 getFileUploadStatus()
方法用来计算当前文件上载进度,可由客户机通过 DWR 调用(在下一节讨论)。
- package uk.ac.dl.esc.gtg.myportlets.fileupload;
- import java.text.NumberFormat;
- import org.apache.commons.fileupload.ProgressListener;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class FileUploadProgressListener implements ProgressListener {
- private static Log log = LogFactory.getLog(FileUploadProgressListener. class );
- private static long bytesTransferred = 0;
- private static long fileSize = -100;
- private long tenKBRead = -1;
- public FileUploadProgressListener() {
- }
- public String getFileUploadStatus() {
- // per looks like 0% - 100%, remove % before submission
- String per = NumberFormat.getPercentInstance().format(
- (double ) bytesTransferred / ( double ) fileSize);
- return per.substring(0, per.length() - 1);
- }
- public void update( long bytesRead, long contentLength, int items) {
- // update bytesTransferred and fileSize (if required) every 10 KB is
- // read
- long tenKB = bytesRead / 10240;
- if (tenKBRead == tenKB)
- return ;
- tenKBRead = tenKB;
- bytesTransferred = bytesRead;
- if (fileSize != contentLength)
- fileSize = contentLength;
- }
- }
服务器和客户间就文件上载过程的通信是通过使用 Ajax 实现的。我们选用 Direct Web Remoting (DWR) 来提供 portlet 中的 Ajax 支持。DWR 是一种面向 Java 开发人员的理想框架,可用来将 Ajax 引入 Web 开发过程中,原因是它可以让浏览器中的 JavaScript 与服务器端的 Java 对象互动。要在 portlet 中使用 DWR,必须执行以下步骤 (更多有关如何配置 DWR 的信息,请参看 参考资料 ):
DwrServlet
(参见 清单 3
)。 FileUploadProgressListener
针对 DWR 定义以便客户机可以调用这个自动生成的 JavaScript。此外,只有 getFileUploadStatus
方法可以被客户机调用,另一个公共方法 update
则不允许被访问(请参看 清单 2
)。 清单 3. 在 WEB-INF/web.xml 中配置 DwrServlet
- <!-- DWR servlet -->
- < servlet >
- < servlet-name > dwr-invoker </ servlet-name >
- < display-name > DWR Servlet </ display-name >
- < servlet-class > org.directwebremoting.servlet.DwrServlet </ servlet-class >
- < init-param >
- < param-name > debug </ param-name >
- < param-value > false </ param-value >
- </ init-param >
- </ servlet >
- <!-- DWR servlet mapping -->
- < servlet-mapping >
- < servlet-name > dwr-invoker </ servlet-name >
- < url-pattern > /dwr/* </ url-patter >
- </ servlet-mappin >
- <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
- "http://getahead.org/dwr//dwr20.dtd">
- < dwr >
- < allow >
- < create creator = "new" javascript = "FileUploadProgressListener" >
- < param name = "class"
- value = "uk.ac.dl.esc.gtg.myportlets.fileupload.FileUploadProgressListener" />
- < include method = "getFileUploadStatus" />
- </ create >
- </ allow >
- </ dwr >
清单 5
所示的 JSP 文件
fileupload-view.jsp 展示了 DWR 如何有助于从服务器端检索文件上载过程。一旦选中了文件并单击了 Upload
按钮(参看 图 1
),fileupload_ajax_query_upload_status()
方法会被即刻调用。此方法之后会以异步模式调用 FileUploadProgressListener
的 getFileUploadStatus()
方法(参见 清单 2
)。DWR
的妙处就在于此:客户机可以和服务器端的 Java 对象交互。一旦收到响应,fileupload_ajax_show_upload_status()
方法会被调用以刷新此过程。如果文件上载没有完成,更新后的过程就会在两秒种之后检索。
清单 5. 文件上载 portlet JSP 文件 —— fileupload-view.jsp
- < %@ page session = "false" % >
- < %@ page contentType = "text/html" % >
- < %@ page import = "javax.portlet.PortletURL" % >
- < %@ taglib uri = "http://java.sun.com/portlet" prefix = "portlet" % >
- < portlet:defineObjects />
- < mce:script type = "text/javascript"
- src =' < %= renderResponse.encodeURL(renderRequest.getContextPath()
- + "/dwr/interface/FileUploadProgressListener.js") %> <!--
- '>
- // --> </ mce:script >
- < mce:script type = "text/javascript"
- src =' < %= renderResponse.encodeURL(renderRequest.getContextPath()
- + "/dwr/engine.js") %> <!--
- '>
- // --> </ mce:script >
- < mce:script type = "text/javascript"
- src =' < %= renderResponse.encodeURL(renderRequest.getContextPath()
- + "/dwr/util.js") %> <!--
- '>
- // --> </ mce:script >
- < mce:script type = "text/javascript" > <!--
- function fileupload_ajax_query_upload_status() {
- FileUploadProgressListener.getFileUploadStatus
- (fileupload_ajax_show_upload_status);
- return true;
- }
- function fileupload_ajax_show_upload_status(status) {
- if (status == "100")
- document.getElementById("fileupload_progress").innerHTML
- ="File successfully uploaded" ;
- else {
- document.getElementById("progressBar").style.display = "block" ;
- document.getElementById("fileupload_progress").innerHTML =
- "Uploading file: " + status
- + "% completed, please wait...";
- document.getElementById("progressBarBoxContent").style.width =
- parseInt (status * 3.5) + "px";
- setTimeout(fileupload_ajax_query_upload_status, 2000);
- }
- return true;
- }
- // --> </ mce:script >
- < mce:style type = "text/css" > <!--
- #progressBar {padding-top: 5px;}
- #progressBarBox {width: 350px; height: 20px; border: 1px insert; background: #eee;}
- #progressBarBoxContent {width: 0; height: 20px; border-right: 1px solid #444;
- background: #9ACB34;}
- --> </ mce:style > < style type = "text/css" mce_bogus = "1" > #progressBar {padding-top: 5px;}
- #progressBarBox {width: 350px; height: 20px; border: 1px insert; background: #eee;}
- #progressBarBoxContent {width: 0; height: 20px; border-right: 1px solid #444;
- background: #9ACB34;}</ style >
- < h4 > File Upload </ h4 >
- <!-- the upload form -->
- < % PortletURL pUrl = renderResponse .createActionURL();
- %>
- < form action = "<%= pUrl.toString() %>"
- enctype = "multipart/form-data" method = "post"
- onsubmit = "setTimeout('fileupload_ajax_query_upload_status()', 1000)" >
- < input type = "file" name = "fileupload_upload" value = "Upload File" >
- < input type = "submit" value = "Upload" >
- </ form >
- < %-- file upload progress bar --% >
- < div id = "fileupload_progress" > </ div >
- < div id = "progressBar" style = "display: none;" mce_style = "display: none;" >
- < div id = "progressBarBoxContent" > </ div >
- </ div >
用 Apache Pluto 部署和测试文件上载 portlet
此过程的下一步是用 Apache Pluto 1.0.1. 部署和测试文件上载 portlet(注意: 本 文使用的是二进制版本)。
本文附带的可下载的 portlet 源代码同时还提供有 Ant 脚本,以便能够编译 portlet 和构建部署所需要的 .war
文件。首先,必须将如下的二进制文件复制到源代码根目录下的 lib
目录:
- commons-fileupload-1.2/commons-fileupload-1.2.jar
- commons-io-1.3/commons-io-1.3.jar
- commons-logging-1.0.4/commons-logging-1.0.4.jar
- dwr-2.0.1/dwr.jar
- portletapi-1.0/portlet.jar
- servletapi-2.4/servletapi-2.4.jar
之后,就可以运行 ant build
和 ant war
以编译代码和相应构建部署所需的 .war 文件。如果一切顺利,myportlets-fileupload.war 就会出现在 dist
目录下。执行如下步骤以利用 Apache Pluto 1.0.1 部署 portlet:
- 启动 Apache Tomcat 并访问
http://localhost:8080/pluto/portal
。 - 单击 Pluto 屏幕左侧的 Admin 链接来部署此 portlet。
- 找到 myportlets-fileupload.war,然后单击 Submit 。
- 定义 portlet 标题、描述和布局,然后单击 Submit 。
- 再次单击所显示页面上的 Submit 。
现在,系统会提示您或者重启 Tomcat,或者单击链接 Hot deploy myportlets-fileupload
portlet application
。我们建议您单击链接 Hot deploy myportlets-fileupload
portlet application
。之后,此 portlet 会被加载,如 图 1
所示:
图 1. 运行于 Apache Pluto 中的文件上载 portlet
一旦部署完此 portlet 之后,就可以上载文件了。要显示出此进度条,应该从计算机而不是从门户服务器访问此 portlet。执行如下步骤上载文件:
- 单击 Browse... 按钮选择要上载的文件。
- 单击 Upload 按钮上载选中的文件。在文件上载期间,会显示并更新进度条(参见 图 2 )。
如果从安装了 Pluto 的计算机测试此 portlet,就不会看到进度条,原因是所设置的上载大小最大为 20MB。通过在
WEB-INF/portlet.xml 文件内更改 fileupload_upload_maxsize
可以改变此上载大小。
在我们的 portlet 中,所上载的文件作为磁盘文件保存在 java.io.tmpdir 下 —— 比如,位于 $PLUTO_HOME 或 $CATALINA_HOME 下的 temp。请注意在实际的 Web 应用程序中,可能还会需要进一步的处理。比如,所上载的文件可能需要存储在数据库中以备后用;如果是图像文件,它就有可能显示在 Web 浏览器内。
本文所探讨的技术已经被成功应用到文件传输 portlet,该 protlet 采用 GridFTP 协议管理两个第三方数据网格节点之间的大型数据集。
本文讨论了如何使用 Ajax 部署文件上载 portlet 以显示进度条。介绍了如何利用过程侦听器进行服务器端的文件上载过程检索,如何使用 DWR 从门户服务器进行客户端的文件上载检索,以及如何将进度条呈现给终端用户。此 portlet 对于共享诸如音频、视频文件和科学数据这类大型数据集尤其有用。本文也展示了使用 DWR 为 JSR 168 portlet 提供 Ajax 支持是多么地容易。
发表评论
-
Smack 体系结构
2011-09-20 11:17 4014Smack 体系结构 Zhuam (zhuam... ... -
gson
2011-09-06 20:59 1942Gson User Guide Con ... -
缓存总结
2010-10-25 22:56 1122XXXX项目是目前在实际工作中正在做的事情,该项目是一个大 ... -
freemarker 基本指令
2010-10-25 22:47 1411一:if指令: <#if condition>.. ... -
用freemarker生产静态页面
2010-10-25 22:46 2275FreeMarker概述 * FreeMarker是一 ... -
通用大型网站页面静态化解决方案(二)
2010-10-25 22:44 3245在开发大型网站时,避免不了处理大量的页面静态化操作,这样方便加 ... -
通用大型网站页面静态化解决方案(一)
2010-10-25 22:43 35207最近自己做了一个做网络广告的网站叫全方位商机平台的项目,由 ... -
如何在spring框架中解决多数据源的问题
2010-10-24 16:23 1619在我们的项目中遇到这 ... -
NetLog 大规模应用实战:Database-sharding 技术
2010-10-24 15:19 1519一、背景 Netlog是一家社交网站社区,目前拥有大规模的应 ... -
java利用poi读写Excel需要注意的问题
2010-10-20 10:17 5389接到用Java进行数据库与 ... -
FreeMarker demo
2010-08-25 14:53 3920写道 import freemarker.templ ... -
jfreechart demo2
2010-06-29 00:52 3290写道 package com.ijo.demo; impor ... -
jfreechart demo
2010-06-28 22:25 1787写道 package com.ijo.demo; impor ... -
openfire
2010-04-19 18:03 1164openfire http://openfireteam.b ... -
采用dwr+ajax和struts开发文件上传进度条(转)
2010-01-22 00:16 1799采用dwr+ajax和struts开发文件上传进度条 编 ... -
采用dwr+ajax和struts开发文件上传进度条(转)
2010-01-22 00:11 1554采用dwr+ajax和struts开发文件上传进度条 编 ... -
dwr3 反转ajax例子
2009-12-28 13:23 4398这段时间我主要对jQuery学习和研究,当学习的了Ajax的实 ...
相关推荐
文件上载Portlet是Web应用程序中的一个组件,主要用于在用户界面上接收并处理用户上传的文件。Portlet是Java Portlet API定义的一种可重用、可组合的Web部件,它在门户环境中运行,如Liferay、Pluto等。在这个特定的...
第 17章 基于 JSON-RPC-Java 的 Ajax 应用:在线相册 26 17.1 实现 Hibernate 持久层 26 17.1.1 设计 Hibernate 的持久化类 26 17.1.2 完成配置文件和映射文件 28 17.1.3 数据库的设计 31 17.2 实现 DAO 组件 ...
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx
社会经济繁荣发展的今天,电子商务得到了飞速发展,网上交易越来越彰显出其独特的优越性,在人们的日常生活中,出现了各种类型的交易网站。其中一个就是车辆易主交易网站,它是一个服务于用户买卖二手车辆的交易网站,为用户提供了平等互利、方便快捷的网上交易平台,通过这一类型的网站,用户可自由出售和购买车辆。 本课题主要根据车辆本身的特性,充分发挥互联网的特点与优势,构建一个以二手车辆为商品、基于互联网平台的车辆易主业务交易管理系统,并根据车辆易主业务交易管理系统的应用需求,进行需求分析,进而对网站系统作规划设计。采用IDEA为运行平台,以SSH为框架,运用HTML语言、JSP技术、MySql数据库、JSP与后台数据库链接等关键技术建设二手车网上交易系统,构建车辆易主交易系统的会员注册与登录,网站首页展示、用户发布商品车辆,用户求购商品车辆,分页浏览、购物系统、用户后台管理、管理员用户后台管理等功能,并使这些功能得以实现并更好为用户服务。网站整体构建完成且测试成功后,用户可以进入网站进行注册、登录,登录后,用户可以在网站上发布自己的闲置车辆或者寻找想要购买的车辆,还可以收藏车辆,管理发布和收藏的车辆,