2011-05-14 70 views
9

我有bean「MyBean」,它具有屬性HashMap - 「map」,其值類型是MyClass。我想使用ui在jsf中顯示地圖的一些屬性:repeat。 但這些代碼:如何在jsf中顯示hashmap值?

<ui:repeat var="var" value="#{mybean.map}" > 
<tr> 
<td> <h:outputText value="#{var.value.property1}"></h:outputText> </td> 
<td><h:outputText value="#{var.value.property2}"></h:outputText></td> 
</tr> 
</ui:repeat> 

但這代碼並沒有顯示任何東西。儘管當我嘗試以這種方式在jsp中顯示hashmap值時,它是成功的。我錯在哪裏?那該怎麼解決?

+0

(@Aram:你需要把正常的文本和代碼塊之間的空行,否則就不能正常格式化) – Mat 2011-05-14 12:15:35

+0

@Mat:好的,謝謝。我不知道那件事。 – 2011-05-14 12:17:12

回答

5

documentationrepeat值屬性:

,這個標籤迭代項目的集合的名稱。該集合可以是List,陣列,java.sql.ResultSet或個人java Object。如果集合爲空,則此標記不執行任何操作。

因此,var被設置爲您的HashMap,EL試圖在其上查找關鍵碼"value"。您需要將您的輸入集公開爲List

+0

那麼這是沒有辦法使用地圖? – 2011-05-14 12:38:03

+0

@Aram Gevorgyan - 與'dataTable'類似,'repeat'是一個基於索引的組件(請參閱_offset_和_size_屬性)。 Adam Winer(在JSF專家組中)在這裏討論了一個類似的例子:[使用帶有UIData的集合](http://sfjsf.blogspot.com/2006/03/usings-sets-with-uidata.html)。 – McDowell 2011-05-14 14:03:00

25

這確實是一個主要的皮塔餅。長期支持Map<c:forEach>。除了按照McDowell的建議提供另一個吸氣劑之外,您還可以通過custom EL function解決此問題。

<ui:repeat value="#{util:toList(bean.map)}" var="entry"> 
    #{entry.key} = #{entry.value} <br/> 
</ui:repeat> 

其中EL功能這個樣子的

public static List<Map.Entry<?, ?>> toList(Map<?, ?> map) { 
    return = map != null ? new ArrayList<Map.Entry<?,?>>(map.entrySet()) : null; 
} 

或者,如果你在EL 2.2已經(通過提供的Servlet 3.0兼容的容器,如Glassfish的3,Tomcat的7等),然後只需使用Map#entrySet(),然後使用Set#toArray()

<ui:repeat value="#{bean.map.entrySet().toArray()}" var="entry"> 
    #{entry.key} = #{entry.value} <br/> 
</ui:repeat> 
+0

謝謝,但我想我可以用列表來完成。 – 2011-05-14 14:31:59

+0

Hi BalusC,你的語法'#{util:toList(bean.map)}'是'util'一個託管bean,BalusC?我從來沒有看到過這種語法。 – 2012-04-26 01:28:28

+0

@Thang:這是一個EL函數:http://stackoverflow.com/questions/7079978/how-to-create-a-custom-el-function/7080174#7080174它就像JSTL函數一樣。 [OmniFaces](http://wiki.omnifaces.googlecode.com/hg/vdldoc/index.html)也有一些在''''名稱空間中,參見':mapToList()'。 – BalusC 2012-04-26 02:45:03