JSF 2.0: Как переопределить базовые рендерры с пользовательскими?
Вопрос
Я пытаюсь переопределить Renderer для h:selectBooleanCheckbox
(по причинам объяснения здесь):
Тем не менее, я не считаю невозможным регистрацию моего рендерера. Я пытался объявить его в моем 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
, При котором я не могу просто найти интерес.
Указатели?
Решение
Ваш инициал <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. Ваша проблема лежит где-то еще. Я использовал Mojarra 2.0.3 на Tomcat 7.0.5.
Другие советы
Я добавляю рендереров к моему 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 в этом сценарии.