【问题标题】:Struts 2 nesting iteratorsStruts 2 嵌套迭代器
【发布时间】:2011-01-20 14:41:24
【问题描述】:

我不敢相信这么简单的事情在 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)} 但我还没有找到 ${%(# 个要使用的字符的正确组合:-)。我还可以使用指向页面的链接来解释何时使用其中的哪一个。

【问题讨论】:

    标签: jsp struts2 iterator nested ognl


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 有人能解释一下#号的含义吗?我犯了与原始海报相同的错误。谢谢!
    【解决方案2】:

    它对我有用:

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

    【讨论】:

    • 比公认的答案更优雅!这是可行的,因为迭代中的当前项将被推送到堆栈顶部,因此无需用户 var="xxxx" 访问它。
    【解决方案3】:

    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>
    

    以下是 JSP 中使用 List 的 bean(XBean):

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

    现在您可以在提交操作(保存操作)中简单地使用带有 setter 的字段 lstBean,嘿,您已经完成了。

    【讨论】:

    • 所以你的意思是在内部迭代中我也可以访问外部迭代部分值?太好了.....
    【解决方案4】:

    对于 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 包含当前国家/地区,由外部迭代器推到那里。

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 2011-10-06
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多