没有唯一ID的JSF Primefaces数据表selectionMode

时间:2018-12-06 16:51:01

标签: jsf primefaces

我正在使用基于浏览器的ftp客户端。我正在使用org.apache.commons.net.ftp.FTPFile 3.6和Primefaces 6.2。为了直观显示实际文件上下文,我使用了PF的DataTable组件。现在,我遇到了以下问题/挑战。因为我想选择文件并双击执行某些操作,所以我启用了selectionMode。这是jsf代码

<p:dataTable id="ftptable" var="file" value="#{fTPBean.actualFolderContent}" `selectionMode="single" selection="#{fTPBean.selectedFile}" rowKey="#{file}>
<p:column headerText="File/Folder">     
    <h:outputText value="#{file.name}" />
</p:column>

<p:column headerText="File Info">
    <h:outputText value="#{file.rawListing}" />
</p:column>
</p:/dataTable>

这将不起作用,因为rowKey应该是唯一的标识符,并且org.apache.commons.net.ftp.FTPFile不是从数据库中出来或不是由我设计的。 实际上,我的目标是允许选择文件/文件夹并在单击时执行操作。双击。

使用dataTable是否无法解决此问题,或者我在这里做的事情完全错误。在这种情况下,欢迎您给我-1,但是非常有原因;)!

1 个答案:

答案 0 :(得分:2)

您始终可以为org.apache.commons.net.ftp.FTPFile创建一个包装类,该包装类应该是可识别的并且包含FTPFile实例。在这种情况下,您可以简单地使用此包装的集合,以在DataTable中表示它们,并对它们执行操作。

public class FTPFileWrapper implements Serializable {

    private static final long serialVersionUID = 3653846184126846410L;

    private Integer id;

    private FTPFile ftpFile;

    public FTPFileWrapper(Integer id, FTPFile ftpFile) {
        this.id = id;
        this.ftpFile = ftpFile;
    }

    //getters and setters
}

您需要创建一个fTPBean.actualFolderContent的FTPFileWrapper集合,并填充是否具有一些唯一的id值(可以只是简单的int变量增量)和您想要的FTPFile在您的用户界面中显示。

要显示文件名,您可以通过file进行访问,如下所示:

<p:column headerText="File/Folder">     
    <h:outputText value="#{file.ftpFile.name}" />
</p:column>

或修改包装器,以直接访问其文件字段,如下所示:

public class FTPFileWrapper implements Serializable {

    ...

    public String getFileName() {
        if (ftpFile != null) {
            return ftpFile.getName();
        }
        return "N/A";
    }
}

<p:column headerText="File/Folder">     
    <h:outputText value="#{file.fileName}" />
</p:column>