2011-12-18 7 views
16

साथ काम नहीं करता मैं कुंजी/मान के Map, जो मैं @PostConstruct में प्रारंभ इस प्रकार है:ui: दोहराने मानचित्र

Map<String, String> myMap; 

@PostConstruct 
public void init() { 

    myMap=new LinkedHashMap<String, String>(); 
    myMap.put("myKey","myValue"); 

} 

public Map<String, String> getMyMap() { 
    return myMap; 
} 

public void setMyMap(Map<String, String> myMap) { 
    this.myMap = myMap; 
} 

जब मैं साथ <ui:repeat> तरह bellow से पता चला इस मानचित्र से अधिक पुनरावृति करने की कोशिश, और मैं मानचित्र के लिए गेटर पर एक को तोड़ने बिंदु निर्धारित, मुझे लगता है कि यह नहीं कहा जा रहा है नोटिस, और इसलिए कुछ भी नहीं छपा है:

<ice:panelGroup> 
    <ui:repeat items="#{myBean.myMap}" var="entry" varStatus="loop"> 
     <input type="checkbox" name="myCheckBoxes" value="#{entry.value}" /> 
     <span class="#{fn:contains(entry.value,'g') ? 'bold-style' : ''}">#{entry.key}</span> 
    </ui:repeat> 
</ice:panelGroup> 

लेकिन जब <c:foreach> साथ कोड ऊपर की जगह, सब कुछ ठीक काम करता है, और सूची उम्मीद के रूप में मुद्रित है, किसी भी विचार क्यों मुझे ऐसा व्यवहार हो रहा है?

उत्तर

27

दुर्भाग्यवश, UIData और UIRepeat जेएसएफ में मानचित्र पर पुन: प्रयास करने के लिए कोई समर्थन नहीं है।

इस आपको परेशान करती है (मुझे लगता है कि यह करता है), निम्न समस्या लिए वोट करें और यदि संभव हो तो एक टिप्पणी है कि बताते हैं छोड़ कैसे आप इस बारे में क्या महसूस:

http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-479

मतलब समय में, आप कुछ छोटे सहायक कोड के साथ एक मानचित्र से अधिक पुनरावृति कर सकते हैं:

0:

/** 
* Converts a Map to a List filled with its entries. This is needed since 
* very few if any JSF iteration components are able to iterate over a map. 
*/ 
public static <T, S> List<Map.Entry<T, S>> mapToList(Map<T, S> map) { 

    if (map == null) { 
     return null; 
    } 

    List<Map.Entry<T, S>> list = new ArrayList<Map.Entry<T, S>>(); 
    list.addAll(map.entrySet()); 

    return list; 
} 

फिर एक *-taglib.xml फ़ाइल इस तरह में एक ईएल समारोह को परिभाषित

और अंत में इस तरह की एक Facelet पर इसका इस्तेमाल:

<html xmlns:util="http://example.com/util"> 

    <ui:repeat value="#{util:mapToList(someDate)}" var="entry" > 
     Key = #{entry.key} Value = #{entry.value} <br/> 
    </ui:repeat> 
+0

@Arjan Tijms, महान उत्तर के लिए धन्यवाद, BTW , मैं इस मुद्दे के लिए कैसे मतदान कर सकता हूं? –

+0

खाता बनाएं और लॉगिन करें (यह तेज़ और आसान है), फिर पृष्ठ के बाईं ओर, "संचालन" के नीचे लिंक की सूची के बीच कहीं "मतदान" लिंक है। –

+0

कृपया नई टैगलिब फ़ाइल बनाने के बारे में थोड़ी अधिक जानकारी कृपया। –

9
एल 2.2 समर्थन के साथ

आप नीचे दिए गए की तरह नक्शे पुनरावृति कर सकते हैं।

<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x"> 
    <h:outputText value="#{myBean.stats.get(x)}" /><br /> 
</ui:repeat> 
+4

यह बहुत अक्षम है क्योंकि प्रत्येक 'get (x) 'के दौरान पूर्ण नक्शा लुकअप फिर से होता है। 'एंट्रीसेट() 'पर बेहतर पुनरावृत्ति। – BalusC

21
<a4j:repeat value="#{myBean.myMap.entrySet().toArray()}" var="_entry"> 
     <h:outputText value="#{_entry.key}"/><br/> 
     <h:outputText value="#{_entry.value}"/> 
</a4j:repeat> 

भी <ui:repeat>

+0

एक आकर्षण की तरह काम करता है। प्राइमफेस 6.x जेएसएफ 2.2 पी के साथ: दोहराना धन्यवाद। –

13

JSF 1.2 पर मेरे लिए काम करने के लिए लगता है के साथ प्रयोग करते हैं, आशा है कि यह किसी को मदद करता है ...

<h:panelGroup> 
     <ul> 
     <ui:repeat value="#{myBean.myMap.keySet().toArray()}" var="key"> 
      <li>key:#{key}</li> 
      <li>value:#{myBean.myMap[key]}</li> 
     </ui:repeat> 
     </ul> 
    </h:panelGroup> 
+0

अच्छा, यह मेरे लिए जेएसएफ 2.1 – Kuku

+0

में काम करता है '# {sessionScope}' मानचित्र के साथ अच्छी तरह से काम करता है। –

+0

इस उत्तर में कई अपवॉट नहीं हो सकते हैं लेकिन यह अब तक मेरा पसंदीदा है और जिसने मुझे अंततः काम किया है – Calabacin