I have a Map
of key / values, which I initialize in @PostConstruct
as follows:
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;
}
When I try to iterate over this Map with <ui:repeat>
like shown bellow, and I set a break point on the getter for the Map, I notice that it is not getting called, and so nothing is printed:
<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>
But when replacing above code with <c:foreach>
, everything works fine, and the list is printed as expected, any ideas why I am getting such behavior?
UPDATE: JSF 2.3 (since 2017) supports this out of the box.
Unfortunately,
UIData
andUIRepeat
have no support for iterating over a map in JSF.If this bothers you (I guess it does), please vote for the following issue and if possible leave a comment that explains how you feel about this:
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-479
In the mean time, you can iterate over a Map with some little helper code:
Then define an EL function in a
*-taglib.xml
file like this:And finally use it on a Facelet like this: