最初是作为对JSF 1.x中基于JSP的视图处理程序的替代而开发的。在JSF2.0中,Facelets作为JSF的默认视图技术来替换JSP。除了是一种更好的视图处理程序外,Facelets还支持大量用于模板化和其他目的的标签。
命名空间:
xmlns:ui="http://java.sun.com/jsf/facelets" |
Facelets 标签
可将Facelets标签分为如下几个类型:
-
包含来自其他XHTML页面的内容(ui:include)
-
利用模板生成页面(ui:compostion、ui:decorate、u:insert、ui:define、ui:param)
-
无须编写Java代码创建自定义组件(ui:component、ui:fragment)
-
其他实用工具(ui:debug、ui:remove、ui:repeat)
标签 | 说明 |
<ui:include> | 包含来自另一个XHTML文件的内容 |
<ui:compostion> | 如果不使用template属性,组合是一连串可插入到其他地方的元素。组合可以具有可变部分(使用ui:insert子标签指定)。 如果使用template属性,则加载该模板。该标签的子标签确定模板的可变部分。模板内容替换该标签。 |
<ui:decorate> | 如果不使用template属性,ui:decorate指定可以插入部分的页面。使用ui:insert子标签指定变量部分。 如果使用template属性,则加载该模板。该标签的子标签确定了模板的可变部分。 |
<ui:define> | 定义了使用匹配ui:insert插入到模板中的内容。 |
<ui:insert> | 将内容插入到模板中。在加载了该模板的标签中定义该内容。 |
<ui:param> | 指定一个传入到所含文件或者模板的参数。 |
<ui:component> | 该标签类似于ui:composition,唯一不同的是它创建了一个添加到组件树的组件。 |
<ui:fragment> | 类似于ui:decorate,不同之处在于它创建了一个添加到组件树的组件。 |
<ui:debug> | 使用户通过键盘快捷键显示调试窗口,其中显示了当前页面的组件层次结果和应用程序作用域内的变量。 |
<ui:remove> | JSF移除ui:remove标签中的所有内容。 |
<ui:repeat> | 迭代列表、数组、结果集合或单个对象。 |
<ui:include>
<ui:include>标签用来在文件中包含另外一个Facelets文件 , 它只需要指定被包含文件的位置。
它可以包含任何拥有 ui:component 或 ui:composition等标签或是简单的XHTML 或XML 代码片断的文件。
Attributes
属性名称 | 必需 | 描述 |
src | 是 | 属性的值可以是简单的值或是 EL 表达式,用来指定被包含的 Faclets 文件的位置 , 可以是相对路径也可以是绝对路径。 |
可用子元素
<ui:param>
设置EL变量,在被包含的Facelets文件中使用。
<ui:composition>
<ui:composition> 标签是一个模板标签,它将一些可以被其它Facelets 页面所包含的内容封装起来。
标签以外的内容将被编译器忽略
Attributes
属性名称 | 必需 | 描述 |
template | 否 | 将在标签开始和结束之间显示的模板文件所在的路径 |
<ui:composition>指定使用哪个模版文件,然后通过 <ui:define> 对模版文件中每个可供插入的“<ui:insert>锚点”进行定义。 在运行期,具体的内容将会被插入到 <ui:composition>中定义的锚点位置。
与<ui:component> 的异同
相同点:标签以外的内容被编译器忽略 ,不会显示在视图中 。
不同点:ui:composition 不会在组件树上创建节点。
<ui:decorate>
<ui:decorate>标签是一个模板标签,它将一些可以被其它Facelets 页面所包含的内容封装起来。
标签外部的内容编译时会被包含进来
Attributes
属性名称 | 必需 | 描述 |
template | 否 | 将在标签开始和结束之间显示的模板文件所在的路径 |
与 <ui:fragment> 的异同
相同点:标签外部的内容编译时会被包含进来。
不同点:<ui:fragment>不会在组件上创建节点。
<ui:define>
ui:define 标签用于将命名的内容插入到模板中 , 它在模板标签(如composition 和 decorate)的内部使用。
define 的name 属性必须和目标模板中ui:insert 标签的name 属性一致。
Attributes
属性名称 | 必需 | 描述 |
name | 是 | 必须和目标模板中ui:insert 标签的name 属性一致 |
<ui:insert>
ui:insert标签用来在模板中指定一个插入点,可以被客户端模板中 ui:define定义的内容所代替。
Attributes
属性名称 | 必需 | 描述 |
name | 否 | 用来和客户端模板中ui:define 标签的name 属性相一致 , 如果没有指定,整个客户端模板将被插入。 |
<ui:param>
指定一个传入到所含文件或者模板的参数。
Attributes
属性名称 | 必需 | 描述 |
name | 是 | 参数名 |
value | 是 | 参数值 |
<ui:component>
<ui:component> 标签在JSF组件树中插入一个 UIComponet实例,并作为所有它所包含的组件或内容片断的根节点。
标签以外的内容将被编译器忽略
Attributes
属性 | 必需 | 描述 |
id | 否 | 和所有的组件一样,可以这它提供一个 id,如果没有设置, Facelets 将按照 JSF 的规则为它创建一个。 |
binding | 否 | 按照 JSF 的规范 , 这个属性的作用是通过指向 ManagedBean 的一个属性来引用UIComponet 的实例 , 如果 ManagedBean的这个属性没有事先初始化,UIComponet 实例将延迟 (lazily) 被创建。 |
Example
这里以及这里以前的内容将被忽略 <ui:componentbinding="#{backingBean.myComponent}"> <div>The directory contains #{totalBirds} birds!</div> </ui:component> 这里以及这里后的内容将被忽略 | The directory contains #{totalBirds} birds! |
<ui:fragment>
<ui:fragment>标签在 JSF 组件树中插入一个UIComponet实例,并作为标签内部所有它所包含的组件或内容片断的根节点 。
标签外部的内容编译时会被包含进来
Attributes
属性名称 | 必需 | 描述 |
id | 否 | 和所有的组件一样,可以这它提供一个 id,如果没有设置, Facelets 将按照 JSF 的规则为它创建一个。 |
binding | 否 | 按照 JSF 的规范 , 这个属性的作用是通过指向 ManagedBean 的一个属性来引用UIComponet 的实例 , 如果 ManagedBean的这个个属性没有事先初始化,UIComponet 实例将惰性 (lazily) 被创建 . |
Example
This will not be ignored <ui:fragment> <div> <h:outputText value="I want #{eagle.total} eagles."/> </div> </ui:fragment> This will not be ignored | This will not be ignored <div>I want 3 eagles.</div> This will not be ignored |
<ui:debug>
当在Facelets页面中放置<ui:debug>标签时,调试组件会添加到该页面的组件树中。
如果用户输入热键(默认情况下是CTRL +SHIFT + D),JSF将打开一个窗口并显示组件树和应用程序作用域内变量的状态。
重新定义生成Debug Output窗口的热键
<ui:debughotkey="k"/> |
上述ui:debug的用法将热键重新定义为CTRL + SHIFT + K。
<ui:remove>
<!-- … -->的问题
例如如下代码:
<!-- <h:commandButton id="loginButton" value="#{msgs.lgoinButtonText}" action="planetarium" /> --> |
如果#{msgs.loginButtonText}的计算结果是“Log In”,将在生成的HTML页面中可以看到如下结果:
<!-- <h:commandButton id="loginButton" value="Login" action="planetarium" /> --> |
该使用ui:remove
<ui:remove> <h:commandButtonid="loginButton"value="#{msgs.lgoinButtonText}"action="planetarium"/> </ui:remove> |
在XHTML页面添加JavaScript代码问题
<scripttype="text/javascript"> if(1> 10){ } </script> |
上面的代码应改成:
<scripttype="text/javascript"> if(1 > 10){ } </script> |
或:
<ui:repeat>
迭代列表、数组、结果集合或单个对象。
-
迭代时,它迭代数组、列表和结果集等中的每一项。项的名称由var属性指定。如果value属性指定的是Java对象,那么只迭代一次,使对象能在标签主体中使用。
Attributes
属性名称 | 必需 | 默认值 | 描述 |
offset | 否 | 0 | 遍历开始处的索引 |
step | 否 | 1 | 连接索引值之间的差值 |
size | 否 | (集合大小 - offset)/ step | 迭代次数 |
var | 是 |
| 当前遍历的对象 |
value | 是 |
| 遍历的对象。该对象可以是普通Java对象、数组、集合java.sql.ResultSet、javax.servlet.jsp.jstl.sql.Result、javax.faces.model.DataModel |
varStatus | 否 |
| 当前的迭代状态 |
varStatus
特性 | Getter | 描述 |
current | getCurrent() | 当前这次迭代的(集合中的)项 |
index | getIndex() | 当前这次迭代从 0开始的迭代索引 |
count | getCount() | 当前这次迭代从 1开始的迭代计数 |
first | isFirst() | 用来表明当前这轮迭代是否为第一次迭代的标志 |
last | isLast() | 用来表明当前这轮迭代是否为最后一次迭代的标志 |
begin | getBegin() | begin属性值 |
end | getEnd() | end 属性值 |
step | getStep() | step属性值 |