2012-02-28 65 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