Facelets非常适合JSF(第二部分)

Facelets 非常适合 JSF(第二部分)
  以下内容转载自互联网!!
  现在通过 column.xhtml 示例已经快速查看了复合组件。下面一步一步地介绍创建复合组件的过程。以下是创建复合组件的步骤:
  创建 Facelets 标记库。
  在 web.xml 中声明标记库。
  用命名空间导入标记文件。
  标记文件 是符合 facelet_taglib_1_0.dtd 的文件。在概念上它与 JSP 中的 TLD 文件相似。清单 6 是一个示例标记库文件:
  
  "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"facelet-taglib_1_0.dtd">  "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
  "facelet-taglib_1_0.dtd">
  
   http://www.arc-mind.com/jsf
  
   field
   field.xhtml
  
  
   column
   column.xhtml
  
  
   columnCommand
   columnCommand.xhtml
  
  
  arcmind.taglib.xml 文件声明了三个标记:field、column(已经看过这个!)和 columnCommand。需要做的只是用 tag-name 指定标记的名称和实现文件的位置。实现文件的名称是相对的。可以在示例 Web 应用程序下的 WEB-INF/ facelets/tags 文件中找到所有这些代码,包括 DTD。
  请一定注意在上面的标记元素之前声明的 namespace 元素:稍后需要通过它在其他 Facelets 页面中使用这个标记库。
  有了一个标记库是很好,但是要让它有用,还必须把它的存在告诉 Facelets。在 web.xml 文件中用 facelets.LIBRARIES init 参数做这件事,如下所示:
  
   facelets.LIBRARIES
  
  /WEB-INF/ facelets/tags/arcmind.taglib.xml
  
  
  将 facelets.LIBRARIES 以分号分隔的列表形式传递,就可以想定义多少就定义多少标记文件。
  创建了标记文件并在 Facelets 标记库中定义了它之后,就可以使用它了。标记文件的使用要求把它声明为 XML 命名空间,如下所示:
   xmlns:ui="facelets"' target=_blank>  xmlns:ui="facelets"' target=_blank>http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:a="http://www.arc-mind.com/jsf">
  ...
  ...
   backingBean="${CDManagerBean}"/>  backingBean="${CDManagerBean}"/>
   backingBean="${CDManagerBean}"/>  backingBean="${CDManagerBean}"/>
   backingBean="${CDManagerBean}" sort="${false}"/>  backingBean="${CDManagerBean}" sort="${false}"/>
   backingBean="${CDManagerBean}"/>  backingBean="${CDManagerBean}"/>
  请注意命名空间的定义如下所示:
  xmlns:a="http://www.arc-mind.com/jsf"
  命名空间的值与前面步骤 1 中标记库中声明的命名空间元素一样。
  上面只介绍了复合组件的基础知识。用我目前为止介绍的内容能够创建可重用组件。在我自己使用 Facelets 时,发现了一些可以让复合组件更有用的小技巧,而且在某些情况下能够解决一些小问题。例如,请考虑来自 cdForm.xhtml 模板的以下代码片段:
  
  
  
  
   value="Title" />  value="Title" />
   required="true" />  required="true" />
  
  
   value="Artist" />  value="Artist" />
   required="true" />  required="true" />
   styleClass="errorText"/>  styleClass="errorText"/>
  
  
   required="true">  required="true">
  
  
  
  以上页面在概念上与 清单 3 类似,但它为 Facelets 和一个字段复合组件留出了空间,可以避免重复代码。基于这个代码,应当可以容易地创建显示字段的复合组件,但是有一个小麻烦。不知道您看到没有?请看表单的 price 字段:它包含一个验证器。
  现在,如何把验证器传递给复合组件?
  这里有一个关于 Facelets 的小秘密:复合组件基本上也是一类模板。所以,可以用 ui:define 标记传递模板参数,带上具体的 ui:insert,或者也可以把体作为默认 ui:insert 传递。
  清单 8 就是字段组件的这样一种实现(field.xhtml):
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   xmlns:ui="facelets"' target=_blank>  xmlns:ui="facelets"' target=_blank>http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:z="http://www.qualcomm.com/jsf/core"
  xmlns:c="http://java.sun.com/jstl/core"
  xmlns:fn="http://java.sun.com/jsp/jstl/functions"
  xmlns:t="http://myfaces.apache.org/tomahawk">
  THIS TEXT WILL BE REMOVED
  
     Generate it if it is missing. -->
  
  
  
     initialize it to true if not found. -->
  
  
  
   value="${label}" for="#{fieldName}" />  value="${label}" for="#{fieldName}" />
   required="${required}">  required="${required}">
  
  
  
   style="color: red; text-decoration: overline"
for="#{fieldName}" />  style="color: red; text-decoration: overline"
  for="#{fieldName}" />
  
  THIS TEXT WILL BE REMOVED AS WELL
  
  目前为止,清单 8 的工作基本上是不出所料。请注意 h:inputText 内部未命名 ui:insert 标记的使用。理解了它之后,就可以像清单 9 所示那样使用这个复合组件:
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   xmlns:ui="facelets"' target=_blank>  xmlns:ui="facelets"' target=_blank>http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:a="http://www.arc-mind.com/jsf">
  ...
  
  
  
  
  
  
  
  ...
  price 的字段标记被传递给验证器,作为匿名插入。因为其他字段没有定义体,所以匿名插入对于默认值没有影响。
  在想传递动作绑定来创建像工具栏或导航列表这样的元素时,问题就是使用标准的表达式语言,不能传递,但是有方法可以做到!使用从对象中引用字段的相同方式,可以引用对象中的方法。所以,要创建可以创建动作绑定的组件,可以像下面这样做(来自 columnCommand.xhtml):
   action="#{backingBean[action]}"/>  action="#{backingBean[action]}"/>
  请研究动作属性的 value。请注意,我使用与前面从实体引用字段相同的方式,访问到了方法。可以用以下语法调用这个组件:
   backingBean="${CDManagerBean}"/>  backingBean="${CDManagerBean}"/>
  这个调用把 CDManagerBean 的 editCD() 方法绑定到链接。清单 10 显示了 columnCommand.xhtml 的完整清单:
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   xmlns:ui="facelets"' target=_blank>  xmlns:ui="facelets"' target=_blank>http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:z="http://www.qualcomm.com/jsf/core"
  xmlns:c="http://java.sun.com/jstl/core">
  THIS TEXT WILL BE REMOVED
  
  
  
  
  
  
  
  
  
  
  
   action="#{backingBean[action]}"/>  action="#{backingBean[action]}"/>
  
  
  THIS TEXT WILL BE REMOVED AS WELL
  
  我已经清楚地演示了使用 Facelets 的好处:即组件复合和模板框架,它的核心 是组件,而不是 Servlets 输出。但是采用 Facelets 也有些不足。其中之一就是,对 Facelets 的 IDE 支持极少。只有一个 Eclipse IDE 实现完全支持 Facelets(商业版的实现,请参阅 参考资料),而且看起来还不支持代码补足。
  而且也没对 Facelets 调试的 IDE 支持(也就是说,设置断点之类的东西)。要想调试,需要阅读 Facelets 手册,打开 JDK 1.4 样式的日志,根据开发情况设置它的 init 参数。
  在有利方面来说,我发现使用 Facelets API 非常自然和直观。调试在开始的时候有些怪异,但是后来就适应了。随 Facelets 发行包提供的演示应用程序没有定制标记或功能的示例,但是核心项目代码中有,所以请用核心项目代码作为指导。
  如果要使用新的 JSF 组件库,必须有公开这个库的 Facelets 标记库。有些主要的组件库(例如 Oracle 和 Tomahawk)的标记库存在,但是即使这些也需要调整。我必须调整 Tomahawk 标记库才能在应用程序中得到 Tomahawk 的日历组件。虽然编写导出组件的标记库文件比较容易,但是也是件麻烦事。如果想使用新的定制组件库,就必须编写标记库文件。
  因为在其他实现中的问题,Facelets 看起来只能用于 MyFaces 1.1.1 和 Sun 1.2 JSF 的参考实现(Sun 的 JSF RI 1.2 还没有正式发布)。不能把 Facelets 用于 1.1 RI。虽然可以把 MyFaces 用于 IBM WebSphere,但不能把 Facelets 用于 IBM 的实现。(如果使用最新版本的 Facelets,必须使用最新构建的 MyFaces 1.1.2,它现在还没推出。)
  还要注意的是,MyFaces 1.1 和 JSF RI 1.2 的底层机制不同。尽管如此,Facelets 试图把这两者的实现保持为它们当前的形式(MyFaces 1.1.2 和 JSF RI 1.2),这看起来解释了花在 Facelets 上的大量时间。如果双方更团结协调一点,让 Facelets 在两个环境中做同样的事上少花些时间,就可以把更多时间花在改进 Facelets 上。
  虽然有些缺点,我还是强烈推荐您下载 Facelets 并尽快开始使用它。Facelets 是 JSF 的未来,或者将会是,使用它可以使您在任何 JSF 暴风雨中都干爽(DRY 的双关语,译者注)。如果还不能在当前项目中使用它,请在下一个项目中想着它。
  我已经用 Facelets 创建了复合组件、定制 Facelet 标记和内部 CRUD 框架功能的整个库。我发现了许多构建复合组件的技巧和技术(例如,自动生成复选框、日历组件的字段标记,或者根据绑定到组件的值绑定类型的文本字段),超过了在这样一篇介绍性文章中能涉及的内容。相反,我把重点放在让您了解和运行复合组件。通过在这里学到的知识,只用最少的定制功能和定制 Facelets 标记,就可以创建动人的组件。

本文转自
http://www.hexiao.cn/jsf/read.php?fid=11&tid=29&searchword=facelets
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值