使用 Facelets 重用组件 JSF2.1

Reuse Component JSF2.1 with Facelets

我正在使用:

我有一个 Table 我想重用为 datable 或 subtable 取决于我使用该组件的页面,我想放置它不起作用,这是我的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:o="http://omnifaces.org/ui"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:composite="http://java.sun.com/jsf/composite"
      xmlns:tablas="http://java.sun.com/jsf/composite/tablas"
      >

    <!-- INTERFACE -->
    <composite:interface>
        <composite:attribute name="listaPaqueteItems" required="true" />
        <composite:attribute name="subtable" required="false" default="false" />
    </composite:interface>

    <!-- IMPLEMENTATION -->
    <composite:implementation>


        <c:if test="#{!cc.attrs.subtable}"> 
            <rich:dataTable id="tabla_items_del_paquete"
                value="#{cc.attrs.listaPaqueteItems}"
                var="p"
                rowKeyVar="row_tabla_items_del_paquete"
                rows="10"
                rowClasses="odd-row, even-row"
                styleClass="stable">
        </c:if> 
        <c:if test="#{cc.attrs.subtable}">  
            <rich:collapsibleSubTable id="subtable">
        </c:if>
                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="#" />
                    </f:facet>
                    <h:outputText value="#{row_tabla_items_del_paquete + 1}" />
                </rich:column>
                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="#{msgs['abm.paquete.item.tabla.codigo']}" />
                    </f:facet>
                    <h:outputText value="#{p.producto.codigo}" />
                </rich:column>                  
                <rich:column colspan="2">
                    <f:facet name="header">
                        <h:outputText value="#{msgs['abm.paquete.item.tabla.nombre']}" />
                    </f:facet>
                    <b>
                        <h:outputText value="#{p.producto.nombre}" />
                    </b>
                </rich:column>
                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="#{msgs['abm.paquete.item.tabla.descuento.final']}" />
                    </f:facet>
                    <h:outputText value="#{p.descuentoFinal}" />
                </rich:column>                  

        <c:if test="#{!cc.attrs.subtable}"> 
            </rich:dataTable> 
        </c:if> 
        <c:if test="#{cc.attrs.subtable}">  
            </rich:collapsibleSubTable> 
        </c:if>
    </composite:implementation>    

</html>

基本上问题是不是有效的 XHTML,任何实现此场景并尝试将此代码重用为 table 或子 table 的想法,一个可能的想法是外部 <rich:colum> 标签在另一个模板和包装器中,在 datable 或 subtable 中是这样的:

            <rich:collapsibleSubTable
            expanded="#{false}"
            id="tabla_periodos"
            rowKeyVar="row_subtable"
            expandMode="client"
            value="#{p.periodoDescuentos}"
            var="per"
            rendered="#{not empty p.periodoDescuentos}"
            >
<!-- Include Columns-->
                </rich:collapsibleSubTable>

我认为这会奏效,但也许是另一种更好的方法。

您可以使用以下代码创建 facelet 标签:

标签 (myTable.xhtml):

     <c:if test="#{!subtable}"> 
        <rich:dataTable id="tabla_items_del_paquete"
            value="#{listaPaqueteItems}"
            var="p"
            rowKeyVar="row_tabla_items_del_paquete"
            rows="10"
            rowClasses="odd-row, even-row"
            styleClass="stable">
           <ui:insert>
         </rich:dataTable>
    </c:if> 
    <c:if test="#{subtable}">  
        <rich:collapsibleSubTable id="subtable">
           <ui:insert>
        </rich:collapsibleSubTable>
    </c:if>

用法:

    <my:mytable>
       ... your dataTable content
    </my:mytable>