【问题标题】:Multiple Footer Rows in a JSF dataTableJSF 数据表中的多个页脚行
【发布时间】:2010-10-19 14:34:54
【问题描述】:

我想知道是否有任何方法可以在 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>

任何想法如何最好地做到这一点? 谢谢。

编辑: 如果我可以避免使用自定义控件/自定义渲染器,那就太好了

【问题讨论】:

    标签: java jsf datatable


    【解决方案1】:

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

    想到今年春天的两种方法:

    1. 只需在页脚中添加 panelGrid 并使用样式表来获得所需的外观。
    2. 创建一个custom componentrenders 是您想要的标记。

    【讨论】:

    • 我希望避免使用自定义组件,因为数据表非常接近我的需要。我已经开始使用 CSS 来设置类似的样式,但它非常 hacky。我希望有人能指出我遗漏的东西。该死。
    【解决方案2】:

    正如 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 或类似的东西中)。

    【讨论】:

    • 感谢您的回答,我希望页脚使用与主体相同的表格。我目前正在开发一个自定义渲染器来做到这一点。完成后我会发布详细信息。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的回答,很遗憾我们没有使用该库。
    【解决方案4】:

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

    public class HtmlMultiHeadTableRenderer extends HtmlTableRenderer
    

    我只需要重写一个方法

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

    我在其中查找名称为 header、header2、header3 ... headerN 的构面(一旦缺少一个我就停止查找),并且与页脚相同。这让我可以做类似的代码

    <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)来编码和记录,

    【讨论】:

    【解决方案5】:

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

    header facet 打开一个&lt;tr&gt;&lt;th&gt;,我立即用输出文本将其关闭,并在最后再次打开以获取有效的html。这样,您将在自定义标头之前和之后得到一个空的&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;,但在我的情况下这是可以接受的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2014-01-06
      • 2014-10-14
      相关资源
      最近更新 更多