Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show hashmap values in jsf?

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?

like image 736
Aram Gevorgyan Avatar asked May 14 '11 12:05

Aram Gevorgyan


2 Answers

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>
like image 158
BalusC Avatar answered Oct 15 '22 05:10

BalusC


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.

like image 41
McDowell Avatar answered Oct 15 '22 05:10

McDowell