Точка использования <f: facet> вместо атрибута или дочернего компонента

Мне было интересно, почему <f:facet> существует и каково его преимущество по сравнению с простой установкой атрибута или объявлением дочернего компонента.

Например, <h:dataTable> имеет много удобных атрибутов, таких как headerClass, captionClass, footerClass и т.д. Почему, например, содержимое верхнего и нижнего колонтитула может быть установлено только через <f:facet> вместо, например, через headerValue или же footerValue атрибут? Или, возможно, как дочерний компонент?

1 ответ

Решение

Например, в dataTable у нас есть много атрибутов для установки стиля css заголовка (нижнего колонтитула, заголовка...), почему бы просто не добавить атрибут для значения (как, например, сказать headerValue)?

Потому что вы не можете установить компоненты 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. Более того, это уродливо и больно.


Или почему бы не иметь заголовок (нижний колонтитул, ...) в качестве дочерних компонентов dataTable?

Это именно то, что <f:facet> делает. Как еще следует <h:dataTable> компонент знает, какие именно компоненты вы бы хотели иметь в качестве верхнего или нижнего колонтитула?

Другие вопросы по тегам