我有一个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
。