Как создать составной компонент для столбца с данными?
С учетом этого (естественно работает):
<rich:dataTable var="var" value="#{values}">
<rich:column>
<f:facet name="header">
HEADER
</f:facet>
<h:outputText value="#{var}" />
</rich:column>
</rich:dataTable>
Если я определяю пользовательский компонент (также хорошо в синтаксисе и в нужном месте под ресурсами / компонентами):
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:composite="http://java.sun.com/jsf/composite">
<!-- INTERFACE -->
<composite:interface>
<composite:attribute name="val" />
</composite:interface>
<!-- IMPLEMENTATION -->
<composite:implementation>
<rich:column>
<f:facet name="header">
HEADER
</f:facet>
<h:outputText value="#{cc.attrs.val}" />
</rich:column>
</composite:implementation>
</html>
Почему следующее не работает?
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition template="/WEB-INF/templates/default.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:my="http://java.sun.com/jsf/composite/components">
<ui:define name="content">
<rich:dataTable var="var" value="#{values}">
<my:mycolumn val="#{var}"/>
</rich:dataTable>
</ui:define>
</ui:composition>
Знаете ли вы, как я могу позволить этому работать (я хочу определить свой собственный столбец и сохранить код)? Большое спасибо! до свидания
1 ответ
<my:mycolumn>
элемент должен быть экземпляром UIColumn
так как это единственный действительный ребенок UIData
компонент во время фазы ответа рендеринга. Все остальные UIComponent
типы будут игнорироваться, поэтому не отображаются. Составной компонент неявно является UINamingContaner
компонент, который не является UIColumn
и поэтому игнорируется.
PrimeFaces <p:dataTable>
с вспомогательным компонентом, который расширяется 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>
Я столкнулся с тем же вопросом (начальные буквы), мой компромисс: исключить тег столбца из составного
<rich:dataTable var="var" value="#{values}">
<rich:column rendered=#{yesOrNo}">
<my:mycolumn val="#{var}">
.. with child nodes if you want ...
</my:mycolumn>
</rich:column>
</rich:dataTable>