Как использовать дерево простых лиц для загрузки файла - PullRequest
3 голосов
/ 02 августа 2011

Я использую 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>

Вот мой класс бобов поддержки:

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

1 Ответ

3 голосов
/ 03 августа 2011

Вы пытались использовать <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>

в своем компоненте (например, если ваши файлы 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}".Пользователь выбирает узел дерева, и это приведет к тому, что selectedTreeNode будет установлен (с помощью метода установки) для вашего компонента.

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().

EDIT

Вместо того, чтобы пытаться встраивать командные кнопки в дерево, предоставьте одну командную кнопку где-нибудь настр.Когда выбран узел дерева, он может установить связанный файл (для загрузки) в качестве свойства вашего компонента.Сделайте так, чтобы ваше дерево выглядело так:

<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...
}

Поместите оператор println или logging в ваш метод setSelectedTreeNode, чтобы убедиться, что установщик вызывается при нажатии на узел дерева.Используйте метод getData() для TreeNode, чтобы получить обратно значение данных, которое вы изначально поместили в него при создании дерева.Метод getFileStreamedContent() будет использовать это значение для доставки правильного файла, выбранного пользователем, нажав на узел дерева.

...