我正在使用基于浏览器的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,但是非常有原因;)!
答案 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>