2012-10-02 13 views
7

içeren bir harita üzerinde yinelemeMTU 1,2-1,2</strong> JSF <strong>ve <strong>JSP</strong> .... Kullanarak Koleksiyonları

kimin değerleri Koleksiyonları içerirler bir harita üzerinde yineleme yapmak mümkün mü? Ben myMap üzerinde yineleme ve her anahtar için ayrı bir tablo çizmek istiyoruz

Map<String, List<Foo>> myMap;

:

ben şöyle bir harita var.

Her tablo birden fazla satırı gösterecektir.

Her satır, geçerli anahtarla eşleştirilen ArrayList öğesinden bir Foo nesnesini temsil edecektir.

Ne yazık ki JSF 1.2 ve JSP kullanıyoruz.

Yuvalanmış bir <h:dataTable> etiketini kullanabileceğimi umuyordum, ancak hiç bir başarım yok.


Düzenleme:

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

:

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

Aşağıdaki istisna neden olur: Burada

BalusC yanıtını danıştıktan sonra benim şimdiki JSP kodu

Yönetilen Bean'imden bazı kodlar. Ben HashMap ve ArrayList yerine Harita ve Listesini kullanıyorum

Not

önce dumpMapInfo çağrılması

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

(Ben de çalışmayan arabirimleri, kullanamadı okumuştum) Bu sayfanın oluşturulması, Haritanın boş olmadığını ve beklendiği gibi doldurulduğunu doğrular.

+0

Üzgünüm, JSF 1.2 bölümünü kaçırdım. Bu yararlı olabilir: http://stackoverflow.com/a/8552872/880619 –

+0

Ne yazık ki JSP kullanıyoruz (Facelets değil). – jahroy

cevap

11

JSF, Map üzerinde yineleyebilecek herhangi bir bileşene sahip değil. Yalnızca JSTL<c:forEach>, Map üzerinde yineleyebilir. Her yineleme size getKey() ve getValue() yöntemlerine sahip olan bir geri verir. Sırayla harita değeri üzerinde yinelemek için bir <h:dataTable> kullanabilirsiniz. Eğer JSTL 1.2 kullanırken


<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> 
Güncelleme bu sadece çalışır. Bu JSTL 1.1 başarısız olur, çünkü #{} JSTL 1.1 etiketlerinde tanınmaz ve bu nedenle ${} kullanmak zorundasınız, ancak bu, iç içe JSF bileşenlerinde yalnızca başarısız olur, çünkü bunlar yalnızca #{} kabul eder.Temel olarak, tüm kod parçasında "düz" JSP/HTML'ye geri dönmeniz veya Tomahawk'in <t:dataList>'u yakalamanız gerekir.

+0

Aşağıdaki özel durumu alıyorum: javax.servlet.jsp.JspTagException: <forEach> için ürünle birlikte verilen öğeler arasında nasıl yineleme yapıldığını bilmiyorum. JSF 1.2 kullandığımızı ve Sun Application Server 9.0_1 – jahroy

+0

Works'ü kullanıyor olduğumuzu unutmayın [JSTL 1.2] (http://stackoverflow.com/tags/jstl/info) ve [Tomcat 6.0.35] (http://tomcat.apache.org/download-60.cgi) ile birlikte benim için iyi web.xml, Servlet 2.5 olarak ayarlandı. Tam olarak hangi JSTL ve kapsayıcı sürümünü kullanıyorsunuz? – BalusC

+0

SJAS 9.0, JSTL 1.1 kullanır, ancak iyi çalışması gerekir. EL sözdiziminin doğru olduğundan emin misiniz? Bu hatayı örn. '' # {} 'veya' $ {} 'içermez. – BalusC