这两天在使用 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 是“<span></span>image/jpg”;
3、name:给下载的文件重新指定壹個文件名(包括扩展名),会显示在浏览器端的下载窗口中;
4、contentEncoding:文件的默认编码格式,如GBK、UTF-8、GB18030等,这個字段貌似用的稍少些;
按照这样的方式,我们就可以成功的实现文件下载功能了。另外,附壹张 primefaces-showcase 的 war 包解压之后的目录结构图。
最后我想吐槽下,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
分享到:
相关推荐
其中,`<p:fileUpload>`组件是用于实现文件上传功能的一个重要元素。本篇文章将深入探讨如何使用PrimeFaces的`<p:fileUpload>`组件在JSF应用中实现实时、便捷的文件上传。 首先,让我们了解`<p:fileUpload>`的基本...
除了上述介绍的一些基础组件之外,PrimeFaces 还提供了许多其他的高级组件,如 `<p:outputPanel>` 用于只显示元素、`<p:fieldset>` 用于分组内容、`<p:dashboard>` 用于创建仪表盘样式、`<p:themeswitcher>` 用于...
本篇将深入探讨如何使用`<h:selectOneMenu>`标签来实现这种功能,该标签是JavaServer Faces (JSF)框架的一部分。 ### JSF `<h:selectOneMenu>`标签介绍 `<h:selectOneMenu>`是JSF中用于创建单选下拉列表的组件。它...
<resource-library-mapping>primefaces</resource-library-mapping> </application> ``` ##### 2.4 HelloWorld 示例 创建一个简单的JSF页面,引入PrimeFaces的组件并测试其基本功能。 ```html <h:head> <title>...
描述中提到避免在同一Datatable中使用`<p:outputLabel>`标签,这可能是因为`<p:outputLabel>`并不适合用于用户交互,尤其是当需要上下键导航时。 在JavaScript方面,主要涉及了两个核心知识点: 1. **键盘事件处理...
例如,可以使用`<p:commandButton>`组件创建一个按钮: ```html <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui"> <h:head> <title>...
- 使用`<f:ajax>`或`p:ajax`进行异步更新,提高用户体验。 - 对于大量数据,使用懒加载以提高性能。 总结,JSF PrimeFaces的`DataTable`是一个强大而灵活的组件,结合Spring框架,可以构建出高效、易于维护的Web...
JSF的日历组件通常由一个特定的UI标签实现,比如`<h:inputText>`配合`<f:convertDateTime>`标签或者使用特定的组件库如PrimeFaces、RichFaces中的日历组件。例如,PrimeFaces的`<p:calendar>`标签就提供了一个功能...
总结起来,要在JSF 1.2中实现迭代和循环,可以使用`<ui:repeat>`标签,结合Managed Bean中的集合属性。同时,通过`<f:ajax>`实现Ajax交互,提升用户体验。如果项目需要模仿Struts的迭代方式,理解JSF的EL和组件模型...
1. **分页和懒加载**: 使用`<p:paginator>`组件和`lazy="true"`属性实现大数据集的高效展示。 2. **验证(Validation)**: 添加验证规则,确保用户输入的数据符合业务需求。 3. **国际化(Internationalization)*...
例如,使用`<p:inputText>`和`<p:commandButton>`结合`@ManagedBean`和`@ViewScoped`注解实现简单的表单提交。 3. **Primefaces的Ajax功能**: Primefaces提供了强大的Ajax支持,允许部分刷新页面,提升用户体验。...
5. `<p:calendar>`(PrimeFaces组件库):提供日历选择功能。 **事件处理和验证** 在JSF中,组件可以监听和处理各种事件,如点击按钮、改变输入值等。通过`<f:ajax>`标签可以实现异步请求,更新部分视图。同时,JSF...
PrimeFaces 等第三方库提供了更多丰富的 AJAX 功能和组件,如 `<p:commandButton>` 和 `<p:remoteCommand>`,它们使得在 JSF 中实现局部刷新变得更加方便。这些组件通常具有更丰富的配置选项和更友好的用户体验。 #...
同时,按钮应与`<p:fileDownload>`组件配合使用,以便在报表生成完成后提供文件下载。值得注意的是,`<p:fileDownload>`组件的`value`属性应绑定到包含报表文件的属性。 在实际应用中,还有一些需要注意的事项: 1...
<artifactId>primefaces</artifactId> <version>对应版本号</version> </dependency> ``` ### 3. 创建数据模型 在Java后端,我们需要一个数据模型来存储和处理数据。例如,创建一个`Person`实体类,并使用`...
Primefaces提供了更多高级组件,如数据网格(<p:dataTable>)、日期选择器(<p:calendar>)和对话框(<p:dialog>),大大增强了用户体验。 在JSF的模型层,我们可以使用JPA来管理数据库操作。在Netbeans中,通过...
在JSF中,这通常通过`<f:ajax>`标签或者第三方库如PrimeFaces或RichFaces实现。 **基本Ajax使用步骤** 1. **添加依赖**:在项目中引入JSF和Ajax支持的库,如Apache MyFaces和 OmniFaces等。 2. **创建Ajax触发器*...
8. **表单处理**:深入学习`<h:form>`,`<h:inputXXX>`,`<h:outputXXX>`等标签的用法,以及如何处理表单提交和回显。 9. **错误和异常处理**:学习如何优雅地处理错误和异常,提供友好的用户反馈。 10. **自定义...
5. **数据展示控件**:如`<h:dataTable>`用于显示数据集,`<p:growl>`用于显示消息提示。 ### JSF控件属性 每个JSF控件都有若干属性,这些属性定义了控件的行为和外观。例如,`<h:inputText>`的`value`属性用于...
JSF的`<p:autocomplete>`组件能轻松实现这一功能,与后台服务交互,返回匹配的建议列表。 4. 布局切换: 用户可以选择不同的视图模式,如卡片视图或列表视图。通过AJAX,可以无刷新地更新页面布局。JSF的组件库如...