这是两篇详细介绍facelets功能的文章
http://www.ibm.com/developerworks/cn/java/j-facelets/
http://www.ibm.com/developerworks/cn/java/j-facelets2.html
jsf是种页面组件技术,它将一个页面组装成一个以rootview为根的组件树,当我们访问一个页面时jsf框架会去生成或恢复该页面的组件树。组件树如何创建却不是jsf框架的职责,jsf默认实现使用jsp来创建组件,可以通过jsf的配置文件来使用其他的技术,比如Facelets.
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
Facelets 有以下吸引人的特性:
模板化(像 Tiles)
复合组件
定制的逻辑标记
表达式语言
对设计师友好的页面开发
创建组件库
其中的 “复合组件” 和“创建组件库”让我们定义自己的组件简便了很多,并且组件的重用性得到了很大的提升。
详细的讲解上面两篇文章中说的很详细,这里只给些补从。
1)例子文件中用到的$和#表达式功能相同,可以相互替换 ,不知道是不是在任意页面$和#都是等价的。
2)facelets可以将多种东西当做组件来使用,比如一个xhtml文件、component、 validator等
下面的文件描述了它支持的组件类型
facelet_taglib_1_0.dtd 的文件
<!ELEMENT facelet-taglib (library-class|(namespace,(tag|function)+))>
<!ATTLIST facelet-taglib xmlns CDATA #FIXED "http://java.sun.com/JSF/Facelet">
<!ELEMENT namespace (#PCDATA)>
<!ELEMENT library-class (#PCDATA)>
<!ELEMENT tag (tag-name,(handler-class|component|converter|validator|source))>
<!ELEMENT tag-name (#PCDATA)>
<!ELEMENT handler-class (#PCDATA)>
<!ELEMENT component (component-type,renderer-type?,handler-class?)>
<!ELEMENT component-type (#PCDATA)>
<!ELEMENT renderer-type (#PCDATA)>
<!ELEMENT converter (converter-id, handler-class?)>
<!ELEMENT converter-id (#PCDATA)>
<!ELEMENT validator (validator-id, handler-class?)>
<!ELEMENT validator-id (#PCDATA)>
<!ELEMENT source (#PCDATA)>
<!ELEMENT function (function-name,function-class,function-signature)>
<!ELEMENT function-name (#PCDATA)>
<!ELEMENT function-class (#PCDATA)>
<!ELEMENT function-signature (#PCDATA)>
下面是我们自定义的组件
<tag>
<tag-name>validateDoubleRange</tag-name>
<source>validator_DoubleRange.xhtml</source>
</tag>
<tag>
<tag-name>validateCompare</tag-name>
<validator>
<validator-id>trackway.validator.compare</validator-id>
</validator>
</tag>
<tag>
<tag-name>addValidatorMessage</tag-name>
<handler-class>
trackway.twid09.common.tag.AddValidatorMessageHandler
</handler-class>
</tag>
<tag>
<tag-name>rating</tag-name>
<component>
<component-type>javax.faces.SelectOne</component-type>
<renderer-type>javax.faces.Rating</renderer-type>
</component>
</tag>
<tag>
<tag-name>requiredFieldValidator</tag-name>
<component>
<component-type>net.sf.jsfcomp.clientvalidators.requiredfieldvalidator</component-type>
</component>
</tag>
为什么要这样做呢? 原因是我们不能直接在xhtml文件中使用jsp tag,比如我们自定义了一个验证组件regularExpressionValidator,按照jsf的验证规范,验证组件是很容易写的,如果我们使用jsp的话,我们还要做的一项工作就是再实现个jsp tag,可我们使用了facelets时却不能直接使用jsp的tag,这时就需要我们定义在facelets中使用的tag,相比较来说使用facelets比使用jsp的开发工作要小的多。
<tag>
<tag-name>validateRegularrxpression</tag-name>
<validator>
<validator-id>trackway.validator.regularrxpression</validator-id>
</validator>
</tag>
还有个例子就是我们使用了一个jsf的客户端验证组件clientvalidators-0.9.1.jar,但它却不能直接在xhtml中使用,
通过如下的定义就可以很容易的将clientvalidators集成到facelets中
<tag>
<tag-name>requiredFieldValidator</tag-name>
<component>
<component-type>net.sf.jsfcomp.clientvalidators.requiredfieldvalidator</component-type>
</component>
</tag>
<tag>
<tag-name>rangeValidator</tag-name>
<component>
<component-type>net.sf.jsfcomp.clientvalidators.rangevalidator</component-type>
</component>
</tag>