JSF dataTable中的多个页脚行

时间:2009-04-15 14:03:57

标签: java jsf datatable

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

<h:dataTable ... var="row">
  <h:column>
    <f:facet name="header">
     Header
    </f:facet>
    <h:outputText value="#{row.value}"/>
    <f:facet name="footer">
     FirstFooter
    </f:facet>
    <f:facet name="footer">
     Second Footer in a new tr
    </f:facet>
  </h:column>
</h:dataTable>

结果是这样的事情

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

任何想法如何最好地实现这一目标? 感谢。

编辑: 如果我可以避免使用自定义控件/自定义渲染器

那就太棒了

5 个答案:

答案 0 :(得分:5)

我最终使用的解决方案是与t:datatable相关联的自定义渲染器(数据表的tomahawk扩展名)

public class HtmlMultiHeadTableRenderer extends HtmlTableRenderer

我只需要覆盖一个方法

protected void renderFacet(FacesContext facesContext,   
  ResponseWriter writer, UIComponent component, boolean header)

在其中我查找了具有名称标题,标题2,标题3 ...标题的小平面(我只有一个缺失时我停止查看)和页脚相同。这让我可以做像

这样的代码
<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>

大约需要一天(还有一些其他扩展,例如允许基于组的colspans)来编码和记录,

答案 1 :(得分:3)

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

你可以在panelGrid中使用除outputText之外的标签来获得你正在寻找的任何效果(只需确保将它们包装在panelGroup或类似的东西中)。

答案 2 :(得分:2)

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 构建常规表。

答案 3 :(得分:1)

(Facets必须具有唯一的名称(它们存储在facet map中)。)

有两种方法可以解决这个问题:

  1. 只需在页脚中添加panelGrid并使用样式表即可获得所需的外观。
  2. 创建custom component renders所需的标记。

答案 4 :(得分:0)

我无法使用自定义渲染器,因此我使用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>

标题构面打开<tr><th>,我用outpuut文本立即打开,然后在最后再打开以获得有效的html。你会在自定义标题之前和之后得到一个空的<tr><th></th></tr>,但在我的情况下这是可以接受的。