Java JSF数据表中的多个页脚行

Java JSF数据表中的多个页脚行,java,jsf,datatable,Java,Jsf,Datatable,我想知道是否有办法在一个h:dataTable(或t:dataTable)中有多个页脚行,我想做这样的事情(不编译) 标题 第一页脚 新tr中的第二个页脚 结果是这样的 <table border=1 style="border:1px solid"> <thead><tr><th>Header</th></tr></thead> <tbody><tr><td>Data V

我想知道是否有办法在一个h:dataTable(或t:dataTable)中有多个页脚行,我想做这样的事情(不编译)


标题
第一页脚
新tr中的第二个页脚
结果是这样的

<table border=1 style="border:1px solid">
<thead><tr><th>Header</th></tr></thead>
<tbody><tr><td>Data Value 1</td></tr>
<tr><td>Data Value 2</td></tr>
<tr><td>Data Value ...</td></tr>
<tr><td>Data Value n</td></tr>
</tbody>
<tfoot>
<tr><td>FirstFooter</td></tr>
<tr><td>Second Footer in a new tr</td></tr>
</tfoot>
</table>

标题
数据值1
数据值2
数据值。。。
数据值n
第一页脚
新tr中的第二个页脚
你有什么想法可以最好地做到这一点吗? 谢谢

编辑: 如果我可以避免使用自定义控件/自定义渲染器,那就太好了(facet必须有唯一的名称(它们存储在一个数据库中)

今年春天有两种方法可以让你记住:

  • 只需在页脚添加一个,并使用样式表来获得所需的外观
  • 创建一个包含所需标记的

  • 正如McDowell所说,panelGrid将在没有自定义控件的情况下执行您要求的操作,除非我遗漏了什么

    <f:facet name="footer">
        <h:panelGrid columns="1"> 
            <h:outputText value="FirstFooter" />
            <h:outputText value="Second Footer in a new tr" />
        </h:panelGrid>
    </f:facet>
    
    
    
    其呈现如下

    <tfoot>
        <tr>
            <td colspan="3">
                <table>
                    <tbody>
                        <tr>
                            <td>FirstFooter</td>
                        </tr>
                        <tr>
                            <td>Second Footer in a new tr</td>
                        </tr>
                    </tbody>
                </table>
            </td>
        </tr>
    </tfoot>
    
    
    第一页脚
    新tr中的第二个页脚
    

    您也可以在panelGrid中使用outputText以外的标记来获得所需的任何效果(只需确保将它们包装在panelGroup或类似的内容中即可)。

    Richfaces列具有breakBefore属性,允许您执行以下操作:

    <f:facet name="footer">
        <rich:column>
            <h:outputText value="First Footer"/>
        </rich:column>
        <rich:column breakBefore="true">
            <h:outputText value="Second Footer"/>
        </rich:column>
    </f:facet>
    
    
    
    这就是你想要的,但不幸的是没有使用你指定的库


    如果您使用的是Facelets,则始终可以使用ui:repeat构建一个常规表。

    我最终使用的解决方案是一个与t:datatable(datatable的tomahawk扩展)关联的自定义呈现程序

    我只需要重写一个方法

    protected void renderFacet(FacesContext facesContext,   
      ResponseWriter writer, UIComponent component, boolean header)
    
    我在其中查找名为header、header2、header3的facet。。。船头(我一缺一个就不看了),船尾也一样。这让我可以像这样编写代码

    <h:dataTable ... var="row">
      <h:column>
        <f:facet name="header">
         Header
        </f:facet>
        <f:facet name="header2">
         A second Tr with th's
        </f:facet>
        <h:outputText value="#{row.value}"/>
        <f:facet name="footer">
         FirstFooter
        </f:facet>
        <f:facet name="footer2">
         Second Footer in a new tr
        </f:facet>
      </h:column>
    </h:dataTable>
    
    
    标题
    第二个Tr与th的
    第一页脚
    新tr中的第二个页脚
    

    这花了大约一天的时间(还有一些其他扩展,比如允许基于组的colspan)来编写代码和文档,

    我无法使用自定义的呈现程序,所以我在JSF中使用了纯html:

            <t:dataTable value="#{...}" var="...">
    
                 <f:facet name="header">
                     <h:outputText escape="false" value="&lt;/th&gt;&lt;/tr&gt;"/>
                    <tr>
                        <th rowspan="2" class="tableHeaderLightGrey">
                            Zeit
                        </th>
    
                        <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                            Verbrauch
                        </th>
                        <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                            Bandbreite
                        </th>
                        <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                            Auslastung
                        </th>
    
                        <th rowspan="2" class="tableHeaderLightGrey">
                            Gesamtauslastung
                        </th>
                    </tr>
                    <tr>
                       <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                            <th class="tableHeaderLightGrey">
                                #{trafficClass.name}
                            </th>
                        </c:forEach>
    
                        <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                            <th class="tableHeaderLightGrey">
                                #{trafficClass.name}
                            </th>
                        </c:forEach>
    
                        <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                            <th class="tableHeaderLightGrey">
                                #{trafficClass.name}
                            </th>
                        </c:forEach>
                    </tr>
                     <h:outputText escape="false" value="&lt;tr&gt;&lt;th&gt;"/>
    
                 </f:facet>
    
                ... columns ...
    
            </t:dataTable>
    
    
    泽特
    长篇大论
    斑铜矿
    奥斯拉斯顿
    Gesamtausalastong
    #{trafficClass.name}
    #{trafficClass.name}
    #{trafficClass.name}
    ... 柱。。。
    

    标题方面打开一个
    ,我立即用输出文本将其关闭,并在最后再次打开以获得有效的html。通过这种方式,在自定义头前后都会得到一个空的
    ,但在我的情况下,这是可以接受的。

    我希望避免使用自定义组件,因为datatable非常接近我需要的。我已经开始使用CSS来设计一些类似的东西,但它非常粗糙。我希望有人能指出我遗漏了什么。该死的,谢谢你的回答,我希望页脚和主体使用相同的表格。我目前正在使用自定义渲染器来实现这一点。我会在完成后发布详细信息。谢谢你的回答,很遗憾我们没有使用该库。大卫,你能帮我吗
    <h:dataTable ... var="row">
      <h:column>
        <f:facet name="header">
         Header
        </f:facet>
        <f:facet name="header2">
         A second Tr with th's
        </f:facet>
        <h:outputText value="#{row.value}"/>
        <f:facet name="footer">
         FirstFooter
        </f:facet>
        <f:facet name="footer2">
         Second Footer in a new tr
        </f:facet>
      </h:column>
    </h:dataTable>
    
            <t:dataTable value="#{...}" var="...">
    
                 <f:facet name="header">
                     <h:outputText escape="false" value="&lt;/th&gt;&lt;/tr&gt;"/>
                    <tr>
                        <th rowspan="2" class="tableHeaderLightGrey">
                            Zeit
                        </th>
    
                        <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                            Verbrauch
                        </th>
                        <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                            Bandbreite
                        </th>
                        <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                            Auslastung
                        </th>
    
                        <th rowspan="2" class="tableHeaderLightGrey">
                            Gesamtauslastung
                        </th>
                    </tr>
                    <tr>
                       <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                            <th class="tableHeaderLightGrey">
                                #{trafficClass.name}
                            </th>
                        </c:forEach>
    
                        <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                            <th class="tableHeaderLightGrey">
                                #{trafficClass.name}
                            </th>
                        </c:forEach>
    
                        <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                            <th class="tableHeaderLightGrey">
                                #{trafficClass.name}
                            </th>
                        </c:forEach>
                    </tr>
                     <h:outputText escape="false" value="&lt;tr&gt;&lt;th&gt;"/>
    
                 </f:facet>
    
                ... columns ...
    
            </t:dataTable>