Jest to zakodowane na stałe w domyślnym rendererze z <h:outputScript>
. Zakładając, że używasz Mojarra, jest to com.sun.faces.renderkit.html_basic.ScriptRenderer
. Według źródła, atrybut type
został ustawiony w metodzie startElement
. można po prostu zastąpić go:
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");
}
}
Lub jeśli chcesz, aby zapewnić użytkownikowi końcowemu możliwość określenia sam atrybut i domyślne type
do application/javascript
kiedy nieokreślone:
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");
}
}
Aby go uruchomić, zarejestruj to w następujący 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>
Jest przy okazji również miły @FacesRenderer
adnotacji który powinien działać następująco
@FacesRenderer(componentFamily="javax.faces.Output", rendererType="javax.faces.resource.Script")
public class ExtendedScriptRenderer extends ScriptRenderer {
// ...
}
Jednak, kiedy jest już zdefiniowana przez standardowej renderujący (The ScriptRenderer
!), To zwyczaj będzie jeden nie je zastąpić przez @FacesRenderer
. Zobacz także issue 1748.
Dziękuję. Jak zawsze, twoja odpowiedź wygląda bardzo dokładnie. Dam mu szansę wkrótce. –