Sie können
varStatus
attribute verwenden, um den Schleifenstatus zu erhalten.
<ui:repeat value="#{myController.fileList}" var="element" varStatus="loop">
<t:inputFileUpload value="#{myController.uploadedFile[loop.index]}" />
</ui:repeat>
(nur in JSF 2.x von der Art und Weise, in JSF 1.x Ihre beste Wette c:forEach
sein könnte)
Aber warum Sie nicht nur die folgenden Befehle verwenden?
<ui:repeat value="#{myController.uploadedFile}" var="uploadedFile">
<t:inputFileUpload value="#{uploadedFile}" />
</ui:repeat>
aktualisieren: die fileList
vom Typ List<Integer>
oder Integer[]
oder int[]
sein müssen und die uploadedFile
muss vom Typ sein List<SomeObject>
oder SomeObject[]
Ihren ursprünglichen Code zu erhalten zu arbeiten.
Update 2: hier ist ein kleiner reproduzierbarer Test Schnipsel:
XHTML:
<h:form>
<h:selectManyCheckbox value="#{bean.selectedIndexes}">
<f:selectItems value="#{bean.selectIndexes}" />
</h:selectManyCheckbox>
<h:commandButton value="submit" />
</h:form>
<ui:repeat value="#{bean.selectedIndexes}" var="selectedIndex">
<p><h:outputText value="#{bean.list[selectedIndex]}" /></p>
</ui:repeat>
Bean
:
private List<SelectItem> selectIndexes; // +getter
private List<Integer> selectedIndexes; // +getter +setter
private List<String> list; // +getter
public Bean() {
selectIndexes = new ArrayList<SelectItem>();
selectIndexes.add(new SelectItem(0, "one"));
selectIndexes.add(new SelectItem(1, "two"));
selectIndexes.add(new SelectItem(2, "three"));
selectIndexes.add(new SelectItem(3, "four"));
selectedIndexes = new ArrayList<Integer>();
list = Arrays.asList("one", "two", "three", "four");
}
Werke hier fein auf Mojarra 2.0.3 und Apache Tomcat 6.0.29. Sie müssen nur selectedIndexes
als fileList
und list
als uploadedFile
ersetzen.
Ich kann die erste Lösung nicht verwenden. Der Grund ist: Benutzer wählt Dateien aus, die von ihm geändert werden sollen. Es gibt 0-8 Dateien. Die Namen der Dateien sind ebenfalls 0-8. Wenn er nur die zweite und vierte Datei wählt, möchte ich ihm nur zwei Elemente zeigen - er kann nur diese zwei Dateien überschreiben, die er zuvor ausgewählt hat. In diesem Fall möchte ich wissen, welche Dateien ersetzt werden sollen. Wenn er alle acht Dateien auswählt, könnten Ihre Lösungen funktionieren. Danke für deine schnelle Antwort. –
problemgenerator
Ah, ich verstehe was du meinst. Die 'fileList' enthält die ausgewählten Dateien, für die Sie die zugehörige' uploadedFile' verwenden möchten. OK, ich habe die Antwort aktualisiert. – BalusC
Ich schrieb so etwas in meinem Controller: Liste Ergebnis = neue LinkedList (); und ich gebe diese Liste zurück. Ich dachte zuerst, dass es funktioniert, aber Fehler erscheint immer noch. –
problemgenerator