如何让JSF2.0将JS作为';应用程序/javascript';而不是';text/javascript';
在我们正在使用的JSF2.0应用程序中,我们通过如何让JSF2.0将JS作为';应用程序/javascript';而不是';text/javascript';,javascript,jsf-2,mime-types,Javascript,Jsf 2,Mime Types,在我们正在使用的JSF2.0应用程序中,我们通过包含了几个javascript文件 <h:outputScript library="javascript" name="DoStuff.js"/> 生成的html将它们引用为“text/javascript” <script type="text/javascript" src="/mycontext/javax.faces.resource/DoStuff.js.jsf?ln=javascript"></sc
包含了几个javascript文件
<h:outputScript library="javascript" name="DoStuff.js"/>
生成的html将它们引用为“text/javascript”
<script type="text/javascript" src="/mycontext/javax.faces.resource/DoStuff.js.jsf?ln=javascript"></script>
据了解,“text/javascript”已经过时了,而且,htmlunit对类型的抱怨相当冗长。
当然,一切正常,我可以关闭htmlunit的日志记录,但我宁愿让JSF生成正确的类型
是否有方法覆盖由
选择的类型?这是在
的默认呈现程序中硬编码的。假设您使用的是Mojarra,它是com.sun.faces.renderkit.html\u basic.ScriptRenderer
。根据来源,在startElement
方法中设置了type
属性。您可以覆盖它:
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");
}
}
或者,如果希望向最终用户提供指定类型
属性本身的可能性,并且在未指定时默认为应用程序/javascript
:
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");
}
}
要让它运行,请按如下方式在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>
但是,当它已经由标准渲染器(
脚本渲染器
!)定义时,自定义渲染器将无法通过@facesrender
覆盖它。另请参见。谢谢。和往常一样,你的回答看起来很彻底。我很快就会试一试。
@FacesRenderer(componentFamily="javax.faces.Output", rendererType="javax.faces.resource.Script")
public class ExtendedScriptRenderer extends ScriptRenderer {
// ...
}