gpt4 book ai didi

JSF 2.0 : When is encodeAll called and when is encodeBegin called?

转载 作者:行者123 更新时间:2023-12-01 01:31:50 32 4
gpt4 key购买 nike

考虑自定义 UIComponent(仅用于测试目的):

public class UITest extends UIComponentBase {

@Override
public void encodeBegin(FacesContext context) throws IOException {
System.out.println("encodeBegin");
}

@Override
public void encodeAll(FacesContext context) throws IOException {
System.out.println("encodeAll");
}

}

当我将它添加到复合组件内的页面时, encodeBegin()方法被调用。但是,当将其添加到复合组件外的页面时, encodeAll()方法被调用。

将它添加到其他 UIComponents 中没有区别,只有复合组件包装器似乎会改变行为。

找不到信息为什么会这样?规范的链接?

最佳答案

在这种情况下,规范非常困惑,指出:
“这些方法在请求处理生命周期的渲染响应阶段被调用。encodeAll() 将
导致该组件及其所有从 isRendered() 返回 true 的子组件和构面被渲染,无论
getRendersChildren() 返回值的值。 encodeBegin()、encodeChildren() 和
encodeEnd() 负责为这个组件的开头创建响应数据,这个
组件的子组件(仅在该组件的 rendersChildren 属性为 true 时调用),以及
这个组件,分别。”

但是,这似乎是新旧功能的混合体,其中新功能 (encodeAll) 在某些方面似乎不完整:

我尝试了以下方法:

A) 直接在页面中调用组件(无包装)

  • 扩展 UIComponentBase(或其他 UIComponent 类,如 UIInput、UIOutput.. 等),将其声明为标签,并在 UI 中使用它。
    在这种情况下,如果存在(覆盖)则调用 encodeAll 方法,否则将调用 encodeBegin 和 encodeEnd 方法!!
  • 另外要注意的是,您可以为组件创建自定义渲染器,以便将渲染逻辑与行为分开。 (通过创建另一个扩展 Renderer 的类,并使用 @FacesRenderer 对其进行注释)
    这就是它变得有趣的地方; Renderer 只定义了 encodeBegin、encodeChildren 和 encodeEnd(没有提到 encodeAll)。
    现在的逻辑似乎大致是这样的:
    如果(encodeAll 存在)
    encodeAll 被调用(并且渲染器被忽略!)
    else if(encodeBegin、Children 或 end 中的任何一个存在于扩展 UIComponent 的类中)
    调用在该组件中找到的方法
    else if(encodeBegin, children 或 end 存在于扩展 Renderer 的类中)
    调用找到的相应方法。

  • 所以这意味着在扩展 UIComponent 的类中实现 encodeAll(或 encodeBegin.. 等)会导致渲染器被忽略!

    B) 包装组件 (cc:implementation.. 等)

    在这种情况下,发生了与上面相同的事情,除了在任何情况下都没有调用 encodeAll,无论我做什么。

    结论:
    似乎 encodeAll 是实现渲染代码的某种新功能(或快捷方式),而且 cc:implementation 在这种情况下似乎有一个错误(它不寻找 encodeAll)。

    我希望这至少对您有值(value),不幸的是我无法提供更彻底的答案。 :(
    似乎也没有其他人知道这一点。

    关于JSF 2.0 : When is encodeAll called and when is encodeBegin called?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4284060/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com