Pix*_*xel 3 jsf file-upload el uirepeat
我有一个UI,可以选择将特定性质的多个文档上传到一个问题.在我的应用程序的其余部分中,我能够毫无问题地上传单个文件.
环境
代码说明
这是循环文档信息实体的代码.这些实体是数据库中的记录或占位符.实体将具有指向数据库中项目的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>
Run Code Online (Sandbox Code Playgroud)
以及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
}
Run Code Online (Sandbox Code Playgroud)
问题
我愚蠢地只有一个uploadedFile变量来处理整个上传文件循环; 因此循环中的最后一项总是会覆盖其他项目,因此无法上传除最后一项之外的任何项目.我显然需要通过循环每次指定一个不同的uploadedFile.我尝试使用List <UploadedFile>失败了,但是不清楚如何初始化数组或t:inputFileUpload组件如何更新提交时的值.
问题
所以问题是:我在t中包含哪种EL:inputFileUpload和ReportBean中的哪种属性用于在我的addDocument方法中提供单独的uploadedFile实例?
您可以使用List<UploadedFile>
或UploadedFile[]
使用括号表示法访问各个项目,其中您传递当前索引,<ui:repeat>
如下所示:
<t:inputFileUpload value="#{reportBean.uploadedFiles[extDocIdx.index]}"/>
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,您都需要确保该属性已正确预先初始化.的List
必须进行初始化new ArrayList<>()
和阵列必须用完全正确的长度被预先初始化.JSF/EL即不会为您预先制作; 它只是在给定的索引上设置给定的项目,而这就是全部.在null
列表或数组上,您只会面对一个PropertyNotWritableException
空数组或大小错误,您只会遇到一个ArrayIndexOutOfBoundsException
.
归档时间: |
|
查看次数: |
1269 次 |
最近记录: |