JSF 2.0: Comment remplacer les équarrisseurs de base avec ceux personnalisés?
Question
Je suis en train de passer outre pour h:selectBooleanCheckbox
renderer (pour les raisons expliquées ici ):
Cependant, je trouve qu'il est impossible d'enregistrer mon renderer. Je l'ai essayé de déclarer dans mon 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>
Les valeurs que j'attrapée par:
- composante familiale:
javax.faces.component.html.HtmlSelectBooleanCheckbox
- renderer type:
javax.faces.component.html.SelectBooleanCheckboxTag
Mais il ne fonctionne pas.
J'ai aussi essayé de déclarer verbeux le RenderKit
:
<description>Custom renderers</description>
<render-kit-id>???</render-kit-id>
<render-kit-class>com.sun.faces.renderkit.RenderKitImpl</render-kit-class>
Mais comme vous pouvez le voir, je ne sais pas vraiment où saisir la valeur pour render-kit-id
ou si le render-kit-class
est correct de toute manière.
A l'intérieur il y a package Mojarra fichier jsf-ri-runtime.xml
mais il ne déclare pas les équarrisseurs. Il déclare seulement RenderKitFactory
, en vertu de laquelle je ne trouve pas directement quoi que ce soit d'intérêt.
Pointeurs?
La solution
Votre déclaration initiale de <renderer>
semble bien, donc je l'ai essayé ici.
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);
}
}
Il fonctionne très bien. Tous seront imprimés à stdout. Votre problème est ailleurs. J'utilisais Mojarra 2.0.3 sur Tomcat 7.0.5.
Autres conseils
J'ajoute équarrisseurs à mon faces-config.xml
comme ceci:
<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 -->
Vous n'avez pas besoin (et ne doit pas) déclarer un nouveau kit de rendre la classe dans ce scénario.