Struts 2 вложенных итератора

Я не могу поверить, как что-то настолько простое может показаться таким сложным в Struts 2.

Это примерно то, что я хотел бы сделать, как это было бы сделано на Java.

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

Это должно означать что-то близкое к этому в тегах Stuts:

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

Я предполагаю, что parent.children должен быть чем-то вроде ${%(#parent.children)}, но я не нашел подходящей комбинации ${%(# символов для использования :-). Я также мог бы использовать ссылку на страницу, объясняющую, когда использовать какой из них.


person Bloodboiler    schedule 24.02.2010    source источник


Ответы (4)


Попробуй это:

<s:iterator var="parent" value="parents">
    <s:iterator var="child" value="#parent.children">
        <s:property value="#child.name"/>
    <s:iterator>
<s:iterator>
person Nate    schedule 25.02.2010
comment
Кто-нибудь может объяснить значение знака #? Я сделал ту же ошибку, что и оригинальный постер. Спасибо! - person Jim; 02.01.2012

Меня устраивает:

<s:iterator value="parents">
    <s:iterator value="children">
        <s:property value="name" />
    </s:iterator>
</s:iterator>
person Trick    schedule 26.02.2010
comment
Более элегантный, чем принятый ответ! Это работает, потому что текущий элемент в итерации будет перемещен на вершину стека, поэтому для доступа к нему пользователю var=xxxx не требуется. - person user1884155; 17.10.2014

Вот как будет выглядеть код JSP:

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

Ниже приведен компонент (XBean), список которого используется в 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
}

Теперь вы можете просто иметь поле lstBean с сеттерами в своем действии отправки (сохранение), и все готово.

person coding_idiot    schedule 16.02.2011
comment
То есть вы имеете в виду, что во внутренней итерации я также могу получить доступ к значению части внешней итерации? Здорово..... - person WesternGun; 30.10.2015

Для Struts 2.3.x вы можете использовать этот пример, извлеченный из http://struts.apache.org/release/2.3.x/docs/iterator-tag-examples.html

В этом примере «страны» — это список объектов страны, каждый из которых имеет имя и список городов. У каждого города есть имя.

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

Они относятся к определенной позиции в стеке: «[1]». Вершина стека, позиция 0, содержит текущий город, добавленный внутренним итератором; позиция 1 содержит текущую страну, помещенную туда внешним итератором.

person user1522193    schedule 23.10.2014