When I posted JSF Tip #32 - Override a JSF renderer Twitter user @john_waterwood asked me how you would define a new tag for an existing component and the overridden renderer. Well it is fairly easy, see the 2 steps below!
package org.glassfish.jsf.overrideRenderer; import java.io.IOException; import javax.faces.component.UIComponent; import javax.faces.component.UIOutput; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.render.Renderer; @FacesRenderer(rendererType="myText") public class MyTextRenderer extends Renderer { @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { } @Override public void encodeChildren(FacesContext context, UIComponent component) throws IOException { } @Override public void encodeEnd(FacesContext context, UIComponent component) throws IOException { ResponseWriter responseWriter = context.getResponseWriter(); UIOutput output = (UIOutput) component; String value = "Let's be funny: " + output.getValue().toString(); responseWriter.writeText(value, null); } }
Register it
<?xml version="1.0" encoding="UTF-8"?> <facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" version="2.0"> <namespace>mynamespace</namespace> <composite-library-name>m</composite-library-name> <tag> <tag-name>myOutputText</tag-name> <component> <component-type>javax.faces.HtmlOutputText</component-type> <renderer-type>myText</renderer-type> </component> </tag> </facelet-taglib>
Posted November 7, 2013