Until upcoming JSF 2.3, UIData
components such as <h:dataTable>
, <p:dataTable>
, etc and <ui:repeat>
does not support iterating over a Map
. This is only supported in <c:forEach>
.
One way is to convert the map entries to an array (alone entrySet()
won't work as UIData
also doesn't support Set
until upcoming JSF 2.3).
<h:dataTable value="#{bean.map.entrySet().toArray()}" var="entry">
<h:column>#{entry.key}</h:column>
<h:column>#{entry.value}</h:column>
</h:dataTable>
Another way is to wrap the map's entry set in a collection which the <h:dataTable>
can iterate over, such as an ArrayList
.
public class Bean {
private Map<Integer, String> map;
private List<Entry<Integer, String>> entries; // +getter (no setter necessary)
@PostConstruct
public void init() {
map = new TreeMap<>();
map.put(1, "Sasi");
map.put(2, "Pushparaju");
map.put(3, "Venkat Raman");
map.put(4, "Prabhakaran");
entries = new ArrayList<>(map.entrySet());
}
// ...
}
<h:dataTable value="#{bean.entries}" var="entry">
<h:column>#{entry.key}</h:column>
<h:column>#{entry.value}</h:column>
</h:dataTable>
However, more clean, self documenting and reusable is to use a List<User>
instead wherein the User
class has the necessary properties id
and name
.
public class Bean {
private List<User> users; // +getter (no setter necessary)
@PostConstruct
public void init() {
users = new ArrayList<>();
users.add(new User(1, "Sasi"));
users.add(new User(2, "Pushparaju"));
users.add(new User(3, "Venkat Raman"));
users.add(new User(4, "Prabhakaran"));
}
// ...
}
<h:dataTable value="#{bean.users}" var="user">
<h:column>#{user.id}</h:column>
<h:column>#{user.name}</h:column>
</h:dataTable>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…