UIComponent clientIds 可以跨请求更改吗?
Can UIComponent clientIds change across requests?
我是否应该期望 UIComponent#getClientId()
的结果会在用户会话中发生变化?我想将完整的 clientId 引用保存到 UIComponent
并在以后使用。
当用户添加动态组件时:
myBean.setClientId(composite.getClientId());
在用户 "Saves":
的会话中很久以后
String clientId = myBean.getClientId();
UIComponent composite = view.findComponent(clientId);
- 也许不同的 JSF 实现不保证相同的 clientId
整个会话?
- 也许动态添加和删除
UIComponents
(或心血来潮)会导致路径中的其中一个容器跨请求更改索引?
我看到了这个很棒的问答,我不确定它是否完全回答了保存 clientId 并稍后在会话中或以动态形式使用它的多个请求的问题:
谢谢
如果客户端 ID 包含自动生成的 ID,因为开发人员没有通过 id
属性指定固定的组件 ID,则无法保证它在另一个请求中是相同的。如果组件树是由组件库以编程方式操作的,甚至是 adding/removing 个没有固定 ID 的组件,则肯定不是。 "same" 组件上自动生成的 ID 可能会根据组件在总树中的位置而改变。
这不是特定于 JSF 实现的。 JSF 规范仅保证(生成的)客户端 ID 在整个请求中是相同的。另见 javadoc:
The return from this method must be the same value throughout the lifetime of the instance, unless the id property of the component is changed, or the component is placed in a NamingContainer
whose client ID changes (for example, UIData
). However, even in these cases, consecutive calls to this method must always return the same value.
UI 组件实例是请求范围的。因此,您示例中的 #{myBean}
范围绝对不应大于请求范围,以保证可以重用客户端 ID 以准确找到所需的组件。如果 #{myBean}
范围更广,那么这在技术上仅在客户端 ID 仅由固定 ID 组成时才有效。
尽管如此,通过 Java 操作组件树并不是一个好主意。请改用 JSTL。另见 a.o。 How does the 'binding' attribute work in JSF? When and how should it be used?
我是否应该期望 UIComponent#getClientId()
的结果会在用户会话中发生变化?我想将完整的 clientId 引用保存到 UIComponent
并在以后使用。
当用户添加动态组件时:
myBean.setClientId(composite.getClientId());
在用户 "Saves":
的会话中很久以后String clientId = myBean.getClientId();
UIComponent composite = view.findComponent(clientId);
- 也许不同的 JSF 实现不保证相同的 clientId 整个会话?
- 也许动态添加和删除
UIComponents
(或心血来潮)会导致路径中的其中一个容器跨请求更改索引?
我看到了这个很棒的问答,我不确定它是否完全回答了保存 clientId 并稍后在会话中或以动态形式使用它的多个请求的问题:
谢谢
如果客户端 ID 包含自动生成的 ID,因为开发人员没有通过 id
属性指定固定的组件 ID,则无法保证它在另一个请求中是相同的。如果组件树是由组件库以编程方式操作的,甚至是 adding/removing 个没有固定 ID 的组件,则肯定不是。 "same" 组件上自动生成的 ID 可能会根据组件在总树中的位置而改变。
这不是特定于 JSF 实现的。 JSF 规范仅保证(生成的)客户端 ID 在整个请求中是相同的。另见 javadoc:
The return from this method must be the same value throughout the lifetime of the instance, unless the id property of the component is changed, or the component is placed in a
NamingContainer
whose client ID changes (for example,UIData
). However, even in these cases, consecutive calls to this method must always return the same value.
UI 组件实例是请求范围的。因此,您示例中的 #{myBean}
范围绝对不应大于请求范围,以保证可以重用客户端 ID 以准确找到所需的组件。如果 #{myBean}
范围更广,那么这在技术上仅在客户端 ID 仅由固定 ID 组成时才有效。
尽管如此,通过 Java 操作组件树并不是一个好主意。请改用 JSTL。另见 a.o。 How does the 'binding' attribute work in JSF? When and how should it be used?