2012-02-28 26 views
0

我有動態使用JSF 2 - 動態添加組件的ID不保留在回發

UIComponent c = new UICustomComponent(); 
    c.setId("someIdGeneratedDynamically"); 
    facet.getChildren().add(c); 

但在回傳中,我添加組件的組件內的面,當我遍歷這個名單,我才知道組件存在,但它們的id與我之前指定的不同。 (更具體地說,這些ID的形式是「j_id9,j_id10」等)

我調試了StateManagementStrategyImpl中的一段代碼,並意識到它們在保存視圖時故意不存儲組件ID。

我的問題是,爲什麼JSF不存儲組件ID?

回答

1

要回答你在最後陳述的問題:在RestoreView階段,JSF從模板文件重建請求的視圖。假定組件總是接收相同的ID,只要模板不更改即可。使用clientIds作爲鍵保存狀態。如果以編程方式修改clientId,則不可能正確恢復狀態:重新創建的組件將具有原始ID,並且其狀態將存儲在另一個(已修改)的ID下。這就是爲什麼它不「存儲」clientId,這是預期保持不變的事情,並允許將重新創建的組件與其先前請求的狀態進行匹配。

我相信這種行爲只適用於從模板創建的組件。 JSF有一個專門的機制來處理編程添加的組件,我希望這個機制能夠按照預期處理clientIds。

+0

恩,不完全。動態添加的組件保存了其客戶ID。請參閱'StateManagementStrategyImpl'中的'ComponentStruct'。我的問題是關於組件ID而不是客戶端ID。 – Nerrve 2012-02-28 14:25:54

+0

這正是我寫的:動態添加的組件使用單獨的狀態管理機制,但我理解你的問題涉及到一般機制。客戶端ID是組件ID的衍生產品。 – mrembisz 2012-02-28 14:40:40

+0

無論組件ID或客戶端ID如何,它們都不會保留在組件實例的下一個請求上。客戶端ID只是用於恢復狀態(作爲地圖中的一個鍵),但這可能是它唯一使用的。 – Nerrve 2012-02-28 14:54:47