使用 <f:facet> 而不是属性或子组件的要点

Point of using <f:facet> instead of an attribute or a child component

我想知道为什么 <f:facet> 存在以及与仅设置属性或声明子组件相比它有什么好处。

例如,<h:dataTable> 有许多方便的属性,如 headerClasscaptionClassfooterClass 等。页眉和页脚内容只能通过 <f:facet> 设置,而不是通过例如headerValuefooterValue 属性?或者作为子组件?

For example, in a dataTable, we have many attributes for setting the header (footer, caption ...) css style, why not just adding an attribute for the value (like saying headerValue for example)?

因为您不能将 JSF 组件设置为属性值。考虑一下:

<h:dataTable ... header="<h:outputLabel value="Search"><h:inputText ... />">

那只会以无效告终 XML。

没错,可以转义:

<h:dataTable ... header="&lt;h:outputLabel value=&quot;Search&quot;&gt;&lt;h:inputText ... /&gt;">

但这需要将属性值重新解析为 JSF 组件树的一部分,以便使其实际工作。然后它最好在视图构建期间发生。 JSF 没有这方面的设施。它简直笨拙而且破坏了 JSF 的理念。而且,它很丑,而且维护起来很痛苦。


Or, why not having the header (footer, ...) as child components of the dataTable ?

这正是 <f:facet> 所做的。 <h:dataTable> 组件还应该如何知道您希望哪些组件最终成为页眉或页脚?