我有一个Map如下所示的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适合以下数据结构:
ftqSet
feedId = "5", feedName = "myFeedName", ftqSet => { 1 => { srcDirs = ["/path/string"], masks = ["p.txt", "q.csv"] } 2 => { ... } }, ...
在我的测试JSP文件中,我一直在尝试使用来访问数据<c:forEach>:
<c:forEach>
<c:forEach items="#{bean.ftqSet}" var="f"> this text does not print ${f.feedId} </c:forEach>
但是它没有输出${f.feedId}。为什么会这样呢?我将如何访问该结构的各个元素,以便创建一个漂亮的表?
${f.feedId}
的每次迭代Map中c:forEach给出了一个Map.Entry实例,它反过来又getKey()和getValue()方法。这与for (Entry entry : map.entrySet())在普通Java中进行操作类似。
c:forEach
Map.Entry
getKey()
getValue()
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[]>,所以你需要遍历它还有:
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}实际上是a String[],因此我们需要再次对其进行迭代:
#{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。
rich:dataList