JSF 1.2自定义组件不呈现/编码子项

时间:2012-08-21 09:45:04

标签: jsf custom-component jsf-1.2

我有两个自定义组件:

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) ...

我没有使用渲染器类,但据我所知,这不是必须的。

1 个答案:

答案 0 :(得分:1)

只有当同一个自定义组件的encodeChildren()方法返回true时,才会调用自定义组件的getRendersChildren()方法。这在javadoc

中指定
  

仅当rendersChildren属性为true时才会调用此方法。

因此,请确保您已相应地覆盖,即默认为false

@Override
public boolean getRendersChildren() {
    return true;
}