Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让JSF2.0将JS作为';应用程序/javascript';而不是';text/javascript';_Javascript_Jsf 2_Mime Types - Fatal编程技术网

如何让JSF2.0将JS作为';应用程序/javascript';而不是';text/javascript';

如何让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

在我们正在使用的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"></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 {

    // ...
}