2011-07-13 9 views
6

W naszej aplikacji JSF 2.0 w pracy dołączamy kilka plików javascript przez <h:outputscript>.W jaki sposób można uzyskać, aby JSF 2.0 uwzględniał JS jako "application/javascript" zamiast "text/javascript"

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

Wynikowy html określa je jako "tekst/javascript".

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

Według this question "text/javascript" jest przestarzały, co więcej, HtmlUnit narzeka raczej typem --long. Oczywiście wszystko działa dobrze i mogłem wyłączyć rejestrowanie htmlunit, ale wolałbym, żeby JSF generował poprawny typ.

Czy istnieje sposób na zastąpienie typu wybranego przez <h:outputscript>?

Odpowiedz

6

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.

+0

Dziękuję. Jak zawsze, twoja odpowiedź wygląda bardzo dokładnie. Dam mu szansę wkrótce. –

Powiązane problemy