2010-02-24 32 views
8

No puedo creer cómo algo tan simple puede parecer tan difícil de hacer en Struts 2.Struts 2 iteradores de anidación

Esto es aproximadamente lo que me gustaría hacer, ya que se llevaría a cabo en Java.

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

Esto debería traducirse en algo parecido a esto en las etiquetas Stuts:

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

Asumo parent.children deben ser algo así como $ {% (#)} parent.children pero tengo no se encontró una combinación correcta de $ {% (# caracteres para usar :-). También podría usar un enlace a una página explicando cuándo usar cuál de estos.

Respuesta

11

Prueba esto:

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

Eso funciona. Gracias. – Bloodboiler

+0

¿Alguien puede explicar el significado del signo #? Cometí el mismo error que el póster original. ¡Gracias! – Jim

+1

Esta página lo explica: http://struts.apache.org/2.x/docs/ognl.html – Nate

4

Funciona para mí:

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

¡Más elegante que la respuesta aceptada! Esto funciona porque el ítem actual en la ieración recibirá un push en la parte superior de la pila, por lo que no es necesario que el usuario var = "xxxx" para acceder a él. – user1884155

1

Así es como el código JSP se verá así:

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

A continuación se presenta el grano (XBean) cuya lista se usa en el 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 
} 

Ahora usted puede simplemente tener un campo lstBean con setters en su acción de envío (saveaction) y listo.

+1

¿Quiere decir que en la iteración interna también puedo obtener acceso al valor de la parte de iteración externa? Estupendo..... – FaithReaper

0

Para puntales 2.3.x puede utilizar este ejemplo, extraído de http://struts.apache.org/release/2.3.x/docs/iterator-tag-examples.html

En este ejemplo, 'países' es una lista de objetos de campo, cada uno de los cuales tiene un nombre y una lista de ciudades. Cada ciudad tiene un nombre.

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

Se refieren a una posición específica en la pila: '[1]'. La parte superior de la pila, posición 0, contiene la ciudad actual, presionada por el iterador interno; La posición 1 contiene el país actual, empujado allí por el iterador externo.