2010-11-25 4 views
1

Ich habe einen Code wie folgt:wie der Wert zu Integer in <Ui: Wert wiederholen = "..." var = "...">?

<ui:repeat value="#{myController.fileList}}" var="element" > 
<t:inputFileUpload value="#{myController.uploadedFile[element]}" /> 
</ui:repeat> 

aber dies gibt einen Fehler zurück: java.lang.NumberFormatException: Für die Eingabe-Stichwort: "[0]}". UploadedFile ist ein Array von Dateien. Wenn ich Code wie dieses

geschrieben habe, ist
... 
<t:inputFileUpload value="#{myController.uploadedFile[0]}" /> 
... 

alles in Ordnung, aber ich will es habe zwischen 0-8 Werten, nicht nur ‚0‘, und das von meinem Controller zurückgegeben werden muss. Also, wie dieses 'Element' innerhalb <t:inputFileUpload value="#{myController.uploadedFile[element]}" /> in int Wert zu konvertieren? Danke für die Hilfe.

Antwort

1

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.

+0

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

+0

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

+0

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