2012-06-12 126 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)。