我在bean中有一个Map如下: public class TaskListData { private MapString, String[] srcMasks = new HashMapString, String[](); private MapInteger, MapString, String[] ftqSet = new HashMapInteger, MapString, String[](); public void set
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}.为什么会这样?我如何访问这个结构的各个元素,以便创建一个漂亮的表?
c:forEach中Map的每次迭代都会给出一个Map.Entry
实例,而这个实例又有
getKey()
和
getValue()
方法.它与普通Java中的(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一起使用.