我正在尝试覆盖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}}我不会直接找到任何感兴趣的内容。
指针?
答案 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 -->
在这种情况下,您不需要(也不应该)声明新的渲染工具包类。