原文:http://www.jsfcentral.com/articles/facelets_1.html
这是关于Facelets文章系列的第一部分,Facelets是用来建立JSF应用程序时的一个可供选择的表现层技术。Facelets提供了一个强有力的模板化系统,让你使用HTML样式的模板来定义JSF的表现层,减少了组件整合进表现层时候冗余的代码,而不需要一个web容器。在这篇文中,Jacob将会介绍Facelets,解释一些Facelets的特性,还有他创建这个project的缘由。这个系列文章的第二部分将会指导你如何使用Facelets。
自从JavaServer Faces成为工业标准以后,web社区一直热切地寻找一个类似Tapestry的框架。当JavaServer Faces 和JSP开始对齐,Facelets迈向了JSP specification地外部并且它提供了一个高性能以JSF为中心的表现层技术。任何写了一个JSP页面的人将可以用Facelets和类似的XML标签库来做同样的事。不同点在于任何隐藏在JSP供应商API下面的负荷被移除了,进而增强了JSF使之更像一个平台,并且提供了简单的插入式开发而不用进行任何的JSP标签库的开发工作。
JavaServer Faces的UIComponents是Facelets中最基本的类;没有必要去开发额外的对象去整合。也没有任何必要去学习另外一个XML schema来定义你的表现层。
这里是一个示例告诉了你在Facelets中定义一个页面是如何容易:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:c="http://java.sun.com/jstl/core">
<head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Hello</title> </head>
<body>
<form id="helloForm" jsfc="h:form">
<h2> Hi. My name is Duke. I'm thinking of a number from #{UserNumberBean.minimum} to #{UserNumberBean.maximum}. Can you guess it? </h2>
<img id="waveImage" src="wave.med.gif" />
<input type="text" jsfc="h:inputText" id="userNo" value="#{UserNumberBean.userNumber}" validator="#{UserNumberBean.validate}"/>
<input type="submit" jsfc="h:commandButton" id="submit" action="success" value="Submit" /> <p /> <h:message showSummary="true" id="errors1" for="userNo"/> <p /> <c:forEach begin="1" end="4" varStatus="v"> #{view.viewId} #{v.index}<br/> </c:forEach> </form>
</body>
</html>
你可能会感觉到这些标签看起来特别熟悉。这就是要点。使用Facelets将不需要学习额外的模板语言或schema。
为什么使用Facelets?
最先和最重要的,Facelets不依赖于一个JSP容器。 这就意味着你可以使用新的JSF1.2的特性而不需要等待JSP2.1容器。当JSF1.1出来的时候,结合使用JSF 1.1和JSP有一些严重的问题。大部分问题都在Hans Bergsten的"Improving JSF by Dumping JSP."文章中提到了。强烈建议阅读这篇文章在你推进倒JSF1.2和Facelets之前。
Secondly, Facelets is designer friendly. Taking from Tapestry's jwcid attribute, Facelets uses jsfc and proper namespaces to convert HTML elements to their associated JSF component. In the example above, jsfc (JSF Compilation) is used to tell the compiler to instead build a h:inputText component into the view.
第二,Facelets是设计者友好的。取自Tapestry的jwcid属性,Facelets使用jsfc和合适的命名空间将HTML元素转换倒他们对应的JSF组件。在上面的例子中,jsfc(JSF Compilation)告诉了编译器在view中添加一个h:inputText组件。
最后要提出的就是,Facelets是非常轻量级的。你们中的一些人可能很熟悉Velocity的作为模板引擎的性能。Facelet也拥有相同的性能,你可以定义测试你的JSF表现层而不需要一个Servlet容器。Facelets的消耗很少且有在实际的成品中使用的经验。它也为servlet以外的JSF应用开发打开了一道门,包括Portlets。
这里就是你如何创建一个Facelet:
// grab our FaceletFactory and create a Facelet FaceletFactory factory = FaceletFactory.getInstance(); Facelet f = factory.getFacelet(viewToRender.getViewId()); // populate UIViewRoot f.apply(context, viewToRender);
Facelets的一些特性
可以和JSF 1.1或1.2工作,包括 Sun's RI和Apache MyFaces.
0时间的UIComponents 标签开发
对JSF组件和页面的快速模板化/装饰支持
可以在不同的文件中声明UIComponent树(UICompositions)
支持到行/标签/属性的精确的错误报告
可以在不同的文件中声明标签, 甚至可以包含在Jar包中
全面的 EL 支持, 包含 Functions
编译期间的 EL 验证
XML 配置文件不是必要的, 但是是可用的
使用了 'jsfc' 属性, 和Tapestry的jwcid起相同作用 (例如: <input id="bar" type="text" jsfc="h:inputText" value="#{foo.bar}"/>)
插入式的装饰设计使设计者的工作更加简单 (例: 在编译期转换<input type="text"/>到<h:inputText/>)
不需要任何额外的呈现工具
Facelets不依赖于web容器
Jacob Hookom is a developer with Sun's JavaServer Faces RI and Glassfish projects and is an active member of the JavaServer Faces Expert Group. He started consulting at 16 and has since held titles from Information Architect to Product Manager. More recently, Jacob started the 'Facelets' project as an ideal foundation for JavaServer Faces development. He has an accredited BS in Comprehensive Computer Science from the University of Wisconsin, Eau Claire.
为什么Facelets会成功
任何人都希望更加设计者友好,而Tapestry看起来仿佛是开发者追求的唯一选择。另外一方面,JSF是一个任何人都希望使用的标准,但是JSF需要一个更加“可插入性”的ViewHandler框架来使开发者和设计者觉得友好。
开发者们做了足够的工作,在faces-config.xml中定义UIComponents/Converters/Validators,Facelets仅仅需要他们提供一个别名来将他们定义的对象插入到页面中去(不需要任何XML)。重点是简单的整合性和开发性。
最后,Facelets是整洁的面向JSF方面纠正。模板化,重用,易开发性拥有最高优先权,用来帮助开发者使用JSF平台开发大项目。