2012-06-12 74 views
4

我可以绑定我的h:dataTable/rich:dataTable与一些Map吗?我发现h:dataTable只能和List对象一起工作,而List中的删除可能非常繁重。jsf使用集合/ map

+1

是什么让你觉得它在使用地图时不那么“沉重”?这是一个绝对的非论点。 – BalusC

+0

,因为在地图中我可以直接访问需要的成员,并且在列表中我需要查看所有成员以找到它。 –

+0

你认为它在封面下做什么? “Map”如何找到与关键字相关联的值?对,它也循环所有元素。唯一的区别是这是通过一种额外的方法隐藏起来的。用'Map'代替'List'使得它仅仅不必要地变得更加低效,因为你基本上最终得到的是一个'Set' **和一个'List',而不是'List',它允许使用'ArrayList'实现时可以实现最快的迭代。 – BalusC

回答

4

是的,没错。 dataTable,UI:重复和朋友只能使用列表。

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

通常当我想从一个JSF视图迭代的地图,我像做

<h:dataTable value="#{bean.mapKeys}" var="key"> 
    <h:outputText value="#{bean.map[key]}"/> 
</h:dataTable> 

与管理bean属性

class Bean { 
    public List<T> mapKeys() { 
    return new ArrayList<T>(map.keySet()); 
    } 
} 

或类似的东西。

当然,如果您使用类似于TreeMapLinkedHashMap这样的保留排序的方法,这是最有意义的。

+2

''目前**不支持迭代“集合”或“集合”。然而,这一支持将在即将到来的JSF 2.2中引入。到目前为止,只有''支持地图。 – BalusC

+0

好点。固定。 – wrschneider

4

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

class Bean { 
    public Map<T,U> getMap() { 
    return yourMap; 
    } 
} 

,并在您的JSF视图

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

此使用将密钥集转换为数组,可以由数据表迭代。使用“()”表达式需要统一表达式语言2(Java EE 6)。