2012-10-02 13 views
7

Korzystanie JSF 1,2 i JSP ....JSF 1.2 - iteracyjne nad mapą, która zawiera Kolekcje

Czy jest możliwe iteracyjne nad mapą, którego wartości zawierają kolekcje?

Mam mapę, która wygląda tak:

Map<String, List<Foo>> myMap;

Chciałbym iteracyjne nad MyMap i wyciągnąć osobną tabelę dla każdego klawisza.

Każda tabela zawiera kilka wierszy.

Każdy wiersz będzie reprezentował obiekt Foo z tablicy ArrayList zamapowanej na bieżący klucz.

Niestety używamy JSF 1.2 i JSP.

Miałem nadzieję, że mogę użyć znacznika zagnieżdżonego <h:dataTable>, ale nie mam żadnego sukcesu.


Edit:

Tu jest mój bieżący kod JSP po konsultacji BalusC za odpowiedź:

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

To powoduje, że następujący wyjątek:

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


Oto kod z mojej fasoli zarządzanej.

Zauważ, że używam HashMap i ArrayList zamiast Mapa i listy

(Czytałem gdzieś, że nie może użyć interfejsów, które również nie działa)

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

Wywołanie dumpMapInfo przed renderowanie strony potwierdza, że ​​mapa nie jest pusta i jest zapełniana zgodnie z oczekiwaniami.

+0

Przepraszamy, brakowało części JSF 1.2. To może być pomocne: http://stackoverflow.com/a/8552872/880619 –

+0

Niestety używamy JSP (nie Facelets). – jahroy

Odpowiedz

11

JSF nie ma żadnego komponentu, który może być iterowany nad Map. Tylko JSTL<c:forEach> może iterować ponad Map. Każda iteracja daje ci powrót, który z kolei ma metody getKey() i getValue(). Możesz z kolei użyć <h:dataTable> do iteracji wartości mapy.

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

Aktualizacja ten działa tylko wtedy, gdy używasz JSTL 1.2. To się nie uda w JSTL 1.1, ponieważ #{} nie jest rozpoznawany w znacznikach JSTL 1.1, a zatem użytkownik musi używać ${}, ale to z kolei zawiedzie w zagnieżdżonych komponentach JSF, ponieważ akceptują one tylko #{}.W zasadzie powinieneś powrócić do "zwykłego" JSP/HTML w całym tym kawałku kodu, lub lepiej złapać Tom2300k <t:dataList>.

+0

Otrzymuję następujący wyjątek: 'javax.servlet.jsp.JspTagException: Nie wiem jak iterować po dostarczonych" elementach "w <forEach>' Zauważ, że używamy JSF 1.2 i używamy Sun Application Server 9.0_1 – jahroy

+0

Works dobrze dla mnie z [JSTL 1.2] (http://stackoverflow.com/tags/jstl/info) i [Tomcat 6.0.35] (http://tomcat.apache.org/download-60.cgi) (z ' web.xml' ustawiony na Servlet 2.5). Jakiego JSTL i wersji kontenera dokładnie używasz? – BalusC

+0

SJAS 9.0 używa JSTL 1.1, ale powinien działać tak dobrze. Czy jesteś pewien, że składnia EL jest poprawna? Możesz uzyskać ten błąd np. '' bez '# {}' lub '$ {}'. – BalusC

Powiązane problemy