Jsf UIComponent客户端ID是否可以在请求之间更改?

Jsf UIComponent客户端ID是否可以在请求之间更改?,jsf,components,clientid,Jsf,Components,Clientid,我是否应该期望UIComponent#getClientId()的结果会在用户会话中发生变化?我想将完整的clientId引用保存到UIComponent,以后再使用它 当用户添加动态组件时: myBean.setClientId(composite.getClientId()); 在会话后期,当用户“保存”时: 也许不同的JSF实现不能保证相同的clientId 整个疗程 动态添加和删除UIComponents(或突发奇想)可能会导致路径中的一个容器跨请求更改索引 我看到了这个很棒的问答

我是否应该期望
UIComponent#getClientId()
的结果会在用户会话中发生变化?我想将完整的clientId引用保存到
UIComponent
,以后再使用它

当用户添加动态组件时:

myBean.setClientId(composite.getClientId());
在会话后期,当用户“保存”时:

  • 也许不同的JSF实现不能保证相同的clientId 整个疗程
  • 动态添加和删除
    UIComponents
    (或突发奇想)可能会导致路径中的一个容器跨请求更改索引
我看到了这个很棒的问答,我不确定它是否完全回答了保存clientId并在以后的会话或动态表单中多次使用它的问题:


谢谢

如果由于开发人员未通过
ID
属性指定固定组件ID,因此客户端ID包含自动生成的ID,则无法保证在另一个请求中该ID相同。如果组件库或您自己通过添加/删除没有固定ID的组件以编程方式操纵组件树,则肯定不会。然后,“相同”组件上自动生成的ID可能会根据组件在总树中的位置而改变

这不是特定于JSF实现的。JSF规范只保证(生成的)客户端ID在整个请求中是相同的。另见:

实例的整个生命周期内,此方法返回的值必须相同,除非组件的id属性发生更改,或者组件放置在客户端id发生更改的
NamingContainer
中(例如,
UIData
)。但是,即使在这些情况下,对该方法的连续调用也必须始终返回相同的值

UI组件实例在请求范围内。因此,您的示例中的
#{myBean}
绝对不应该位于比请求范围更广的范围内,以确保可以重用客户机ID来准确地找到所需的组件。如果
#{myBean}
在更广的范围内,那么从技术上讲,只有当客户机ID完全由固定ID组成时,这才有效


尽管如此,通过Java操纵组件树是一个坏主意。改用JSTL。另请参见a.o.

如果客户端ID包含自动生成的ID,因为开发人员没有通过
ID
属性指定固定组件ID,则无法保证它在另一个请求中相同。如果组件库或您自己通过添加/删除没有固定ID的组件以编程方式操纵组件树,则肯定不会。然后,“相同”组件上自动生成的ID可能会根据组件在总树中的位置而改变

这不是特定于JSF实现的。JSF规范只保证(生成的)客户端ID在整个请求中是相同的。另见:

实例的整个生命周期内,此方法返回的值必须相同,除非组件的id属性发生更改,或者组件放置在客户端id发生更改的
NamingContainer
中(例如,
UIData
)。但是,即使在这些情况下,对该方法的连续调用也必须始终返回相同的值

UI组件实例在请求范围内。因此,您的示例中的
#{myBean}
绝对不应该位于比请求范围更广的范围内,以确保可以重用客户机ID来准确地找到所需的组件。如果
#{myBean}
在更广的范围内,那么从技术上讲,只有当客户机ID完全由固定ID组成时,这才有效


尽管如此,通过Java操纵组件树是一个坏主意。改用JSTL。另请参见a.o.

我目前使用的clientId路径没有
j#idt
ID,但现在我想我可以通过使我的核心组件唯一并使用
root.visitTree()
(例如:
)找到它们来避免这个问题。感谢您提供有关Java修改组件树的建议和提示。一直在寻找替代方法,但我目前得到了一个干净/可靠的方法来满足我的需求。我将查看JSTL,试图了解您建议的设计。我目前使用的clientId路径没有
j#idt
ID,但现在我认为我可以通过使我的核心组件唯一并使用
root.visitTree()
(例如:
)找到它们来避免这个问题。感谢您提供有关Java修改组件树的建议和提示。一直在寻找替代方法,但我目前得到了一个干净/可靠的方法来满足我的需求。我们将查看JSTL,试图了解您建议的设计。
String clientId = myBean.getClientId();
UIComponent composite = view.findComponent(clientId);