2011-07-13 12 views
6

İşyerindeki JSF 2.0 uygulamasında, <h:outputscript> aracılığıyla birkaç javascript dosyası ekledik.JSF 2.0'ı 'text/javascript' yerine 'application/javascript' olarak eklemek için JSF'yi nasıl edinebilirim?

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

Ortaya çıkan html, 'text/javascript' olarak başvuruda bulunur.

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

this question göre, "text/javascript" artık kullanılmıyor, dahası, HtmlUnit'in ziyade verbosely türü hakkında şikayet ediyor. Elbette, her şey gayet iyi çalışıyor ve htmlunit'in günlüğünü kesebiliyordum, ancak JSF'nin doğru tür üretmesini tercih ediyorum.

<h:outputscript> tarafından seçilen türü geçersiz kılmanın bir yolu var mı?

cevap

6

Bu, <h:outputScript>'un varsayılan oluşturucusunda kodlanmıştır. Mojarra kullandığınızı varsayalım, com.sun.faces.renderkit.html_basic.ScriptRenderer. Kaynağa göre, type özniteliği startElement yönteminde ayarlanmıştır.

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"); 
    } 

} 

Yoksa zaman belirtilmemiş application/javascript için son kullanıcı type niteliği kendisi ve varsayılan belirtmek imkanı sağlamak istiyorsanız: Sadece bunu geçersiz olabilir

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"); 
    } 

} 

yayınlanmaya almak için, kayıt o faces-config.xml aşağıdaki şekilde:

<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> 

zaten bir standart oluşturucunuz (ScriptRenderer!) Tarafından definied oldu da yol Ancak

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

    // ... 
} 

şöyle çalışmalıdır güzel @FacesRenderer açıklama ile var, sonra bir başarısız olur özel, geçersiz kılmak için @FacesRenderer tarafından. Ayrıca bkz. issue 1748.

+0

Teşekkür ederiz. Her zamanki gibi, cevabınız çok titiz görünüyor. Yakında bir atış yapacağım. –