2011-07-13 23 views
6

En nuestra aplicación JSF 2.0 en el trabajo, incluimos varios archivos javascript a través de <h:outputscript>.¿Cómo puedo obtener JSF 2.0 para incluir JS como 'application/javascript' en lugar de 'text/javascript'

<h:outputScript library="javascript" name="DoStuff.js"/> 

El html resultante los referencia como 'texto/javascript'.

<script type="text/javascript" src="/mycontext/javax.faces.resource/DoStuff.js.jsf?ln=javascript"></script> 

Según this question, "text/javascript" es obsoleta, lo que es más, se queja de HtmlUnit el tipo más detallados. Por supuesto, todo funciona bien y podría cerrar el registro de htmlunit, pero prefiero que JSF genere el tipo correcto.

¿Hay alguna manera de anular el tipo elegido por <h:outputscript>?

Respuesta

6

Esto está codificado en el representador predeterminado de <h:outputScript>. Suponiendo que estás usando Mojarra, es el com.sun.faces.renderkit.html_basic.ScriptRenderer. De acuerdo con la fuente, el atributo type se ha establecido en el método startElement. Se podía anularlo:

public class ExtendedScriptRenderer extends ScriptRenderer { 

    @Override 
    protected void startElement(ResponseWriter writer, UIComponent component) throws IOException { 
     writer.startElement("script", component); 
     writer.writeAttribute("type", "application/javascript", "type"); 
    } 

} 

O si lo desea proporcionar el usuario final la posibilidad de especificar el atributo type sí mismo y por defecto a application/javascript cuando no especificado:

public class ExtendedScriptRenderer extends ScriptRenderer { 

    @Override 
    protected void startElement(ResponseWriter writer, UIComponent component) throws IOException { 
     writer.startElement("script", component); 
     String type = (String) component.getAttributes().get("type"); 
     if (type == null) type = "application/javascript"; 
     writer.writeAttribute("type", type, "type"); 
    } 

} 

Para conseguir que se ejecute, regístrese como sigue en faces-config.xml:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.Output</component-family> 
     <renderer-type>javax.faces.resource.Script</renderer-type> 
     <renderer-class>com.example.ExtendedScriptRenderer</renderer-class> 
    </renderer> 
</render-kit> 

Hay por cierto también el buen @FacesRenderer anotación que debe trabajar de la siguiente manera

@FacesRenderer(componentFamily="javax.faces.Output", rendererType="javax.faces.resource.Script") 
public class ExtendedScriptRenderer extends ScriptRenderer { 

    // ... 
} 

Sin embargo, cuando ya se ha definied por un procesador estándar (el ScriptRenderer!), Entonces la costumbre uno va a dejar de anularla por un @FacesRenderer. Consulte también issue 1748.

+0

Gracias. Como siempre, tu respuesta parece muy completa. Voy a darle una oportunidad pronto. –

Cuestiones relacionadas