PrimeFaces 4.0 使用 p:fileDownload 标签实现文件下载

2013-12-18  来源:本站原创  分类:原创  人气:19 

这两天在使用 primefaces 4.0 做壹個下载文件的功能,去官方网站 primefaces.org 看了下,只有壹個 PDF 版用户指南各种用例的在线 Demo ,目前可以在官方网站上找到的下载案例见于 http://www.primefaces.org/showcase/ui/fileDownload.jsf,能够看到部分源代码,但是找不到整個工程,实在是很不方便。后来又通过 Google 搜索了下,终于让我在 http://networkedblogs.com/B8rUw 找到了 primefaces-showcase 源代码和 WAR 安装包的下载地址,原来是在 primefaces 自己的 repository 资源库里的,仔细看了下,是用标签 <p:fileDownload> 来实现的,具体的代码实现如下。

首先是 XHTML 页面,包含了三部分,壹個<h:form>表单,用于提交请求到后端服务器;壹個 <p:dialog>对话框,服务器响应请求之后,但是页面还没有弹出文件下载窗口这段时间里,在页面上显示壹個进度条窗口;最后壹部分是 javascript 脚本代码,用于控制上面的 <p:dialog>的显示与隐藏。

<p:dialog modal="true" widgetVar="statusDialog" header="Status" draggable="false" closable="false" resizable="false">
    <p:graphicImage value="/design/ajaxloadingbar.gif" />
</p:dialog>

<h:form id="form">
    <p:commandButton id="downloadLink" value="Download" ajax="false" onclick="PrimeFaces.monitorDownload(start, stop)" icon="ui-icon-arrowthichk-s">
        <p:fileDownload value="#{fileDownloadController.file}" />
    </p:commandButton>
</h:form>

<script type="text/javascript">
    function start() {
        PF('statusDialog').show();
    }

    function stop() {
        PF('statusDialog').hide();
    }
</script>

其中几個需要注意的地方是:1、<p:graphicImage>里的 value 属性指向了壹個 GIF 图片,这個图片实际放置在 WebRoot 的根目录下,也就是说,相对路径实际是 /WebRoot/design/ajaxloadingbar.gif ;2、在 <p:commandButton> 里有壹個 onclick 事件指向 PrimeFaces.monitorDownload(start, stop),其实这里它指定了两個方法分别是 start() 和 stop(),具体它们的表现通过 Demo 的演示效果就可以看出来。

后台部分的代码主要是 FileDownloadController ,它的内容如下所示:

package org.primefaces.examples.view;

import java.io.InputStream;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

public class FileDownloadController {

    private StreamedContent file;

    public FileDownloadController() {
        ServletContext servletContext = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();
        InputStream stream = servletContext.getResourceAsStream("/images/optimusprime.jpg");
        file = new DefaultStreamedContent(stream, "image/jpg", "downloaded_optimus.jpg");
    }

    public StreamedContent getFile() {
        return file;
    }
}

上述代码则比较简单,没有什么好说的,唯壹的地方在于 getResourceAsStream() 方法的参数是壹個文件的相对路径,这個路径也是相对于 WebRoot 的,也就是说,真正的 optimusprime.jpg 图片是放置在 WebRoot 的 /WebRoot/images/optimusprime.jpg 目录下,这样 Controller 才能正确读取到这個图片。至于 DefaultStreamedContent 这個类,则是 primefaces 框架自己提供的壹個简单的获取 stream 输入流的实现类,它原本有四個构造方法(如下所示),但是我们这里只使用了第3种。

1、public DefaultStreamedContent(InputStream stream);
2、public DefaultStreamedContent(InputStream stream, String contentType);
3、public DefaultStreamedContent(InputStream stream, String contentType, String name);
4、public DefaultStreamedContent(InputStream stream, String contentType, String name, String contentEncoding);

参数说明:
1、stream:要下载的文件的输入流对象;
2、contentType:要下载的文件的文件类型,确切的说是mimeType,如MS EXCEL2003 的mimeType 是"application/vnd.ms-excel",JPG图片的mimeType 是“image/jpg”;
3、name:给下载的文件重新指定壹個文件名(包括扩展名),会显示在浏览器端的下载窗口中;
4、contentEncoding:文件的默认编码格式,如GBK、UTF-8、GB18030等,这個字段貌似用的稍少些;

按照这样的方式,我们就可以成功的实现文件下载功能了。另外,附壹张 primefaces-showcase 的 war 包解压之后的目录结构图。

PrimeFaces 4.0 使用 p:fileDownload 标签实现文件下载

最后我想吐槽下,Primefaces 网站上的超链接和菜单排列真有够乱的,顶上的几個链接我以为是带有下拉列表的,结果点击之后是直接全页面刷新并跳转的,真正的各种菜单链接其实是放在页面底部的黑色背景区域里的,花了我好长时间才找到。而且光是通过网站我们还不能直接找到 primefaces repository 的地址,只能找到它的在线 Demo,其中有很多小的细节通过 Demo 其实是看不出来的,最好的办法是结合完整的源代码进行学习。不知道 PrimeFaces 官方是怎么想的,把個网站建设的乱七八糟。
本文重点参考了如下内容:
[1]Download PrimeFaces ShowCase and Source Code http://networkedblogs.com/B8rUw
[2]What are the Microsoft Office MIME Types http://filext.com/faq/office_mime_types.php
[3]PrimeFaces Demo War 包下载地址(包含所有的样例代码) http://repository.primefaces.org/org/primefaces/prime-showcase/1.0.0-SNAPSHOT/prime-showcase-1.0.0-SNAPSHOT.war

相关文章
  • PrimeFaces 4.0 使用 p:fileDownload 标签实现文件下载 2013-12-18

    这两天在使用 primefaces 4.0 做壹個下载文件的功能,去官方网站 primefaces.org 看了下,只有壹個 PDF 版用户指南和各种用例的在线 Demo ,目前可以在官方网站上找到的下载案例见于 http://www.primefaces.org/showcase/ui/fileDownload.jsf,能够看到部分源代码,但是找不到整個工程,实在是很不方便.后来又通过 Google 搜索了下,终于让我在 http://networkedblogs.com/B8rUw 找到了

  • get(0).tagName获得作用标签示例代码 2014-02-05

    get(0).tagName可获得作用标签,下面是它的一个小应用,在学习js的朋友可以参考下 <script type="text/javascript" src="jquery1.4.js"></script> <script type="text/javascript"> $(function(){ $(".test li,.test dd").click(function(){ ale

  • ACDSee Pro 3.0最新测试版 加入标签式快捷操作 2014-10-03

    ACDSee这款著名软件已由一款看图软件发展成为目前较为广泛使用的数字图象处理软件,被广泛应用于图片的获取.管理.浏览.优化甚至和他人的分享等!从官方发布的最新Pro 3测试版(3.0.304 Beta)来看,改进颇大,尤其是界面框架的变动,加入了标签式的快捷操作按钮,给用户全新的操作感受. ACDSee Pro 2.5英文版截图 ACDSee Pro 3.0测试版截图 AcdSee Pro 3测试版主要改进: 1.管理模式 管理模式下图片的浏览.分类排序和组织化得以改进,简化了工具栏的下拉菜单

  • javascript对select标签的控制(option选项/select) 2014-02-24

    html中的select标签,也是asp.net中的asp:DropDownList控件,接下来介绍javascript对select标签的控制,感兴趣的朋友可以了解下,或许本文对你有所帮助 html中的select标签,也是asp.net中的asp:DropDownList控件. javascript对它们的操作 一.基础理解 var e = document.getElementById("selectId"); e. options= new Option("文本&qu

  • ThinkPHP添加更新标签的方法 2014-08-17

    这篇文章主要介绍了ThinkPHP添加更新标签的方法,在前文所述删除blog标签的基础上实现同步更新标签,是ThinkPHP非常实用的技巧,需要的朋友可以参考下 本文实例讲述了ThinkPHP添加更新标签的方法.分享给大家供大家参考.具体分析如下: 我们知道,thinkphp的拓展案例blog,只告诉我们怎样去添加标签tag,却没有删除和更新标签的方法,我在前面的<彻底删除thinkphp3.1案例blog标签的方法>为拓展案例blog写了一个删除标签的方法,接下来将写一个标签的更新方法. 一

  • PHP使用DOMDocument类生成HTML实例(包含常见标签元素) 2014-11-07

    这篇文章主要介绍了PHP使用DOMDocument类生成HTML实例,包含常见标签元素,如表单.表格.CSS样式等,最后写了一个比较完整的例子,给需要的朋友参考下 在这一章节里, 我们来了解下如何利用核心(core) PHP 生成 HTML 文件 最近我在查询 php.net 的时候,发现 DOMDocument 这个类非常的有意思, 可以用来生成 XML 或 HTML 文件, DOMDocument 为我们提供了一系列的方法来生成 XML/HTML 标签并插入到 DOM 中, 现在就让我们来看

  • js(JavaScript)实现TAB标签切换效果的简单实例 2014-12-07

    本篇文章主要是对js(JavaScript)实现TAB标签切换效果的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 一个可以js(JavaScript)的tab标签切换代码,可以自动适应宽度,可以自己添加删除标签块,傻瓜式操作便能完成! <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401- 19991

  • Wordpress 2.5 Tags 标签功能 2013-12-23

    Wordpress 从 2.3 版开始推出了 Tag 功能,2.5 在 2.3 的基础上进一步完善,现在可以不用借助插件(某些高级功能还需插件才能实现),即可利用标签来有序的组织和管理文章了.下面?匪际窠?占?降 Wordpress Tags 标签相关的用法.功能,收藏并分享,希望对大家有所帮助. 一.Wordpress Tags 标签链接调用 功能:在首页.分类.归档.文章页等位置,显示文章的 Tags 标签链接. 标准语法: <?php the_tags(); ?> 带参数范例(以我的SE

  • 傲游浏览器3.0.8.11 Alpha最终版发布 2014-08-29

    今天更新的3.0版本,是Beta前的最后一个版本. 回望一年的征程,傲游3.0的开发组在各种困难中奋力前行.我们顶住多方压力,始终将重点放在核心级开发之上,而并没有为了市场效果而急于添加新功能.现在,傲游3.0使用的Webkit核心已经不是单纯的"壳浏览器"研发,而是凝聚了中国软件工程师智慧,与Safari.Chrome等浏览器并驾齐驱的Webkit核心. 今天,核心的研发仍在继续,其稳定性与可扩展性都已经到了可以开始添加功能的层次.今天这一带有aero效果.快速访问和弹窗过滤的版本是

  • 引用 JAVA标签库JSTL-EL表达式介绍使用配置手册 2010-10-16

    引用 [轰隆隆] 的 JAVA标签库JSTL-EL表达式介绍使用配置手册 JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管理格式化.XML 操作以及数据库访问. JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的.JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x.但是在即将推出的JSP

  • struts2中select标签的使用 2012-03-05

    struts2的select标签中,常用的有以下几个属性: (1)struts2中的select 标签中,必须设置的属性只有一个,即是list. (2)select标签的list中必须有值,不然会报错.如果没有值,可以加上headerKey, headerValue,这样就可以通过了.如: xml 代码 1.<s:select name="geElement.childType" list="childTypeList" listKey="key&q

  • 常用HTML标签以及各浏览器默认值 2012-09-10

    以下内容只在firefox,chrome和ie6,7,8里面测试,其他浏览器没测 <!-- ...... -->:定义注释: <!DOCTYPE>:定义文档声明,必须放到文档的第一行:HTML5的文档声明为:<!doctype html>: 块元素: <address>标签:定义文档作者或拥有者的联系信息:如果<address>位于<article>元素内容,则它表示该文章作者或拥有者的联系信息:默认 font-style:itali

  • JSTL判断server端返回的数据集合是否大于-0 2014-09-06

    直接用c标签: //引入标签库 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:if test="${empty items}"> 无数据 = items为null或者items.size<=0 </c:if> <c:if test="${not empty items}"> 有数据 =

  • 随机色云标签 2015-03-13

    <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style type="text/css"> *{ margin:0; padding:0 } a{ text-decoration:none } #wrap{ width:400px; margin:auto } </style

  • 最简洁的ExtJs5.0后台管理框架 2015-04-14

    ViewPort.js Ext.onReady(function() { Ext.create('Ext.container.Viewport', { layout : 'border', defaults : { autoScroll : true }, items : [ { region : 'north', html : ' <div text-align:center; region="north" split="true" border="

  • Linux编译安装Darwin Streaming Server 6.0.3 2013-04-15

    目前主流的流媒体服务器有微软的windows media server.RealNetworks的Helixserver和苹果公司的Darwin Streaming Server. 微软的windows media server只能在windows2000 server和windows 2003 server下使用,不在考虑之列.RealNetworks的Helixserver是一款跨平台的软件,功能也很强大,但并非免费软件. Darwin Streaming Server简称DSS.DSS是A

  • 通过 p:commandButton 的 oncomplete 属性实现其它按钮的激活与反激活 2013-12-20

    刚刚解决了壹個细小的技术问题,用 PrimeFaces 4.0 的 UI 组件完成界面元素的开发,XHTML 页面上共有三個按钮,id 分别为 verifyButton.viewButton.downloadButton,其中页面初始化时,verifyButton 处于激活状态(enable),viewButton 和 downloadButton 处于未激活状态(disable),当点击 verifyButton 之后,页面会向后台 Controller 发送 ajax 请求,然后在完成壹些业

  • Javascript 实现的数独解题算法网页实例 2013-10-23

    此算法的实现,就是模拟人脑的思考和计算过程,有需要的朋友可以参考一下 1)当我们拿到一个题目时,首先会根据已经知道的条件,进行数据的初步整理和分析. 相当于填写出9宫格里,所有的"确定项",以及标记"可能选项". function refreshStat() 2)此后,思考会进入 猜测/验证 的循环阶段. 在9宫格中,可以对于"可能选项"进行尝试,验证是否违背现有条件. 每一个新的分支,最后的结果无非是两种,答案/出错. while(true){

  • DBTree 1.3.2 2013-10-26

    1.3.2的修改 对 InsertNode进行了修改,不会再发生传送的节点id有错误而默认插入到根下的行为. (出于安全考虑而去掉) 完善了SubTree函数 添加了path函数可以得到路径 添加了alterNode可以修改节点名称以及在兄弟节点中的位置. 许可:GUN LGPL 测试地址:http://lxbzj.com/product/dbtree/index.asp DBTree使用说明 目录 简介 特点 如何使用 简介 DBTree是database tree的缩写.意思是数据库中的树形

  • ASP 高级模板引擎实现类 2013-11-08

    这个模板引擎比较方便,跟HTML结合了 Class template Private c_Char, c_Path, c_FileName, c_Content, c_PageUrl, c_CurrentPage, c_PageStr, ReplacePageStr Private TagName ' *************************************** ' 设置编码 ' *************************************** Public Pr