2012-10-02 129 views
7

El uso de JSF 1.2 y JSP ....JSF 1.2 - iterar sobre un mapa que contiene Colecciones

¿Es posible repetir un mapa cuyos valores contienen colecciones?

Tengo un mapa que tiene este aspecto:

Map<String, List<Foo>> myMap;

quisiera iterar sobre myMap y dibujar una tabla separada para cada tecla.

Cada tabla contaminará varias filas.

Cada fila representará un objeto Foo de ArrayList asignado a la clave actual.

Tristemente estamos usando JSF 1.2 y JSP.

Esperaba poder utilizar una etiqueta anidada <h:dataTable>, pero no estoy teniendo éxito.


Editar:

Aquí está mi actual código JSP tras consultar la respuesta de BalusC:

    <c:forEach items="#{someModule$someBean.prefMap}" var="mapEntry"> 
         <br/><br/><p>Key: <h:outputText value="#{mapEntry.key}"/></p> 
         <h:dataTable value="#{mapEntry.value}" var="pref"> 
          <h:column><h:outputText value="#{pref.defaultFieldLabel}"/></h:column> 
          <h:column><h:outputText value="#{pref.fieldLabel}"/></h:column> 
         </h:dataTable> 
        </c:forEach> 

Se hace la siguiente excepción:

javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>


Aquí hay un código de mi Bean administrado.

Tenga en cuenta que estoy usando HashMap y ArrayList en lugar de mapa y una lista

(Leí en alguna parte que no podía usar interfaces, que también no funcionan)

private HashMap<String, ArrayList<Foo>> prefMap; 

public HashMap<String, ArrayList<Foo>> getPrefMap() 
{ 
    if (prefMap == null) 
    { 
    buildPrefMap(); 
    } 
    return prefMap; 
} 

private void buildPrefMap() 
{ 
    prefMap = new HashMap<String, ArrayList<Foo>>(); 
    for (Foo mdp : getFooArray()) 
    { 
    String cat = mdp.getField().getCategory(); 
    if (! prefMap.containsKey(cat)) 
    { 
     ArrayList<Foo> mpl = new ArrayList<Foo>(); 
     mpl.add(mdp); 
     prefMap.put(cat, mpl); 
    } 
    else 
    { 
     prefMap.get(cat).add(mdp); 
    } 
    } 
} 

private void dumpMapInfo() 
{ 
    StringBuilder sb = new StringBuilder(); 
    Map<String, ArrayList<Foo>> theMap = getPrefMap(); 
    for (String key : theMap.keySet()) 
    { 
    sb.append(key + ": " + theMap.get(key).size()); 
    } 
    System.out.println("\n\n" + sb.toString()); 
} 

de llamada antes de dumpMapInfo la representación de la página confirma que el Mapa no es nulo y está poblado como se esperaba.

+0

Lo siento, me perdí la parte de JSF 1.2. Esto podría ser útil: http://stackoverflow.com/a/8552872/880619 –

+0

Desafortunadamente estamos usando JSP (no Facelets). – jahroy

Respuesta

11

JSF no tiene ningún componente que pueda recorrer un Map. Solo el JSTL<c:forEach> puede iterar sobre un Map. Cada iteración le da un Map.Entry de vuelta que a su vez tiene getKey() y getValue() métodos. A su vez, puede usar un <h:dataTable> para iterar sobre el valor del mapa.

<c:forEach items="#{bean.map}" var="entry"> 
    <p>Key: <h:outputText value="#{entry.key}" /></p> 
    <h:dataTable value="#{entry.value}" var="foo"> 
     <h:column><h:outputText value="#{foo.prop1}" /></h:column> 
     <h:column><h:outputText value="#{foo.prop2}" /></h:column> 
     <h:column><h:outputText value="#{foo.prop3}" /></h:column> 
    </h:dataTable> 
</c:forEach> 

actualización esto sólo funciona cuando se está utilizando JSTL 1.2. Esto falla en JSTL 1.1 porque #{} no se reconoce en las etiquetas JSTL 1.1 y, por lo tanto, está obligado a usar ${}, pero esto a su vez falla en los componentes JSF anidados porque solo aceptan #{}.Básicamente, tendrías que recurrir a JSP/HTML "simple" en todo ese código, o mejor, tomar el <t:dataList> de Tomahawk.

+0

Obtengo la siguiente excepción: 'javax.servlet.jsp.JspTagException: no sé cómo iterar sobre los" elementos "provistos en < para cada >' Tenga en cuenta que estamos usando JSF 1.2 y estamos usando Sun Application Server 9.0_1 – jahroy

+0

Works bien para mí con [JSTL 1.2] (http://stackoverflow.com/tags/jstl/info) y [Tomcat 6.0.35] (http://tomcat.apache.org/download-60.cgi) (con ' web.xml' establecido en Servlet 2.5). ¿Qué versión JSTL y contenedor estás usando exactamente? – BalusC

+0

SJAS 9.0 usa JSTL 1.1, pero debería funcionar tan bien. ¿Estás seguro de que la sintaxis EL es correcta? Puede obtener este error, p. '' sin el '# {}' o '$ {}'. – BalusC

Cuestiones relacionadas