我正在使用带有支持bean的primefaces 3.0.M2来添加文件夹(模块)和子文件夹(赋值)中排列的文件。我已成功地做到了这一点,但我无法控制文件以使其可下载。我想将该文件作为按钮来下载该特定文件,而不仅仅是一个普通文本。请检查下面的jsf代码:
<p:tree id="tree" value="#{files.root}" var="doc" selectionMode="single"
selection="#{files.selectedTreeNode}">
<p:treeNode>
<h:outputText value="#{doc}"/>
</p:treeNode>
</p:tree>
这是我的支持bean类:
public class FilesBean implements Serializable {
private TreeNode root;
public TreeNode getRoot() {
root = new DefaultTreeNode("root", null);
TreeNode general = new DefaultTreeNode("General", root);
TreeNode module = null;
TreeNode assignment = null;
TreeNode fileNode = null;
if(getMoudles()!=null)
{
for(String s : getMoudles())
{
module = new DefaultTreeNode(s, root);
if(getAssignments()!=null)
{
for (Assignments as : getAssignments())
{
if(as.getMoudleid().equals(s))
assignment = new DefaultTreeNode(as.getAssignmentsPK().getAssignmentid(), module);
for(Files file : getFiles())
{
if (file.getFilesPK().getAssignmentid().equals(as.getAssignmentsPK().getAssignmentid()) && file.getThemodule().equals(s))
{fileNode = new DefaultTreeNode(file,assignment);}
}
}
}
}
}
return root;
}
PS:PrimeFaces 3.0.M2,JSF 2.0,J2EE 6 Web,Servlet 3.0,Glassfish 3.0,EJB 3.0,浏览器:IE8也尝试过FireFox 3.6.12
答案 0 :(得分:3)
您是否尝试将<p:commandButton>
与<p:fileDownload>
一起使用?
<p:commandButton
value="Download"
title="Download"
image="ui-icon-arrowthick-1-s"
ajax="false">
<p:fileDownload value="#{myBean.fileStreamedContent}" />
</p:commandButton>
在您的支持bean中(例如,假设您的文件是JPEG):
public StreamedContent getFileStreamedContent() {
try {
InputStream is = new BufferedInputStream(
new FileInputStream("/your/file/path/fileXYZ.jpg"));
return new DefaultStreamedContent(is, "image/jpeg", "fileXYZ.jpg");
} catch (FileNotFoundException e) {
}
}
最后一部分是将特定文件与特定树节点相关联。您可以使用<p:tree>
属性selectionMode="single"
和selection="#{myBean.selectedTreeNode}"
。用户选择一个树节点,这将导致在您的bean上设置selectedTreeNode
(通过setter方法)。
private TreeNode selectedTreeNode;
public void setSelectedTreeNode(TreeNode selectedTreeNode) {
this.selectedTreeNode = selectedTreeNode;
if (this.selectedTreeNode != null) {
Object yourTreeNodeData = this.selectedTreeNode.getData();
// do whatever you need to do with the data object...
}
}
在getFileStreamedContent()
方法中,只需使用存储在树节点对象中的文件名作为FileInputStream()
构造函数的参数。
修改强>
不是尝试在树中嵌入命令按钮,而是在页面的某处提供一个命令按钮。当选择树节点时,它可以将关联文件(要下载)设置为bean上的属性。让你的树看起来像这样:
<p:tree
value="#{myBean.rootTreeNode}"
var="node"
selectionMode="single"
selection="#{myBean.selectedTreeNode}">
<p:ajax event="select" listener="#{myBean.onNodeSelect}" />
<p:ajax event="unselect" listener="#{myBean.onNodeUnselect}" />
</p:tree>
public void onNodeSelect(NodeSelectEvent event) {
// put some logging here...
}
public void onNodeUnselect(NodeUnselectEvent event) {
// put some logging here...
}
在setSelectedTreeNode
方法中放置println或logging语句,以确保在单击树节点时调用setter。使用getData()
上的TreeNode
方法可以获取创建树时最初放入其中的数据值。 getFileStreamedContent()
方法将使用该值来提供用户通过单击树节点选择的正确文件。