jsf使用集合/地图

uda*_*ota 6 jsf richdatatable

我可以将我的h:dataTable/rich:dataTable绑定到一些Map吗?我发现h:dataTable只能用于List对象,而在List中删除可能非常繁重.

tin*_*e2k 7

如果你想在你的支持bean中只有一个提供地图的方法,你可以这样做:

class Bean {
  public Map<T,U> getMap() {
    return yourMap;
  }
}
Run Code Online (Sandbox Code Playgroud)

并在您的JSF视图中使用它

<h:dataTable value="#{bean.map.keySet().toArray()}" var="key"> 
   <h:outputText value="#{bean.map[key]}"/> 
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)

这会将键集转换为数组,数组可以迭代.使用"()" - 表达式需要统一表达式语言2(Java EE 6).


wrs*_*der 6

恩,那就对了.dataTable,ui:重复和朋友只能使用列表.

您可以添加一个托管bean方法,将map.keySet()或map.values()放入一个列表中,具体取决于您要迭代的内容.

通常当我想从JSF视图迭代一个地图时,我会做类似的事情

<h:dataTable value="#{bean.mapKeys}" var="key"> 
   <h:outputText value="#{bean.map[key]}"/> 
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)

使用托管bean属性

class Bean {
   public List<T> mapKeys() {
     return new ArrayList<T>(map.keySet());
   }
} 
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

当然,如果您使用类似TreeMapLinkedHashMap保留订购的东西,这将是最有意义的.

  • `<h:dataTable>`目前**不支持迭代`Set <E>`或`Collection <E>`.然而,这种支持将在即将推出的JSF 2.2中引入.到目前为止,只有`<c:forEach>`支持地图. (2认同)