JSF 2.0:如何使用自定义渲染器覆盖基础渲染器?

时间:2011-01-05 14:52:17

标签: jsf jsf-2

我正在尝试覆盖h:selectBooleanCheckbox的渲染器(原因解释为here):

但是,我发现无法注册我的渲染器。我试过在faces-config.xml

中声明它
<render-kit>
    <renderer>
        <component-family>javax.faces.SelectBoolean</component-family>
        <renderer-type>javax.faces.Checkbox</renderer-type>
        <renderer-class>com.myapp.CustomCheckboxRenderer</renderer-class>
    </renderer>
</render-kit>

我抓住的价值观:

  • 组件系列:javax.faces.component.html.HtmlSelectBooleanCheckbox
  • 渲染器类型:javax.faces.component.html.SelectBooleanCheckboxTag

但它不起作用。

我还尝试详细声明RenderKit

<description>Custom renderers</description>
<render-kit-id>???</render-kit-id>
<render-kit-class>com.sun.faces.renderkit.RenderKitImpl</render-kit-class>

但正如您所看到的,我真的不知道在哪里获取render-kit-id的价值或者render-kit-class是否正确。

在Mojarra包中有文件jsf-ri-runtime.xml,但它没有声明渲染器。它只声明RenderKitFactory,根据该{{1}}我不会直接找到任何感兴趣的内容。

指针?

2 个答案:

答案 0 :(得分:11)

您的初始<renderer>声明看起来不错,所以我在这里试了一下。

package com.myapp;

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import com.sun.faces.renderkit.html_basic.CheckboxRenderer;

public class CustomCheckboxRenderer extends CheckboxRenderer {

    public CustomCheckboxRenderer() {
        System.out.println("CustomCheckboxRenderer <init>");
    }

    @Override
    public void decode(FacesContext context, UIComponent component) {
        System.out.println("CustomCheckboxRenderer decode()");
        super.decode(context, component);
    }

    @Override
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
        System.out.println("CustomCheckboxRenderer encodeBegin()");
        super.encodeBegin(context, component);
    }

    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        System.out.println("CustomCheckboxRenderer encodeEnd()");
        super.encodeEnd(context, component);
    }

}

工作正常。全部打印到stdout。你的问题出在其他地方。我在Tomcat 7.0.5上使用Mojarra 2.0.3。

答案 1 :(得分:2)

我将渲染器添加到我的faces-config.xml,如下所示:

<faces-config>
    <!--elided-->
<render-kit>
    <render-kit-id>HTML_BASIC</render-kit-id>
    <renderer>
        <display-name>MyRenderer</display-name>
        <component-family>javax.faces.Output</component-family>
        <renderer-type>foo.MyRenderer</renderer-type>
        <renderer-class>foo.MyRenderer</renderer-class>
        <!-- TODO: attributes for tooling -->

在这种情况下,您不需要(也不应该)声明新的渲染工具包类。