JSF 2 - 动态添加组件的ID不会在回发时保留

时间:2012-02-28 12:37:45

标签: jsf jsf-2 state-saving

我在组件中有一个方面,我在其中使用

动态添加组件
    UIComponent c = new UICustomComponent();
    c.setId("someIdGeneratedDynamically");
    facet.getChildren().add(c);

但是在回发时,当我遍历此列表时,我意识到组件存在,但它们的ID与我之前指定的不同。 (更具体地说,这些ID的形式为“j_id9,j_id10”等)

我在StateManagementStrategyImpl中调试了一些代码,并意识到他们在保存视图时故意不存储组件ID。

我的问题是,为什么JSF不存储组件ID?

1 个答案:

答案 0 :(得分:1)

回答最后陈述的问题:在RestoreView阶段,JSF从模板文件重建请求的视图。假设组件始终接收相同的ID,只要模板不更改即可。使用clientIds作为键保存状态。如果以编程方式修改clientId,则无法正确恢复状态:重新创建的组件将具有原始id,并且其状态将存储在另一个(已修改的)id下。这就是为什么它不“存储”clientId,这是预期保持不变的事情,并允许将重新创建的组件与之前请求的状态进行匹配。

我认为此行为仅适用于从模板创建的组件。 JSF有一个专门的机制来处理以编程方式添加的组件,我希望这种机制能够按预期处理clientIds。