2010-02-24 11 views
8

Je ne peux pas croire à quel point quelque chose de ce simple peut sembler si difficile à faire dans Struts 2.Struts 2 itérateurs nidification

C'est à peu près ce que je voudrais faire comme il se fait en Java.

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

Cela devrait se traduire par quelque chose proche de cela dans les balises Stuts:

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

Je suppose parent.children devrait être quelque chose comme $ {% (# parent.children)}, mais je pas trouvé une bonne combinaison de $ {% (# caractères à utiliser :-). Je pourrais aussi utiliser un lien vers une page expliquant quand utiliser l'un d'entre eux.

Répondre

11

Essayez ceci:

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

Cela fonctionne. Je vous remercie. – Bloodboiler

+0

Quelqu'un peut-il expliquer la signification du signe #? J'ai fait la même erreur que l'affiche originale. Merci! – Jim

+1

Cette page l'explique: http://struts.apache.org/2.x/docs/ognl.html – Nate

4

Il fonctionne pour moi:

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

Plus élégante que la réponse acceptée! Cela fonctionne parce que l'item courant dans l'ieration sera poussé au sommet de la pile, donc il n'y a pas besoin d'user var = "xxxx" pour y accéder. – user1884155

1

Voici comment le code JSP ressemblera:

<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> 

ci-après le haricot (XBean) dont la liste est utilisée dans la 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 
} 

Maintenant, vous pouvez simplement avoir un champ lstBean avec des setters dans votre action de soumission (sauveaction) et vous avez terminé.

+1

Donc vous voulez dire dans l'itération interne que je peux aussi avoir accès à la valeur de la partie d'itération externe? Génial..... – FaithReaper

0

Pour Struts 2.3.x, vous pouvez utiliser cet exemple, extrait de http://struts.apache.org/release/2.3.x/docs/iterator-tag-examples.html

Dans cet exemple, « pays » est une liste d'objets de pays, dont chacun a un nom et une liste des villes. Chaque ville a un nom. Ils se réfèrent à une position spécifique sur la pile: «[1]». Le sommet de la pile, position 0, contient la ville actuelle, poussée par l'itérateur interne; la position 1 contient le pays actuel, poussé par l'itérateur externe.