2011-12-18 62 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>像顯示波紋管遍歷這個地圖,我設置吸氣劑的地圖破發點,我注意到,它是沒有得到調用,因此沒有打印:

<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

不幸的是,UIDataUIRepeat不支持在JSF中迭代映射。

如果這困擾你(我猜它),請投給了以下的問題,如果可能的話發表評論,說明你是怎麼想的:

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文件中像這樣定義EL函數

最後使用它在一個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

有關創建新的taglib文件的更多信息。 –

9

與EL 2.2的支持,你可以遍歷圖如下圖所示。

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

這是非常低效的,因爲在每個'get(x)'中都會再次發生全圖查找。更好地遍歷'entrySet()'。 – 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

工程就像一個魅力。帶p的Primefaces 6.x JSF 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

不錯,這適用於JSF 2.1中的我 – Kuku

+0

適用於'#{sessionScope}'地圖。 –

+0

這個答案可能沒有太多upvotes,但它是迄今爲止我最喜歡的,最終讓我工作的那個 – Calabacin