【问题标题】:JSF 2.0: How to override base renderers with custom ones?JSF 2.0:如何用自定义渲染器覆盖基本渲染器?
【发布时间】:2023-03-25 21:23:04
【问题描述】:

我正在尝试覆盖 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,在它下面我没有直接找到任何感兴趣的东西。

指针?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    您最初的 &lt;renderer&gt; 声明看起来不错,所以我在这里尝试了。

    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);
        }
    
    }
    

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

    【讨论】:

    • 与问题无关,您为什么要使用非布尔值作为selectBooleanCheckbox 的值?非布尔对象如何表示布尔状态?
    • 嗯,你是对的,它确实有效。我之前没有使用 encodeXXX 方法进行测试,我只是将断点设置为我的自定义渲染器的 getConvertedValue 方法,它不会被调用。然而,其原因可能是一个完全不同的问题。无论如何,您是否知道某处是否有 JSF 组件、它们的渲染类型和族的列表,或者我们是否必须始终导航到它们的类并搜索这些变量?
    • 它是 JSF 2.0 规范中的表 8.1 和 JSF 2.0 API 文档中的COMPONENT_FAMILY 常量字段值的组合。最终,两者都可以参考 JSF 2.0 规范的第 4.1.x 章。
    • 优秀。再一次感谢你! (虽然我担心这不会是最后一次...... :)
    【解决方案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 -->
    

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

    【讨论】:

    • 在覆盖默认值时是否需要声明render-kit-id?没有它似乎可以工作...... HTML_BASIC 是否指“默认”RenderKit?
    • @Tuukka Mustonen - render-kit-id 对于默认 RenderKit 是可选的(规范中有一个示例)。 HTML_BASIC 确实是默认 id。
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2020-10-28
    • 2011-02-15
    • 1970-01-01
    • 2017-06-09
    • 2012-04-01
    相关资源
    最近更新 更多