# struts2: iterator status in name-Feld benutzen



## oetzi (25. Dez 2010)

Hallo zusammen,

frohe Weihnachten! 

ich möchte eine ArrayList dynamisch mit einer variablen Anzahl Objekte füllen lassen.
Da dachte ich mir könnte ich ja einfach über itStatus.index den Index des Iterators nutzen, um die einzelnen Felder der ArrayList anzusprechen. 
Allerdings wird bei mir das "#itStatus.index" nur im value-Feld mit dem Indexwert ersetzt. Benutze ich "#itStatus.index" im name-Feld, wird einfach dieser String so verwendet.

Beispiel:
<s:select name="*#itStatus.index*" list="allStatus" listKey="id" listValue="*#itStatus.index*" label="new Type"/>
wird zu:
<select name="*#itStatus.index [HIER WIRD ES NICHT ERSETZT]*" id="adminSkillDetailsSaveChanges_#itStatus_index">
    <option value="0" selected="selected">*0*</option>
    <option value="1">*0*</option>
</select>

Kann mir jemand sagen, ob man das irgendwie hinkriegen kann?

Schönen Gruß,
oetzi


----------



## oetzi (11. Jan 2011)

Hat denn kein struts2 Profi ne Idee?


----------



## gman (11. Jan 2011)

Probier mal stumpf:


```
<s:select name="<s:property value="%{#itStatus.index}"/>" list="allStatus" listKey="id" listValue="#itStatus.index" label="new Type"/>
```


----------



## oetzi (13. Jan 2011)

Hey gman,

vielen Dank! Eine kleine Anpassung musste ich zwar noch machen, aber du hast mich auf die richtig Spur gebracht.

So funktioniert es:

```
<s:select name="list[%{#itStatus.index}]" list="allStatus" listKey="id" listValue="#itStatus.index" label="new Type"/><br />
```

Allerdings würde mich interessieren, warum ich mal direkt über #itStatus.index und mal über %{#itStatus.index} an die Werte komme.
Wo ist der Unterschied? Kann mir das jemand erklären?


----------



## ign0rant (13. Jan 2011)

Kann man unter Tag Syntax nachlesen.



> Boiled down, the tag attributes are evaluated using three rules.
> 
> 1. All String attribute types are parsed for the "%{ ... }" notation.
> 2. All non-String attribute types are not parsed, but evaluated directly as an expression
> 3. The exception to rule #2 is that if the non-String attribute uses the escape notion "%{}", the notation is ignored as redundant, and the content evaluated.


----------



## oetzi (13. Jan 2011)

> Boiled down, the tag attributes are evaluated using three rules.
> 
> 1. All String attribute types are parsed for the "%{ ... }" notation.
> 2. All non-String attribute types are not parsed, but evaluated directly as an expression
> 3. The exception to rule #2 is that if the non-String attribute uses the escape notion "%{}", the notation is ignored as redundant, and the content evaluated.



Danke für die Link und die Infos!
Leider ist mir das immernoch nicht ganz klar geworden... 

zu 1.: mhh, nehmen wir an ich hätte ein stringWert="test12" Attribut in meiner Action und nutzte in der JSP <sroperty value="stringWert" />
Dann wird mir ja test12 ausgegeben. Was soll mir jetzt das "All String attribute types are parsed for the "%{ ... }" notation." sagen? Wo taucht denn hier das %{...} auf?

zu 2.: Also irgendwie komme ich mit den Begrifflichkeiten durcheinander. Was heißt hier "evaluated directly as an expression"? 

Könntest du mir vielleicht mal in eigenen Worten erklären, wann was wie interpretiert wird?


----------



## gman (13. Jan 2011)

Ich denke mal das "listValue" ein Attribut ist das durch Struts2 selber verarbeitet wird, "name" jedoch an das zu grunde
liegende Tag weitergeleitet wird. Deshalb wird das was im "name"-Attribut steht auch nicht ausgewertet. Erst wenn
du mit "%{}" arbeitest weiß Struts2 das es da auch noch was zu tun hat.
Ist jetzt leicht aus der Hüfte geschossen, kannst ja mal schauen ob du das durch Analyse des Struts2-Quellcodes
verifizieren kannst ;-)


----------



## oetzi (14. Jan 2011)

Ah jo, klingt irgendwie logisch 
Im Value Feld (beispielsweise eines textfeldes) steht ja typischer Weise der Inhalt eines Attributes der Action drin (z. B. vorher eingegebene E-Mailadresse, die man ändern kann). 
Allerdings kommt es weniger häufig vor, dass der name, und damit ja das Zielattribut in der Action, dynamisch gewählt werden soll. 

Also erzwinge ich mit %{xyz}, dass struts2 xyz auf dem valueStack sucht und ggf. den Wert einsetzt, richtig?


----------

