如何以编程方式在所有页面上加载JavaScript文件

时间:2018-01-24 07:05:24

标签: jsf

我有一个jsf jar库,我想在使用它的JSF 2.2项目的所有页面中加载一个特定的JavaScript文件(存在于jar中),而不需要任何其他配置。

我想在不使用的情况下加载我的库中存在的特定JavaScript文件 页面中的h:outputScript标记(模板和页面都没有)

这在jsf网络应用程序中是否可行?

1 个答案:

答案 0 :(得分:3)

您可以使用UIViewRoot#addComponentResource()以编程方式添加JSF资源。您可以SystemEventListener使用PostAddToViewEvent <h:head>来获取此信息。

public class DynamicHeadResourceListener implements SystemEventListener {

    @Override
    public boolean isListenerForSource(Object source) {
        return "javax.faces.Head".equals(((UIComponent) source).getRendererType());
    }

    @Override
    public void processEvent(SystemEvent event) {
        String library = "yourLibraryName";
        String name = "yourScript.js"; // Can be dynamic here.
        addHeadResource(FacesContext.getCurrentInstance(), library, name);
    }

    private void addHeadResource(FacesContext context, String library, String name) {
        UIComponent resource = new UIOutput();
        resource.getAttributes().put("library", library);
        resource.getAttributes().put("name", name);
        resource.setRendererType(context.getApplication().getResourceHandler().getRendererTypeForResourceName(name));
        context.getViewRoot().addComponentResource(context, resource, "head");
    }
}

要使其运行,请在模块项目的faces-config.xml中注册,如下所示:

<system-event-listener>
    <system-event-listener-class>com.example.DynamicHeadResourceListener</system-event-listener-class>
    <system-event-class>javax.faces.event.PostAddToViewEvent</system-event-class>
    <source-class>javax.faces.component.UIOutput</source-class>
</system-event-listener>