【问题标题】:How to iterate over a nested map in <c:forEach>如何遍历 <c:forEach> 中的嵌套映射
【发布时间】:2011-01-09 15:11:14
【问题描述】:

我在 bean 中有一个 Map,如下所示:

public class TaskListData {
    private Map<String, String[]> srcMasks = new HashMap<String, String[]>();
    private Map<Integer, Map<String, String[]>> ftqSet = new HashMap<Integer, Map<String, String[]>>();

    public void setFTQSet(Integer ftqid, String[] src, String[] masks) {  
        srcMasks.put("srcDir", src);
        srcMasks.put("masks", masks);
        ftqSet.put(ftqid, srcMasks);
    }

这个ftqSet 适合以下数据结构:

feedId = "5",
feedName = "myFeedName",
ftqSet => {
            1 => {
                    srcDirs = ["/path/string"],
                    masks = ["p.txt", "q.csv"]
                 }
            2 => { ...
                 }
          }, ...

在我的测试 JSP 文件中,我一直在尝试使用 &lt;c:forEach&gt; 访问数据:

<c:forEach items="#{bean.ftqSet}" var="f">
    this text does not print
    ${f.feedId}
</c:forEach>

但它没有输出${f.feedId}。为什么会这样?我将如何访问该结构的各个元素以便创建一个漂亮的表格?

【问题讨论】:

    标签: jsp foreach hashmap jstl


    【解决方案1】:

    c:forEachMap 的每次迭代都会产生一个 Map.Entry 实例,该实例又具有 getKey()getValue() 方法。这类似于在纯 Java 中执行 for (Entry entry : map.entrySet())

    例如

    <c:forEach items="#{bean.map}" var="entry">
        <h:outputText value="Key: #{entry.key}, Value: #{entry.value}" /><br />
    </c:forEach>
    

    如果是Map&lt;Integer, Map&lt;String, String[]&gt;&gt;#{entry.value} 返回一个Map&lt;String, String[]&gt;,因此您还需要对其进行迭代:

    <c:forEach items="#{bean.map}" var="entry">
        <h:outputText value="Key: #{entry.key}, Values:" />
        <c:forEach items="#{entry.value}" var="nestedentry">
            <h:outputText value="Nested Key: #{nestedentry.key}, Nested Value: #{nestedentry.value}" />
        </c:forEach><br />
    </c:forEach>
    

    但在您的情况下,#{nestedentry.value} 实际上是 String[],因此我们需要再次对其进行迭代:

    <c:forEach items="#{bean.map}" var="entry">
        <h:outputText value="Key: #{entry.key}, Values:" />
        <c:forEach items="#{entry.value}" var="nestedentry">
            <h:outputText value="Nested Key: #{nestedentry.key}, Nested Values: " />
            <c:forEach items="#{nestedentry.value}" var="nestednestedentry">
                <h:outputText value="#{nestednestedentry}" />
            </c:forEach><br />
        </c:forEach><br />
    </c:forEach>
    

    顺便说一句,这应该也适用于rich:dataList

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多