2010-02-24 17 views
8

Nie mogę uwierzyć, jak coś to może wydawać się proste, tak trudne do zrobienia w Struts 2.Struts 2 gniazdowania iteratory

Jest to w przybliżeniu co chciałbym zrobić, ponieważ byłoby to zrobić w Javie.

for (Parent parent : parents){ 
    for (Child child: parent.getChildren()){ 
    System.out.println(child.getName()); 
    } 
} 

To powinno przełożyć się coś blisko tego w tagach Stuts:

<s:iterator var="parent" value="parents"> 
    <s:iterator var="child" value="parent.children"> 
    <s:property value="child.name"/> 
    <s:iterator> 
<s:iterator> 

Zakładam parent.children powinno być coś jak $ {% (# parent.children)} ale mam nie znaleziono właściwej kombinacji $ {% (# znaków do użycia :-). Mógłbym też użyć linku do strony wyjaśniającej, kiedy użyć której z nich.

Odpowiedz

11

Spróbuj tego:

<s:iterator var="parent" value="parents"> 
    <s:iterator var="child" value="#parent.children"> 
     <s:property value="#child.name"/> 
    <s:iterator> 
<s:iterator> 
+0

To działa. Dziękuję Ci. – Bloodboiler

+0

Czy ktoś może wyjaśnić znaczenie znaku #? Zrobiłem ten sam błąd co oryginalny plakat. Dzięki! – Jim

+1

Ta strona wyjaśnia: http://struts.apache.org/2.x/docs/ognl.html – Nate

4

To działa dla mnie:

<s:iterator value="parents"> 
    <s:iterator value="children"> 
     <s:property value="name" /> 
    </s:iterator> 
</s:iterator> 
+1

Bardziej elegancka niż zaakceptowana odpowiedź! Działa to, ponieważ bieżący element w ieracji zostanie naciśnięty na wierzchu stosu, więc nie ma potrzeby, aby użytkownik var = "xxxx" uzyskiwał do niego dostęp. – user1884155

1

ten sposób kod JSP będzie wyglądać następująco:

<s:form action="saveaction" > 
     <s:iterator value="lstBean" id="lstBean" status="outerStat"> 
      <s:textfield value="%{name}" name="lstBean[%{#outerStat.index}].name"/> 
      <s:textfield value="%{amt}" name="lstBean[%{#outerStat.index}].amt"/> 
      <s:textfield value="%{id}" name="lstBean[%{#outerStat.index}].id"/> 
      <s:iterator value="%{lstString}" status="myStat"> 
       <s:textfield name="lstBean[%{#outerStat.index}].lstString[%{#myStat.index}]"/> 
      </s:iterator> 
     </s:iterator> 
     <s:submit value="Click me to submit lstBean"/> 
    </s:form> 

Poniżej fasoli (XBean) którego lista jest używana na stronie JSP:

public class XBean 
{  
private ArrayList<String> lstString=new ArrayList<String>(); 
private String name; 
private Double amt; 
private Integer id; 
//Getters and setters of fields 
} 

Teraz możesz po prostu mieć pole lstBean z ustawieniami w akcji przesyłającej (oszczędzanie) i hej, gotowe.

+1

Więc masz na myśli w wewnętrznej iteracji mogę również uzyskać dostęp do zewnętrznej wartości części iteracji? Wspaniały..... – FaithReaper

0

Dla Struts 2.3.x można użyć tego przykładu, pochodzących z http://struts.apache.org/release/2.3.x/docs/iterator-tag-examples.html

W tym przykładzie, „kraje” to lista obiektów z krajów, z których każda ma swoją nazwę i listę miast. Każde miasto ma swoją nazwę.

<s:iterator value="countries"> 
    <s:iterator value="cities"> 
     <s:property value="name"/>, <s:property value="[1].name"/><br> 
    </s:iterator> 
</s:iterator> 

Dotyczą one określonej pozycji na stosie: "[1]". Górna część stosu, pozycja 0, zawiera bieżące miasto, wciśnięte przez wewnętrzny iterator; pozycja 1 zawiera bieżący kraj, popchnięty tam przez zewnętrzny iterator.