模板
使用模板,你可以创建一个页面作为应用程序中其它页面的模板,这样可以避免多次创建结构类似的页面,同时也可以统一应用程序中多个页面的视觉风格。
Facelets标签库包括一个模板标签<ui:insert>,为了实施模板化,首先创建一个包括<ui:insert>标签的模板页面,然后创建一个使用这个模板的客户端页面,在客户端页面中,使用<ui:composition>标签指定模板,使用<ui:define>标签指定插入到模板中的内容。
下面是一个模板页面的内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=http://www.w3.org/1999/xhtml
<title><ui:insert name="title">Page Title</ui:insert</title><body>
</head>
<body>
<div>
<ui:insert name="Links"/>
</div>
<div>
<ui:insert name="Data"/>
</div>
</body>
</html>
下面是使用这个模板的客户端页面代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
<ui:composition template="/template.xhtml">
This text will not be displayed.
<ui:define name="title">
Welcome page
<ui:define name="Links">
... [Links should be here]
</ui:define>
... [Data should be here]
</ui:define>
This text also will not be displayed.
</body>
</html>
当客户端调用这个模板时,它使用标题Welcome Page渲染这个页面,这个页面显示了两部分内容,一个显示客户端中指定的链接列表,另一个显示客户端中指定的数据。
混合组件
混合组件时JSF中的一个新特性,通过它创建自定义JSF组件会更加容易。你可以使用JSF页面标记和其它JSF组件创建混合组件。在Facelets的标注下,任何XHTML页面都可以变成一个混合组件。此外,混合组件可以有验证器,转换器和监听器。
创建好混合组件后,你可以将它保存到库中,以后有需要时就可以调用了。
让我们创建一个渲染为登录面板的混合组件,用户登录时,组件反馈一个登录事件,如图2所示。
图 2 登录面板混合组件
下面是混合组件的源代码:
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=http://www.w3.org/1999/xhtml
<h:head>
<title>This content will not be displayed in the rendered output</title>
</h:head>
<h:body> <composite:interface>
<table>
<tr>
<td>Username: <h:inputText id="username" /> </td>
</tr>
<tr>
<td>Password: <h:inputSecret id="password" /></td>
</tr>
<tr>
<td><h:commandButton value="Login" id="loginEvent" /></td>
</tr>
</table>
</composite:implementation>
</h:body>
</html>
xmlns:composite="http://java.sun.com/jsf/composite"声明了混合UI组件的命名空间,<composite:interface>
<composite:implementation>