JSF文件上传UI:重复



我有一个UI,它具有将多个特定本质文档上传到问题的选项。在我的应用程序的其余部分中,我可以上传一个没有问题的文件。

环境

  • tomcat 7.0.x
  • Mojarra JSF实施2.1.3(20110908-FCS)
  • JSF 2.1带Primefaces 2.2
  • Apache战斧。

代码说明

这是循环浏览文档信息实体的代码。这些实体是数据库或占位符的记录。该实体将具有指向数据库中的项目(如果存在)的ID,否则为0,这意味着它是占位符,可以上传文件。

在占位符情况下,有一个上传按钮,它提出了一个PrimeFaces对话框,其中包含Tomahawk文件上传组件。

代码

这是JSF代码:

<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:repeat var="extDoc" value="#{reportBean.externalDocs}"
        varStatus="extDocIdx">
    <!-- Display the document name -->
    <h:outputText value="#{extDoc.name}"/>
    <!-- if the document is not in the database, give the option to add it -->
    <ui:fragment rendered="#{extDoc.id == 0}">
        <!-- On click of the upload button, display the dialog -->
        <h:commandButton value="Upload" type="button"
            onclick="uploadDlg#{extDocIdx.index}.show()" modal="true"/>
        <p:dialog header='Upload document for #{extDoc.name}'
                modal="true" widgetVar="uploadDlg#{extDocIdx.index}"
                width="650" minWidth="650">
            Select the file to upload:
            <!-- THIS IS WHERE THE PROBLEM IS -->
            <t:inputFileUpload value="#{reportBean.uploadedFile}"/>
            <br/>
            <h:commandButton value="Submit"
                action="#{reportBean.addExtDocument(extDoc.name, extDocIdx.index)}"/>
        </p:dialog>
    </ui:fragment>
    <ui:fragment rendered="#{extDoc.id != 0}">
        <!-- display a link to the uploaded file -->
    </ui:fragment>
</ui:repeat>

和ReportBean中的uploadedfile属性:

private UploadedFile uploadedFile;
public UploadedFile getUploadedFile() { return uploadedFile; }
public void setUploadedFile(UploadedFile value) { uploadedFile = value; }
public void addExtDocument(String name, int idx)
    throws IOException
{
    // access uploadedFile to persist the information
}

问题

我愚蠢地只有一个上载文件变量可以处理整个上传文件的循环;因此,循环中的最后一项总是覆盖其他项目,从而无法上传最后一个项目。显然,我需要每次通过循环指定不同的上载文件。我尝试使用列表&ltloadedfile>未能成功,但是尚不清楚如何初始化数组或如何t:inputfileupload组件会更新提交上的值。

问题

因此,问题是:我在t:inputfileupload中包含哪种类型的el,我在ReportBean中使用哪种属性在我的adddocument方法中使用单独的uploadedfile实例?

您可以使用 List<UploadedFile>UploadedFile[]并使用撑杆符号访问单个项目,其中您通过<ui:repeat>的当前索引如下:

<t:inputFileUpload value="#{reportBean.uploadedFiles[extDocIdx.index]}"/>

无论哪种方式,您都需要确保该属性已正确预设。List必须用new ArrayList<>()初始化,并且必须以正确的长度进行原始序列化。JSF/El不会为您重新制作;它仅在给定索引上设置给定项目,仅此而已。在null列表或数组中,您只能面对PropertyNotWritableException,并且在空数字或错误的大小上,您只会面对ArrayIndexOutOfBoundsException

相关内容

  • 没有找到相关文章

最新更新