如何遍历 <c:forEach> 中的嵌套映射
Posted
技术标签:
【中文标题】如何遍历 <c:forEach> 中的嵌套映射【英文标题】:How to iterate over a nested map in <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 文件中,我一直在尝试使用 <c:forEach>
访问数据:
<c:forEach items="#bean.ftqSet" var="f">
this text does not print
$f.feedId
</c:forEach>
但它没有输出$f.feedId
。为什么会这样?我将如何访问该结构的各个元素以便创建一个漂亮的表格?
【问题讨论】:
【参考方案1】:c:forEach
中 Map
的每次迭代都会产生一个 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<Integer, Map<String, String[]>>
,#entry.value
返回一个Map<String, 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 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
。
【讨论】:
以上是关于如何遍历 <c:forEach> 中的嵌套映射的主要内容,如果未能解决你的问题,请参考以下文章