一尘不染

如何以编程方式向其中添加JS和CSS资源 ?

css

我需要以编程方式向<h:head>JSF页面添加JS和CSS资源。目前尚不清楚如何实现这一目标。有人可以提供提示或启动示例吗?


阅读 221

收藏
2020-05-16

共1个答案

一尘不染

这取决于您到底想在哪里声明资源。 通常
,以编程方式声明它们的唯一原因是您拥有一个自定义UIComponentRenderer生成HTML代码,而这些代码又需要这些JS和/或CSS资源。然后由@ResourceDependency或声明它们@ResourceDependencies

@ResourceDependency(library="mylibrary", name="foo.css")
public class FooComponentWithCSS extends UIComponentBase {
    // ...
}



@ResourceDependencies({
    @ResourceDependency(library="mylibrary", name="bar.css"),
    @ResourceDependency(library="mylibrary", name="bar.js")
})
public class BarComponentWithCSSandJS extends UIComponentBase {
    // ...
}

但是,如果您 确实 需要在其他地方声明它们,例如 渲染响应 之前 调用的backing
bean方法(否则为时已​​晚),则可以使用UIViewRoot#addComponentResource()。必须将组件资源创建为UIOutput呈现器类型为javax.faces.resource.Scriptjavax.faces.resource.Stylesheet,以分别表示完全值<h:outputScript><h:outputStylesheet>。该libraryname属性正好可以放在属性地图。

UIOutput css = new UIOutput();
css.setRendererType("javax.faces.resource.Stylesheet");
css.getAttributes().put("library", "mylibrary");
css.getAttributes().put("name", "bar.css");

UIOutput js = new UIOutput();
js.setRendererType("javax.faces.resource.Script");
js.getAttributes().put("library", "mylibrary");
js.getAttributes().put("name", "bar.js");

FacesContext context = FacesContext.getCurrentInstance();
context.getViewRoot().addComponentResource(context, css, "head");
context.getViewRoot().addComponentResource(context, js, "head");
2020-05-16