本节书摘来异步社区《Java EE 7精粹》一书中的第3章,第3.11节,作者:【美】Arun Gupta,更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.11 资源库契约
JSF2引入了Facelets作为默认的视图声明语言(VDL)。Facelets允许使用XHTML和CSS创建模板,模板可以为应用程序的不同页面提供一致的界面外观。JSF2.2定义了资源库契约,一种与资源关联的模板库,可以以可重用和可互换的方式应用到整个应用程序。应用程序中可配置的视图集合将可以声明自己是资源库契约中任何模板的模板客户端。
资源库契约驻留在Web应用程序的根目录的契约目录中:
在这段代码中:
- 应用程序同样有两个页面:index.xhtml和new/index.xhtml。这些是模板客户端页面。
- 所有的契约都保存在WAR的契约目录,所有的模板和资源的契约保存在自己的目录中。例如,前面的结构定义有两个契约(contracts):blue和red。
- 每个契约都有template.xhtml文件、CSS和图像。每个模板都被称为一个声明的模板。在模板中,建议使用h:outputStylesheet引用样式表,以便他们被适当地解析。
- template.xhtml文件中的标签被称为插入点声明。
- CSS、图像和绑定在目录中的其他资源被称为资源声明。
- 模板声明、插入点声明和资源声明一起定义了资源库契约。为了使用资源库契约,模板客户端需要知道这三者的值。客户端页面将通过引用模板来使用资源库契约:
契约是基于调用URL pattern应用的。根据此处指定的配置,red契约将被应用到faces/index.xhtml,契约将被应用到faces/new/index.xhtml。
契约可以被打包在JAR文件的META-INF/contracts项中。在JAR文件中的每个契约必须有一个标记文件。文件名由符号常量javax.faces.application.ResourceHandler. RESOURCE_CONTRACT_XML的值给出:
我们应用程序的契约目录的内容被打包在JAR文件(比如名叫layout.jar)的META-INF/contracts项中。这个JAR文件可以被打包到WEB-INF/lib中,其所声明的模板可以在应用程序中使用:
可以使用一个新的layout.jar文件,提供一组类似的插入点和资源(可能有不同的CSS)声明,来改变应用程序的界面外观。
改变f:view中ui:composition的template属性值可以动态地改变页面的模板:
在这段代码中:
- f:view有一个contracts属性与EL表达式绑定。
- 这个EL的值是由ui:define中表单内的单选按钮的值填充的。
- 单选按钮的值匹配契约(contract)名称。
- 单击命令按钮Apply,所选择的模板将应用于此页面。
backing bean的定义很简单: