使用Facelets重用Component JSF2.1

时间:2015-03-03 17:57:34

标签: jsf-2 richfaces facelets

我正在使用:

  • JSF 2.1
  • RichFaces 4.5.2.Final
  • Omnifaces 2.0

我有一个表,我想重用作为数据或子表取决于我使用该组件的页面,我想放,如果但它不起作用,这是我的代码:

<!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,任何完成这种情况的想法并尝试将这些代码重用为表或子表,一个可能的想法是外部的<rich:colum>标签在另一个模板和包装中,在datable或如下所示:

            <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>

我认为这样可行但也许是另一种更好的方法。

1 个答案:

答案 0 :(得分:2)

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

TAG(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>