2011-01-05 16 views
7

Estoy tratando de anular procesador de h:selectBooleanCheckbox (por las razones que se explican here):JSF 2.0: ¿Cómo sobrescribir los renderizadores base con los personalizados?

Sin embargo, me resulta imposible colocar mi procesador. He tratado de declarar que en mi 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> 

Los valores Agarré a partir de:

  • componente familiar: javax.faces.component.html.HtmlSelectBooleanCheckbox
  • procesador de tipo: javax.faces.component.html.SelectBooleanCheckboxTag

Pero doesn no funciona

también probé informa extensamente declarando la RenderKit:

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

Pero como se puede ver, no se sabe muy bien por dónde agarrar valor para render-kit-id o si el render-kit-class es correcto de todos modos.

Dentro del paquete Mojarra existe el archivo jsf-ri-runtime.xml pero no declara los procesadores. Solo declara RenderKitFactory, por lo que no encuentro directamente nada de interés.

Punteros?

Respuesta

10

Su declaración inicial <renderer> se ve bien, así que lo intenté aquí.

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

} 

Funciona bien. Todos se imprimen en stdout. Tu problema está en otro lado. Estaba usando Mojarra 2.0.3 en Tomcat 7.0.5.

+0

Sin relación con el problema, ¿por qué alguna vez usaría booleanos como valor de un 'selectBooleanCheckbox'? ¿Cómo puede un objeto no booleano representar un estado booleano? – BalusC

+0

Hmm, tienes razón, funciona. No probé con los métodos encodeXXX antes, simplemente configuré un punto de interrupción en el método 'getConvertedValue' de mi procesador personalizado, que no se llama. Sin embargo, el motivo puede estar sujeto a una pregunta completamente diferente. De todos modos, ¿sabes si hay una lista de componentes JSF, sus tipos de representación y familias en algún lugar, o tenemos que navegar siempre a sus clases y buscar estas variables? –

+0

Es una combinación de la tabla 8.1 en la especificación JSF 2.0 y la ['COMPONENT_FAMILY'] (http://download.oracle.com/javaee/5/api/constant-values.html#javax.faces.component.UISelectBoolean.COMPONENT_FAMILY) valor de campo constante en JSF 2.0 API doc. Finalmente, se puede consultar el capítulo 4.1.x de la especificación JSF 2.0 para ambos. – BalusC

2

agrego extracción de grasas a mi faces-config.xml así:

<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 --> 

Usted no necesita (y no debe) declarar una nueva clase render kit en este escenario.

+0

¿Es necesario declarar el 'render-kit-id' al anular los predeterminados? Parece que funciona sin él ... ¿HTML_BASIC se refiere a "predeterminado" RenderKit? –

+0

@Tuukka Mustonen - render-kit-id es opcional para el RenderKit predeterminado (hay un ejemplo en la especificación). HTML_BASIC es de hecho el ID predeterminado. – McDowell

+0

Ok, gracias por la aclaración! –

Cuestiones relacionadas