Given this datatable (naturally working):
<rich:dataTable var="var" value="#{values}">
<rich:column>
<f:facet name="header">
HEADER
</f:facet>
<h:outputText value="#{var}" />
</rich:column>
</rich:dataTable>
If I define a custom component (also ok in the syntax and at the right place under resources/components):
<?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>
Why does the following does not work?
<?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>
Do you know how could I let it work (I want to define my own column and save code)? Thanks a lot! Bye
The
<my:mycolumn>element must be an instance ofUIColumnas that’s the only valid child of aUIDatacomponent during the render response phase. All otherUIComponenttypes will be ignored, thus not rendered. A composite component is implicitly aUINamingContanercomponent, which isn’t aUIColumnand therefore ignored.A PrimeFaces
<p:dataTable>with a backing component that extendsUIColumnalso won’t work due to the wrong lifecycle of a composite component. The column has to be created during the view build time, while the composite component’s body is created during view render time.The solution is to create a tag file instead, which means an extra
.taglib.xmlfile, yet it works flawlessly./WEB-INF/tags/column.xhtml:/WEB-INF/my.taglib.xml:Note: The
<attribute>entries are not mandatory, but are nice for documentation purposes, such as generated docs and IDE autocomplete./WEB-INF/web.xml:Usage: