2012-10-02 13 views
7

शामिल JSF 1.2 और JSP .... का उपयोग करना अधिक पुनरावृतिJSF 1.2 - एक मानचित्र कि संग्रह

यह एक मानचित्र जिनके मान संग्रह शामिल अधिक पुनरावृति करना संभव है?

Map<String, List<Foo>> myMap;

मैं myMap से अधिक पुनरावृति और प्रत्येक कुंजी के लिए एक अलग तालिका आकर्षित करने के लिए करना चाहते हैं:

मैं एक नक्शा है कि इस तरह दिखता है।

प्रत्येक तालिका एकाधिक पंक्तियों को दूषित करेगी।

प्रत्येक पंक्ति ArrayList वर्तमान कुंजी को मैप किया से एक फू वस्तु का प्रतिनिधित्व करेंगी।

अफसोस की बात है कि हम जेएसएफ 1.2 और जेएसपी का उपयोग कर रहे हैं।

मुझे लगता है मैं एक नेस्टेड <h:dataTable> टैग इस्तेमाल कर सकते हैं उम्मीद कर रहा था, लेकिन मैं किसी भी सफलता नहीं कर रहा हूँ।


संपादित:

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> 

यह निम्न अपवाद का कारण बनता है:

यहाँ BalusC के जवाब से परामर्श के बाद मेरे वर्तमान JSP कोड है


यहाँ मेरी प्रबंधित बीन से कुछ कोड है।

ध्यान दें कि मैं HashMap और ArrayList के बजाय मानचित्र और सूची का उपयोग कर रहा

(मैंने कहीं पढ़ा है आप इंटरफेस है, जो भी काम नहीं करते उपयोग नहीं कर सका) से पहले

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

dumpMapInfo कॉलिंग पेज को प्रतिपादित करने से पुष्टि होती है कि मानचित्र शून्य नहीं है और अपेक्षित के रूप में पॉप्युलेट किया गया है।

+0

क्षमा करें, जेएसएफ 1.2 भाग को याद किया। यह सहायक हो सकता है: http://stackoverflow.com/a/8552872/880619 –

+0

दुर्भाग्यवश हम जेएसपी (फेसलेट्स नहीं) का उपयोग कर रहे हैं। 'Javax.servlet.jsp.JspTagException: – jahroy

उत्तर

11

JSF किसी भी घटक है जो एक Map से अधिक पुनरावृति कर सकते हैं नहीं है। केवल JSTL<c:forEach>Map पर पुनरावृत्त कर सकता है। प्रत्येक पुनरावृत्ति आपको Map.Entry वापस देता है जो बदले में getKey() और getValue() विधियां होती है। आप मानचित्र मूल्य पर फिर से शुरू करने के लिए <h:dataTable> का उपयोग कर सकते हैं।

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

अद्यतन यह केवल काम करता है जब आप JSTL 1.2 का उपयोग कर रहे हैं। यह JSTL 1.1 में विफल रहता है क्योंकि #{} JSTL 1.1 टैग में मान्यता प्राप्त नहीं है और इसलिए आप ${} का उपयोग करने के लिए मजबूर कर रहे हैं, लेकिन बदले में इस नेस्टेड JSF घटकों में विफल रहता है, क्योंकि वे #{} केवल स्वीकार करते हैं।आपको मूल रूप से कोड के पूरे टुकड़े में "सादा" जेएसपी/एचटीएमएल में गिरने की ज़रूरत होगी, या बेहतर, टॉमहॉक के <t:dataList> को पकड़ लें।

+0

मैं निम्न अपवाद मिल में <foreach>' ध्यान दें कि हम JSF 1.2 का उपयोग कर रहे आपूर्ति की "आइटम" से अधिक पुनरावृति करने के लिए कैसे पता नहीं है और सूर्य अनुप्रयोग सर्वर 9.0_1 – jahroy

+0

वर्क्स उपयोग कर रहे हैं [जेएसटीएल 1.2] (http://stackoverflow.com/tags/jstl/info) और [टोमकैट 6.0.35] (http://tomcat.apache.org/download-60.cgi) के साथ मेरे लिए ठीक है (' web.xml' Servlet 2.5 पर सेट)। क्या आप जेएसटीएल और कंटेनर संस्करण का उपयोग कर रहे हैं? – BalusC

+0

एसजेएएस 9.0 जेएसटीएल 1.1 का उपयोग करता है, लेकिन इसे अच्छे के रूप में काम करना चाहिए। क्या आप निश्चित हैं कि ईएल वाक्यविन्यास सही है? आप इस त्रुटि को उदा। '' '{{}' या '$ {}' के बिना। – BalusC

संबंधित मुद्दे