【问题标题】:How to use primefaces tree to download a file如何使用 primefaces 树下载文件
【发布时间】:2011-10-18 07:01:39
【问题描述】:

我正在使用带有支持 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 上试用过

【问题讨论】:

    标签: java jsf tree primefaces


    【解决方案1】:

    您是否尝试过将&lt;p:commandButton&gt;&lt;p:fileDownload&gt; 一起使用?

    <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) {
        }
    }
    

    最后一部分是将特定文件与特定树节点相关联。您可以使用&lt;p:tree&gt; 属性selectionMode="single"selection="#{myBean.selectedTreeNode}"。用户选择一个树节点,这将导致 selectedTreeNode 在您的 bean 上被设置(通过 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 或日志语句,以确保在您单击树节点时调用setter。使用TreeNode 上的getData() 方法来取回您在创建树时最初放入其中的数据值。 getFileStreamedContent() 方法将使用该值传递用户通过单击树节点选择的正确文件。

    【讨论】:

    • 这个答案假设您使用的是 PrimeFaces 3.0,因为您没有指定
    • 不,我使用的是 PrimeFaces 2.2.1。谢谢吉姆的回答,我还没试过,我现在就试试!欢呼
    • 我使用了命令按钮选项,但是每当我将命令按钮放在树中时,treeNodes 和命令按钮都不会被渲染。
    • 我在 setSelectedTreeNode 中放置了一个打印语句,用于测试你所说的节点选择,但是当我选择节点时它没有被调用。
    • 我添加了更多代码。除非您想添加事件侦听器,否则我认为不需要 &lt;p:ajax&gt;,但也许它是必需的。同样,我的代码使用 PrimeFaces 3.0,所以我不能保证它可以与旧的 PrimeFaces 线一起使用。
    猜你喜欢
    • 2013-09-29
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多