2010-01-26 14 views
6

Ho una Map in un fagiolo come segue:Come iterare su una mappa nidificato 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); 
    } 

Questo ftqSet si inserisce in seguito datastructure:

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

Nella mia prova file JSP I Ho cercato di accedere ai dati utilizzando <c:forEach>:

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

Ma non sta emettendo ${f.feedId}. Perché dovrebbe essere? Come potrei accedere ai singoli elementi di questa struttura in modo da poter creare un bel tavolo?

risposta

15

Ogni iterazione di Map in un c:forEach dà un'istanza Map.Entry che a sua volta ha getKey() e getValue() metodi. È simile a fare for (Entry entry : map.entrySet()) in Java normale.

E.g.

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

In caso di Map<Integer, Map<String, String[]>> del #{entry.value} restituisce un Map<String, String[]>, quindi è necessario scorrere su di esso così:

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

Ma nel tuo caso, il #{nestedentry.value} è in realtà un String[], quindi abbiamo bisogno per scorrere di nuovo:

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

Tra l'altro, questo dovrebbe funzionare con rich:dataList pure .

+0

BalusC ciò si rivelerà v utile grazie. – volvox