我需要使用<h:dataTable>
显示Map
。我的backingbean有一个Map
属性,如下所示:
public class Bean {
private Map<Integer,String> map; // +getter
@PostConstruct
public void init() {
map = new TreeMap<Integer,String>();
map.put(1,"Sasi");
map.put(2,"Pushparaju");
map.put(3,"Venkat Raman");
map.put(3,"Prabhakaran");
}
}
然后在JSF页面中,我尝试将这个Map
属性绑定到<h:dataTable>
的value
属性。
<h:dataTable border="1" value="#{bean.map}" var="map">
<h:column id="column1">
<f:facet name="header">
<h:outputText value="UserId"></h:outputText>
</f:facet>
<h:outputText value="#{map.getKey}"></h:outputText>
</h:column>
<h:column id="column2">
<f:facet name="header">
<h:outputText value="Email Id"></h:outputText>
</f:facet>
<h:outputText value="#{map.getValue}"></h:outputText>
</h:column>
</h:dataTable>
getKey
和getValue
不存在是错误的。我可以理解这不是正确的方法。如何使用<h:dataTable>
呈现Map
?
在即将推出的JSF 2.3之前,UIData
组件(如<h:dataTable>
、<p:dataTable>
等(和<ui:repeat>
不支持在Map
上迭代。这仅在<c:forEach>
中受支持。
一种方法是将映射条目转换为数组(单独的entrySet()
无法工作,因为UIData
在即将推出的JSF 2.3之前也不支持Set
(
<h:dataTable value="#{bean.map.entrySet().toArray()}" var="entry">
<h:column>#{entry.key}</h:column>
<h:column>#{entry.value}</h:column>
</h:dataTable>
另一种方法是将映射的条目集封装在<h:dataTable>
可以迭代的集合中,例如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>
然而,更干净、自文档化和可重用的是使用List<User>
,其中User
类具有必要的属性id
和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>
关于prageeth的最后一个答案,您可以使用entrySet而不是keySet;然后你就可以去掉myBean.map.get了。参见这个例子:
<h:dataTable border="1" value="#{myBean.map.entrySet().toArray()}" var="map">
<h:column id="column1">
<f:facet name="header">
<h:outputText value="UserId"></h:outputText>
</f:facet>
<h:outputText value="#{map.key}"></h:outputText>
</h:column>
<h:column id="column2">
<f:facet name="header">
<h:outputText value="Email Id"></h:outputText>
</f:facet>
<h:outputText value="#{map.value}"></h:outputText>
</h:column>
</h:dataTable>
这适用于我的脸2.2.3,因为我自己刚刚用过。
注:我最好评论一下上一篇文章,但我的声誉不够高,所以这是一个额外的答案。
您也可以尝试这种替代方案。
<h:dataTable border="1" value="#{myBean.map.keySet().toArray()}" var="myVar">
<h:column id="column1">
<f:facet name="header">
<h:outputText value="UserId"></h:outputText>
</f:facet>
<h:outputText value="#{myVar}"></h:outputText>
</h:column>
<h:column id="column2">
<f:facet name="header">
<h:outputText value="Email Id"></h:outputText>
</f:facet>
<h:outputText value="#{myBean.map.get(myVar)}"></h:outputText>
</h:column>
</h:dataTable>