我有一个jsf jar库,我想在使用它的JSF 2.2项目的所有页面中加载一个特定的JavaScript文件(存在于jar中),而不需要任何其他配置。
我想在不使用的情况下加载我的库中存在的特定JavaScript文件
页面中的h:outputScript
标记(模板和页面都没有)
这在jsf网络应用程序中是否可行?
答案 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>