没有唯一 ID 的 JSF Primefaces 数据表选择模式

JSF Primefaces Datatable selectionMode for without unique id

我正在使用基于浏览器的 ftp 客户端。我正在使用 org.apache.commons.net.ftp.FTPFile 3.6 和 Primefaces 6.2。对于实际文件上下文的可视化表示,我使用 PF 的 DataTable 组件。现在我遇到了以下problem/challenge。因为我想 select 文件并在双击时执行某些操作,所以我启用了 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 不是来自数据库的东西,也不是我设计的。 实际上,我的目标是允许 files/folders 被 selected 并在点击 resp 时执行操作。双击。

dataTable 是否没有办法解决这个问题,还是我在这里做的事情完全错误。在这种情况下,欢迎您对我进行-1,但非常欢迎提供理由;)!

您始终可以为 org.apache.commons.net.ftp.FTPFile 创建一个包装器 class,它应该是可识别的并包含 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
}

并且您需要创建 FTPFileWrapper 的 fTPBean.actualFolderContent 集合并填充一些唯一的 id 值(它可以只是一个简单的 int 变量递增)和 FTPFile 您想在你的 UI.

中展示

要显示文件名,您可以通过 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>