ArrayList为每个Managedbean调用JSF重置

时间:2014-10-31 12:58:13

标签: jsf jsf-2 datatable initialization conversation-scope

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

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

我的代码如下:

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

解决方案: 它应该在视野范围内。但是,有人可以说明为什么它在覆盖范围内不起作用吗?

1 个答案:

答案 0 :(得分:0)

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

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