Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF2.0:encodeAll何时调用,encodeBegin何时调用?_Jsf_Jsf 2 - Fatal编程技术网

JSF2.0:encodeAll何时调用,encodeBegin何时调用?

JSF2.0:encodeAll何时调用,encodeBegin何时调用?,jsf,jsf-2,Jsf,Jsf 2,考虑自定义UIComponent(仅用于测试目的): 当我将其添加到复合组件内的页面时,会调用encodeBegin()方法。但是,当将其添加到复合组件外部的页面时,会调用encodeAll()方法 将它添加到其他UIComponents中并没有什么区别,只有复合组件包装器似乎改变了行为 找不到信息为什么会这样?规范链接?在本例中,规范非常混乱,说明: “这些方法是在请求处理生命周期的呈现响应阶段调用的。encodeAll()将 使此组件及其从isRendered()返回true的所有子级和面都

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

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

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


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

在本例中,规范非常混乱,说明: “这些方法是在请求处理生命周期的呈现响应阶段调用的。encodeAll()将 使此组件及其从isRendered()返回true的所有子级和面都被渲染,无论 getRendersChildren()返回值的值。encodeBegin()、encodeChildren()和 encodeEnd()负责创建此组件开头的响应数据,即 组件的子级(仅当此组件的rendersChildren属性为true时调用),以及 这一部分分别是。”

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

我尝试了以下方法:

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

  • 扩展UIComponentBase(或其他UIComponent类,如UIInput、UIOutput..等),将其声明为标记,并在UI中使用。 在这种情况下,如果存在(覆盖)encodeAll方法,则调用它;如果不存在,则调用EncodeBeagin和encodeEnd方法

  • 另一件需要注意的事情是,您可以为组件创建自定义渲染器,以便将渲染逻辑与行为分离。(通过创建另一个扩展渲染器的类,并使用@FacesRenderer对其进行注释) 这就是它变得有趣的地方;渲染器仅定义EncodeBeagin、encodeChildren和encodeEnd(未提及encodeAll)。 现在的逻辑大概是这样的: 如果(全部存在) encodeAll被调用(渲染器被忽略!) else if(扩展UIComponent的类中存在encodeBegin、子级或end中的任何一个) 调用在该组件中找到的方法 else if(扩展呈现器的类中存在EncodeBeagin、子级或end) 调用找到的相应方法

  • 因此,这意味着在类扩展UIComponent中实现encodeAll(或EncodeBeagin..etc)会导致忽略渲染器

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

    在本例中,发生了与上面相同的事情,只是在任何情况下都没有调用encodeAll,无论我做了什么

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

    我希望这至少对您有一些价值,不幸的是,我无法提供更全面的答案(
    似乎也没有其他人知道这一点。

    这与我的发现基本一致。由于行为有点复杂,如果不是奇怪的话(比较包装器内外的组件),我想我肯定会对此提交一份错误通知单。感谢您花时间检查此问题,欢迎使用SO!)这似乎有一个bug文件。
    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");
        }
    
    }