【问题标题】:Struts2 nested iteratorsStruts2 嵌套迭代器
【发布时间】:2015-02-23 16:26:03
【问题描述】:

我无法让嵌套迭代器工作。内部迭代器在外部迭代器的第一个循环中工作,然后在外部迭代器的后续循环中失败。

我正在使用 Struts2 2.3.16.3。

package actions.test;

public class MainArray 
{
  private String mainVal_1="Main Hello";
  private String mainVal_2="Main World";
  private SubArray subArray;

  public SubArray getSubArray() { return subArray; }

  public void setSubArray(SubArray subArray) { this.subArray = subArray; }

  public String getMainVal_1() { return mainVal_1; }

  public String getMainVal_2() { return mainVal_2; }
}
package actions.test;

public class SubArray 
{
  private String subVal_1="Sub Hello";
  private String subVal_2="Sub World";

  public String getSubVal_1() { return subVal_1; }

  public String getSubVal_2() { return subVal_2; }
}
package actions.test;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport
{
  private static final long serialVersionUID = -5466515238282086387L;
  List<MainArray> mainArrayList = new ArrayList();

  public String execute()
  {
    SubArray sub1 = new SubArray(); 
    SubArray sub2 = new SubArray();
    SubArray sub3 = new SubArray();

    MainArray main1 = new MainArray();
    main1.setSubArray(sub1);

    MainArray main2 = new MainArray();
    main1.setSubArray(sub2);

    MainArray main3 = new MainArray();
    main1.setSubArray(sub3);

    mainArrayList.add(main1);
    mainArrayList.add(main2);
    mainArrayList.add(main3);

    return "success";
  }

  public List<MainArray> getMainArrayList()  { return mainArrayList;} 
}
<%@ taglib prefix="s" uri="/struts-tags" %>

<h1>Test</h1>

<s:iterator value="mainArrayList" >
  * <s:property value="mainVal_1"/>, 
    <s:property value="mainVal_2"/><br> 
    <s:iterator value="subArray">
    ** <s:property value="subVal_1"/>,      
       <s:property value="subVal_2"/><br>
    </s:iterator>
</s:iterator>

输出:

Test
* Main Hello, Main World
** Sub Hello, Sub World
* Main Hello, Main World
* Main Hello, Main World

请注意,嵌套迭代器仅适用于外循环的第一遍。我尝试了许多变体,例如将var="main" 添加到外循环。但我得到了相同的结果:

<%@ taglib prefix="s" uri="/struts-tags" %>

<h1>Test</h1>

<s:iterator value="mainArrayList" var="main">
  * <s:property value="mainVal_1"/>, 
    <s:property value="mainVal_2"/><br> 
    <s:iterator value="#main.subArray">
    ** <s:property value="subVal_1"/>,  
       <s:property value="subVal_2"/><br>
    </s:iterator>
</s:iterator>

关于如何让这个场景发挥作用有什么想法吗?

【问题讨论】:

    标签: java jsp struts2 iterator ognl


    【解决方案1】:

    您仅在 main1 上设置了子数组(但设置了 3 次),因此其他 2 个没有子数组集并且不产生输出。

    【讨论】:

      【解决方案2】:

      来自Iterator 文档:

      迭代器将迭代一个值。 可迭代值可以是以下任何一种:java.util.Collectionjava.util.Iterator

      尽管有这个名字,你的 SubArray 不是一个数组,而是一个 POJO。

      然后只需使用点符号来访问它及其属性:

      <s:iterator value="mainArrayList" >
        * <s:property value="mainVal_1"/>, 
          <s:property value="mainVal_2"/><br>
        ** <s:property value="subArray.subVal_1"/>,      
           <s:property value="subArray.subVal_2"/><br>
      </s:iterator>
      

      还要避免在变量名中混用camelCasesnake_case。最佳做法是仅使用 camelCase(例如 mainVal1、subVal1)。

      要了解如何在 OGNL 中使用 # 和其他符号,请阅读 this answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        相关资源
        最近更新 更多