How to show hashmap values in jsf?
Asked Answered
W

2

9

I have bean "MyBean", which has property HashMap - "map" which values type is MyClass. I want to show some properties of map in jsf using ui:repeat. But these code:

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

But this code didn't show anything. Though when I try to show hashmap values in jsp this way, it was succesfull. Where I am wrong? And how fix that?

Workingman answered 14/5, 2011 at 12:13 Comment(1)
(@Aram: you need to put an empty line between normal text and code blocks, otherwise it doesn't format properly)Gesticulate
A
6

From the documentation for the repeat value attribute:

The name of a collection of items that this tag iterates over. The collection may be a List, array, java.sql.ResultSet, or an individual java Object. If the collection is null, this tag does nothing.

So, var is set as your HashMap and EL tries to look up the key "value" on it. You will need to expose your entry set as a List.

Albin answered 14/5, 2011 at 12:22 Comment(1)
@Aram Gevorgyan - like dataTable, repeat is an index-based component (see the offset and size attributes). Adam Winer (who was in the JSF expert group) discusses a similar case here: Using Sets with UIData.Albin
H
26

That's indeed a major pita. The <c:forEach> supported Map for long. Apart from supplying another getter as suggested by McDowell, you could also workaround this by a custom EL function.

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

where the EL function look like this

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

Or, if you're on EL 2.2 already (provided by Servlet 3.0 compatible containers such as Glassfish 3, Tomcat 7, etc), then just use Map#entrySet() and then Set#toArray().

<ui:repeat value="#{bean.map.entrySet().toArray()}" var="entry">
    #{entry.key} = #{entry.value} <br/>
</ui:repeat>
Heterogenesis answered 14/5, 2011 at 13:55 Comment(2)
Hi BalusC, your syntax #{util:toList(bean.map)}, is util a managed bean, BalusC? I never see this syntax before.Soma
@Thang: it's an EL function: #7080478 It's like as JSTL functions. OmniFaces has also some in of namespace, see of:mapToList().Heterogenesis
A
6

From the documentation for the repeat value attribute:

The name of a collection of items that this tag iterates over. The collection may be a List, array, java.sql.ResultSet, or an individual java Object. If the collection is null, this tag does nothing.

So, var is set as your HashMap and EL tries to look up the key "value" on it. You will need to expose your entry set as a List.

Albin answered 14/5, 2011 at 12:22 Comment(1)
@Aram Gevorgyan - like dataTable, repeat is an index-based component (see the offset and size attributes). Adam Winer (who was in the JSF expert group) discusses a similar case here: Using Sets with UIData.Albin

© 2022 - 2024 — McMap. All rights reserved.