Ответ 1
Элемент <my:mycolumn>
должен быть экземпляром UIColumn
как дочерний только действительный элемент UIData
во время фазы ответа рендеринга. Все остальные типы UIComponent
будут игнорироваться, поэтому не отображаются. Компонентный компонент неявно является компонентом UINamingContaner
, который не является UIColumn
и поэтому игнорируется.
A PrimeFaces <p:dataTable>
с компонентом backing, который расширяет UIColumn
, также не будет работать из-за неправильного жизненного цикла составного компонента. Столбец должен быть создан во время создания представления, тогда как тело составного компонента создается во время рендеринга представления.
Решением является создание файла тега вместо него, что означает дополнительный файл .taglib.xml
, но он работает безупречно.
/WEB-INF/tags/column.xhtml
:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich">
<rich:column>
<f:facet name="header">HEADER</f:facet>
<h:outputText value="#{val}" />
</rich:column>
</ui:composition>
/WEB-INF/my.taglib.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://example.com/my</namespace>
<tag>
<tag-name>column</tag-name>
<source>tags/column.xhtml</source>
<attribute>
<description>Column value</description>
<name>val</name>
</attribute>
</tag>
</facelet-taglib>
Примечание. Записи <attribute>
не являются обязательными, но хороши для целей документации, например, сгенерированные документы и автозаполнение IDE.
/WEB-INF/web.xml
:
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/my.taglib.xml</param-value>
</context-param>
Использование:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich"
xmlns:my="http://example.com/my">
<rich:dataTable value="#{values}" var="value">
<my:column val="#{value}" />
</rich:dataTable>
</ui:composition>