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.
Gracias. Como siempre, tu respuesta parece muy completa. Voy a darle una oportunidad pronto. –