我有两个自定义组件:
CustomUIComponent extends UIComponentBase
CustomChildUIComponent extends UIComponentBase
在CustomUIComponent中我实现encodeBegin,encodeChildren和encodeEnd - 在encodeChildren中我设置了一些自定义属性以转发给子组件。
在CustomChildUIComponent中,我只实现encodeBegin。
除了这些类之外,我还在faces-config.xml中添加了组件:
<component>
<component-type>test.JsfMessage</component-type>
<component-class>test.CustomUIComponent</component-class>
</component>
<component>
<component-type>test.JsfChildMessage</component-type>
<component-class>test.CustomChildUIComponent</component-class>
</component>
我在web.xml中配置了自定义taglib.xml并包含:
<tag>
<tag-name>customMessage</tag-name>
<component>
<component-type>test.JsfMessage</component-type>
</component>
</tag>
<tag>
<tag-name>customChildMessage</tag-name>
<component>
<component-type>test.JsfChildMessage</component-type>
</component>
</tag>
最后在我的Facelets页面中,我正在尝试执行:
<myns:customMessage message="Hello World!!!" var="mytestvar">
<myns:customChildMessage partnermsg="#{mytestvar}" />
</myns:customMessage>
结果是父项被渲染,但子组件没有。
我做错了吗?
我尝试检查super.encodeChildren,但它会检查:
Renderer renderer = getRenderer(context);
if(renderer != null) ...
我没有使用渲染器类,但据我所知,这不是必须的。
答案 0 :(得分:1)
只有当同一个自定义组件的encodeChildren()
方法返回true
时,才会调用自定义组件的getRendersChildren()
方法。这在javadoc:
仅当
rendersChildren
属性为true
时才会调用此方法。
因此,请确保您已相应地覆盖,即默认为false
:
@Override
public boolean getRendersChildren() {
return true;
}