-1

场景: 我有 ap:fileupload multiple="true"和 ap:datatable 下面。当我上传文件时,文件名和文件大小应添加到 ArrayList 中,并应显示在数据表中。对于每个附加的文件,arrayList 应该附加一个新行。

问题: 当我上传第一个文件时,数据表显示文件详细信息。但是当我上传第二个文件时,仅显示第二个文件的详细信息,并且以前的文件详细信息被删除。似乎数组列表正在重置。具体来说,仅显示最后附加的文件详细信息。

我的代码如下:

文件上传.xhtml

<p:fileUpload fileUploadListener="#{f.uploadTemp}" mode="advanced"
            update="fileTable" multiple="true" />
        <p:dataTable value="#{f.fileList }" var="file" id="fileTable">
            <p:column headerText="FileName">
                <p:commandLink id="ajax" actionListener="#{f.dowload}">
                    <h:outputText value="#{file.fileName }" />
                </p:commandLink>
            </p:column>
            <p:column headerText="FileSize">
                <h:outputText value="#{file.fileSize }" />
            </p:column>
            <p:column>
                <p:commandButton value="X">
                    <f:setPropertyActionListener target="#{file.fileName}" value="#{f.filetobeDeleted }"/>
                </p:commandButton>
            </p:column>
        </p:dataTable>

@ManagedBean(name = "f")
@ConversationScoped
public class FileUploadBF implements Serializable {

    private ArrayList<FileCarry> fileList = new ArrayList<FileCarry>();

    public void uploadTemp(FileUploadEvent event) {
        uploadedFile = event.getFile();
        System.out.println("process upload");
        FileCarry fc = new FileCarry(uploadedFile.getFileName(), uploadedFile.getSize());
        this.fileList.add(fc);
    }

    public void setFileList(List<FileCarry> fileList) {
        this.fileList = (ArrayList<FileCarry>) fileList;
    }

    public ArrayList<FileCarry> getFileList() {
        return fileList;
    }

    public static class FileCarry {

        public FileCarry(String name, long l) {
            this.fileName = name;
            this.fileSize = l;
        }

        public void setFileName(String fileName) {
            this.fileName = fileName;
        }

        public String getFileName() {
            return fileName;
        }

        public void setFileSize(long fileSize) {
            this.fileSize = fileSize;
        }

        public long getFileSize() {
            return fileSize;
        }

        private String fileName;
        private long fileSize;
    }
}

解决方案: 应该在视图范围内。但是有人能说出为什么它在覆盖范围内不起作用吗?

4

1 回答 1

0

在我看来,您的 bean 范围可能存在问题。你在其他地方开始谈话了吗?检查您的 bean 是否被一次又一次地创建?

您可以更改 bean 的范围,例如:@ViewScoped - 它应该会有所帮助。

于 2014-10-31T13:14:23.597 回答