2010-02-09 70 views
5

如何在運行時動態綁定某個組件的值? 例如,我有以下組件標籤,JSF組件的動態值綁定

​​3210

在我的情況,「#{bean.someProp}」是僅在運行時是已知的。

實施這個最好的策略是什麼?

我應該遍歷組件樹並以編程方式設置值綁定嗎?如果是,我應該在哪個JSF生命週期階段進行遍歷?

回答

15

您可以將其綁定到Map<String, Object> bean屬性,其中String關鍵字少於或多於動態屬性名稱。您可以在EL訪問映射值的方式如下:

<h:inputText value="#{bean.map.someProp}" /> 

<h:inputText value="#{bean.map['someProp']}" /> 

它甚至可以做一點點更動態,其中someVar實際上解析爲String"someProp"

<h:inputText value="#{bean.map[someVar]}" /> 

您只需要確保在bean初始化期間創建Map,否則JSF無法訪問地圖值。 EL即不會爲您預先創建「嵌套屬性」。因此,例如,直接實例化:

public class Bean { 
    private Map<String, Object> map = new HashMap<String, Object>(); 
} 

..或者在構造函數內或@PostConstruct如果你喜歡。

+0

好吧,我明白你的意思。這是一個好主意,除了我將放棄在我的實體中註釋中定義的所有元數據。這也意味着失去使用(來自SEAM的hibernate驗證標籤)和依賴於註釋元數據的所有其他基礎設施的優勢。 僅供參考,我這樣做是爲了製作一個實現「裸體對象」模式的框架(一個參考實現是http://www.nakedobjects.org/)。基本上它檢查一個實體並自動建立相關的表格和表單(在這種情況下是組件樹)。 – bungrudi 2010-02-09 02:08:20

+0

Urm,...對第二個想法,使用這種方法我不必鬆開所有註釋元數據。 我會試試這個,讓你知道。 – bungrudi 2010-02-09 03:32:40

+0

這是我目前的做法。通過這樣做,我失去了的優勢,並且必須在其他地方重新實現驗證。這很簡單,只需調用hibernateValidator.validate(bean)即可。 – bungrudi 2010-09-30 01:00:13

0

另一種選擇是你可以爲你的bean添加一個抽象層。

public String getDynamicProp() { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

public void setDynamicProp(String input) { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

那麼你就直接配合你的JSF的動態道具:

#{bean.dynamicProp} 

然而,這不會掛到像驗證程序的元數據和你想的一樣。但是,您可以通過編程方式調用驗證並自行處理。