想要创建镜像现有组件功能的自定义组件,但使用不同的渲染器

时间:2012-07-07 20:58:33

标签: jsf jsf-2 custom-component selectonemenu

JSF组件SelectOneRadio布局非常有限,所以我为它编写了一个自定义渲染器,它工作得很好。但是,有时我也想使用标准的SelectOneRadio布局。所以我决定使用我创建的自定义渲染器创建我的新组件,但我希望这个新组件能够镜像SelectOneRadio的功能,唯一不同的是它将使用我的渲染器。在这种情况下,我是否需要创建custom tagcustom component以与custom renderer一起使用?我应该class扩展以获取SelectOneRadio的所有功能?如果您能提供一些代码,我将不胜感激。

修改
@BalusC:我喜欢你想要检测layout的值来委托正确的渲染器。因此,如果我有layout =“div_layout”,那么效果很好,但如果它是pageDirectionlineDirection并且没有显示任何内容。我做的是:我创建了一个extends MenuRenderer的类,并且我覆盖了encodeEnd方法,所以在那里我做了这个

String layout = (String) component.getAttributes().get("layout");

if(layout != null){
        if(layout.equals(PAGE_DIRECTION) || layout.equals(LINE_DIRECTION)){
            super.encodeEnd(context, component);
            return;
        } else if (!layout.equals(DIV_LAYOUT)){
            //Throw error message
        }
}
//Continue with my own renderer code

EDIT2
当我没有说什么出现时,我错了。 super.encodeEnd(context,component);确实渲染,但不渲染无线电,而是渲染select option标记。所以我似乎委托错误的渲染器。我需要使用RadioRenderer而不是MenuRenderer。

1 个答案:

答案 0 :(得分:3)

如果它特定于您自己的Web应用程序,那么您可以单独替换渲染器。最简单的方法是扩展特定于实现的渲染器,然后根据其中一个标准属性(layout是最佳选择)的值,委托给特定于实现的渲染器,或者执行自己的自定义渲染作业。

我是Mojarra的情况,你想扩展com.sun.faces.renderkit.html_basic.RadioRenderer,然后按如下方式注册

<renderkit>
    <renderer>
        <component-family>javax.faces.SelectOne</component-family>
        <renderer-type>javax.faces.Radio</renderer-type>
        <renderer-class>com.example.ExtendedRadioRenderer</renderer-class>
    </renderer>
</renderkit>

如果您希望独立于实现,那么您需要自己编写整个渲染器实现。

如果您希望有自定义组件,那么您也需要自己编写。