2010-01-26 6 views
6

habe ich ein Map in einer Bohne wie folgt:Wie eine verschachtelte Karte iterieren in <c:forEach>

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); 
    } 

Diese ftqSet paßt unter Datenstruktur:

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

In meinem Test JSP-Datei I habe versucht, auf die Daten unter Verwendung <c:forEach> zuzugreifen:

Aber es gibt keine ${f.feedId} aus. Warum sollte das sein? Wie würde ich auf die einzelnen Elemente dieser Struktur zugreifen, um eine schöne Tabelle zu erstellen?

Antwort

15

Jede Iteration von Map in einem c:forEach gibt eine Map.Entry Instanz wiederum die getKey() und getValue() Methoden hat. Es ist vergleichbar mit for (Entry entry : map.entrySet()) in Java.

z.

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

Im Falle eines Map<Integer, Map<String, String[]>> der #{entry.value} gibt ein Map<String, String[]>, so müssen Sie über sie iterieren auch:

<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> 

Aber in Ihrem Fall die #{nestedentry.value} ist eigentlich ein String[], also brauchen wir über sie wieder iterieren:

<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> 

By the way, sollte dies auch mit rich:dataList arbeiten .

+0

BalusC das wird sich als hilfreich erweisen, danke. – volvox

Verwandte Themen