Facelets 中 ui:composition 和 ui:decorate 的区别

Posted

技术标签:

【中文标题】Facelets 中 ui:composition 和 ui:decorate 的区别【英文标题】:Difference between ui:composition and ui:decorate in Facelets 【发布时间】:2012-10-17 00:20:36 【问题描述】:

Facelets 中的ui:compositionui:decorate 有什么区别?两者似乎都支持 ui:define 作为子标签。在什么情况下你会使用这些?

【问题讨论】:

【参考方案1】:

<ui:composition> 标签之外的任何内容都将被忽略。 <ui:decorate> 并非如此,因此作为“模板中的模板”是有益的。

通过查看以下答案中的一些真实示例,可能会更好地理解其意义:

What is the real conceptual difference between ui:decorate and ui:include? Is it possible to use template with composite component in JSF 2? Is there a way to run a JSF page without building the whole project?

【讨论】:

你所说的“模板中的模板”是什么意思?你也可以举一些人为的例子来展示 ui:decorate 对 ui:composition 的强大吗? 您可以将<ui:decorate> 嵌套在另一个<ui:composition> 甚至<ui:decorate> 中。 <ui:composition> 并非如此,因为它忽略/忽略/删除标签之外的任何内容。给定的链接包含详细的真实世界示例。【参考方案2】:

正如文档所说:http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/docs/pdldocs/facelets/ui/decorate.html 装饰器标签与组合相同,唯一的区别是 ui:decorate 不会忽略标签之外的所有内容,这在您想要制作页面区域或部分的模板。

例如,当您想要制作应用程序的一般外观模板时,ui:composition 很有用。由于它删除了标签之外的内容,因此模板属性真正定义了应用程序区域的总体外观。

使用装饰标签,由于标签外的内容不会被删除,您可以制作内容区域内的部分的模板。

一个例子可以是使用组合模板来定义页眉、菜单、页脚和内容部分。

然后在内容部分中,您可以在制作表单时使用装饰器标签,然后使所有表单具有相同的外观(例如标题、组件区域和按钮区域)。

【讨论】:

以上是关于Facelets 中 ui:composition 和 ui:decorate 的区别的主要内容,如果未能解决你的问题,请参考以下文章

将 EL 方法表达式作为自定义 Facelets 标记文件的属性传递

Win 10 应用开发UI Composition 札记:动画

JSF ui:composition 和复合组件的问题

Win 10 应用开发UI Composition 札记:视图框架的实现

Win 10 应用开发UI Composition 札记:绘制图形

使用 <ui:composition> 模板时,我应该在哪里声明 <f:metadata>?