我需要以编程方式向<h:head>JSF页面添加JS和CSS资源。目前尚不清楚如何实现这一目标。有人可以提供提示或启动示例吗?
<h:head>
这取决于您到底想在哪里声明资源。 通常 ,以编程方式声明它们的唯一原因是您拥有一个自定义UIComponent或Renderer生成HTML代码,而这些代码又需要这些JS和/或CSS资源。然后由@ResourceDependency或声明它们@ResourceDependencies。
UIComponent
Renderer
@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.Script或javax.faces.resource.Stylesheet,以分别表示完全值<h:outputScript>或<h:outputStylesheet>。该library和name属性正好可以放在属性地图。
UIViewRoot#addComponentResource()
UIOutput
javax.faces.resource.Script
javax.faces.resource.Stylesheet
<h:outputScript>
<h:outputStylesheet>
library
name
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");