2010-01-26 28 views
6

Tengo un Map en un grano de la siguiente manera:Cómo iterar sobre un mapa anidada en <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); 
    } 

Este ftqSet encaja debajo de estructura de datos:

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

En mi prueba archivo JSP I He estado intentando acceder a los datos usando <c:forEach>:

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

Pero no está produciendo ${f.feedId}. ¿Por qué sería esto? ¿Cómo accedería a los elementos individuales de esta estructura para poder crear una buena mesa?

Respuesta

15

Cada iteración de Map en un c:forEach da un ejemplo Map.Entry que a su vez tiene getKey() y getValue() métodos. Es similar a hacer for (Entry entry : map.entrySet()) en Java simple.

E.g.

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

En caso de un Map<Integer, Map<String, String[]>> la #{entry.value} devuelve un Map<String, String[]>, por lo que necesita para iterar sobre ella, así:

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

Pero en su caso, el #{nestedentry.value} es en realidad un String[], por lo que necesitamos para repetir una vez más:

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

Por cierto, esto se debe trabajar con rich:dataList y .

+0

BalusC esto será útil. Gracias. – volvox