【问题标题】:Can UIComponent clientIds change across requests?UIComponent clientIds 可以跨请求更改吗?
【发布时间】:2015-12-19 20:49:30
【问题描述】:

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

当用户添加动态组件时:

myBean.setClientId(composite.getClientId());

当用户“保存”时,会话的更晚时间:

String clientId = myBean.getClientId();
UIComponent composite = view.findComponent(clientId);
  • 可能不同的 JSF 实现不能保证相同的 clientId 整个会话?
  • 也许动态添加和删除UIComponents(或突发奇想)会导致路径中的容器之一跨请求更改索引?

我看到了这个很棒的问答,但我不确定它是否完全回答了保存 clientId 并稍后在会话中或以动态形式使用它的多个请求的问题: when-and-how-is-clientid-generated-in-jsf

谢谢

【问题讨论】:

    标签: jsf components clientid


    【解决方案1】:

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

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

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

    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?

    【讨论】:

    • 我目前正在使用没有 j_idt# Ids 的 clientId 路径,但现在我想通过使我的核心 componentIds 唯一并使用 root.visitTree() 找到它们来避免这个问题(例如: <UINamingContainer id="e9e4c42c-a47e-4687-9a6f-b3141274a194" inView="true" rendered="true" transient="false">).
    • 感谢有关 Java 修改组件树的建议和技巧。一直在寻找替代方法,但我目前已经获得了一种满足我要求的干净/可靠的方法。将查看 JSTL 以尝试理解您建议的设计。
    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2016-07-07
    • 2023-03-08
    • 2017-07-18
    • 1970-01-01
    • 2016-07-28
    • 2020-02-09
    相关资源
    最近更新 更多