Cambiar el renderizado de un componente en JSF 1.2

Trabajando en un antiguo proyecto, he tenido que recordar cómo se modificaba el renderizado de una componente en JSF, en este los radio, para modificar el comportamiento original del componente y el html generado me fuera de utilidad. Por defecto, el componente OneSelectRadio no es muy configurable, ni siquiera con estilos y no permite controlar la generación de la etiqueta, que en mi caso, y habiendo estilos para etiquetas que afectaban a toda la aplicación, no se me ocurrió otra idea.

Para empezar, creamos la clase haciendo que herede del Renderer actual.

A continuación, lo más fácil es obtener el código fuente del renderer actual (jsf-impl-1.2_sources.jar) y de ahí realizar las modificaciones que queramos en los métodos.

public class MyRadioRenderer extends RadioRenderer{

 private static final String[] ATTRIBUTES =
 AttributeManager.getAttributes(AttributeManager.Key.SELECTONERADIO);


 @Override
 protected void renderOption(FacesContext context,
 UIComponent component,
 Converter converter,
 SelectItem curItem,
 Object currentSelections,
 Object[] submittedValues,
 boolean alignVertical,
 int itemNumber) throws IOException {

 ResponseWriter writer = context.getResponseWriter();
 assert(writer != null);
....

Una vez que hayamos modificado nuestra clases, debemos añadir en el faces-config.xml que vamos a usar este nueva clase como renderer:

 <render-kit>
 <renderer>
 <component-family>javax.faces.SelectOne</component-family>
 <renderer-type>javax.faces.Radio</renderer-type>
 <renderer-class>MyRadioRenderer</renderer-class>
 </renderer>
</render-kit>

Podemos ver que los botones Radio extienden de la familia de

En JSF 2, en vez de renderer-type usaremos la etiqueta component-type.

En nuestro código usaremos el componente radio como siempre, pero generará el html diferente según lo hayamos programado:

<h:selectOneRadio id="1" value="#{bean.valor}">
 <f:selectItem id="11" itemValue="1" itemLabel="etiqueta"/>
</h:selectOneRadio>

En mi caso, no generará ninguna etiqueta en el html aunque se lo indiquemos.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s