JSF2-动态添加的组件';回发时不会保留s ID

JSF2-动态添加的组件';回发时不会保留s ID,jsf,jsf-2,state-saving,Jsf,Jsf 2,State Saving,我在一个组件中有一个方面,我在其中使用 UIComponent c = new UICustomComponent(); c.setId("someIdGeneratedDynamically"); facet.getChildren().add(c); 但是在回发时,当我迭代这个列表时,我意识到组件是存在的,但是它们的ID与我前面指定的不同。(更具体地说,这些ID的形式为“j_id9、j_id10”等) 我在StateManagementStrategyImpl中调试

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

    UIComponent c = new UICustomComponent();
    c.setId("someIdGeneratedDynamically");
    facet.getChildren().add(c);
但是在回发时,当我迭代这个列表时,我意识到组件是存在的,但是它们的ID与我前面指定的不同。(更具体地说,这些ID的形式为“j_id9、j_id10”等)

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


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

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


我相信这种行为只适用于从模板创建的组件。JSF有一个专门的机制来处理以编程方式添加的组件,我希望这个机制能够像预期的那样处理ClientID。

um,不完全如此。动态添加的组件确实保存了它们的客户端ID。请参见
StateManagementStrategyImpl
中的
ComponentStruct
。我的问题是关于组件ID而不是客户端ID。这正是我写的:动态添加的组件使用单独的机制进行状态管理,但我理解您的问题涉及一般机制。客户端id是组件id的派生。无论组件id或客户端id是什么,在组件实例的下一个请求中都不会保留它们。客户端id仅用于恢复状态(作为映射中的键),但这可能是它唯一的用途。客户端id用于将发布的数据(通过浏览器提交)与服务器端的组件相匹配,正确恢复这些组件至关重要。不幸的是,我不知道为什么你的情况没有发生。我的假设是,jsf假设它将自动为这些动态组件分配组件ID,而不依赖用户在上面设置它们。我想它对大多数人都有效,因为最初,如果它分配了ID,那么在回发时,这些组件上也会有相同的ID,即j_id1等,因此解码也会起作用。但不幸的是,当手动分配ID时,情况就不同了。