我在组件中有一个方面,我在其中使用
动态添加组件 UIComponent c = new UICustomComponent();
c.setId("someIdGeneratedDynamically");
facet.getChildren().add(c);
但是在回发时,当我遍历此列表时,我意识到组件存在,但它们的ID与我之前指定的不同。 (更具体地说,这些ID的形式为“j_id9,j_id10”等)
我在StateManagementStrategyImpl中调试了一些代码,并意识到他们在保存视图时故意不存储组件ID。
我的问题是,为什么JSF不存储组件ID?
答案 0 :(得分:1)
回答最后陈述的问题:在RestoreView阶段,JSF从模板文件重建请求的视图。假设组件始终接收相同的ID,只要模板不更改即可。使用clientIds作为键保存状态。如果以编程方式修改clientId,则无法正确恢复状态:重新创建的组件将具有原始id,并且其状态将存储在另一个(已修改的)id下。这就是为什么它不“存储”clientId,这是预期保持不变的事情,并允许将重新创建的组件与之前请求的状态进行匹配。
我认为此行为仅适用于从模板创建的组件。 JSF有一个专门的机制来处理以编程方式添加的组件,我希望这种机制能够按预期处理clientIds。