gpt4 book ai didi

css - h :dataTable always displays one row; won't display zero rows

转载 作者:行者123 更新时间:2023-12-02 00:23:00 25 4
gpt4 key购买 nike

我在遗留 JSF 网络应用程序中工作,我的 h:dataTable 元素给我带来了麻烦。通常,它会准确显示我想要的方式 - 一个标题和几行,所有内容都有适当的填充和边距以及所有内容。

h:datatable displaying three rows correctly

但是,如果我尝试显示一个包含零行的表格(这对我来说是一个有效的用例),JSF 仍然呈现一行,尽管内容为空。

h:dataTable rendering one empty row when it should be rendering zero rows

这是这个 h:dataTable 的源代码:

<h:dataTable styleClass="table" value="#{backingBean.emptyList}" var="result">

<h:column>
<f:facet name="header">First Column</f:facet>
<h:outputText value="#{result}"/>
</h:column>

<h:column>
<f:facet name="header">Second Column</f:facet>
<h:outputText value="#{result}"/>
</h:column>

<h:column>
<f:facet name="header">Third Column</f:facet>
<h:outputText value="#{result}"/>
</h:column>

</h:dataTable>

这是浏览器呈现的内容:

<table class="table">
<thead>
<tr>
<th scope="col">First Column</th>
<th scope="col">Second Column</th>
<th scope="col">Third Column</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>

下面是支持 bean 中的方法,这些方法为我提供了结果列表:

public List<String> getEmptyList() { // incorrectly renders 1 empty row
return Collections.emptyList();
}

public List<String> getThreeRows() { // correctly renders 3 rows
return Arrays.asList(new String[] {"row1", "row2", "row3"});
}

为什么 JSF 呈现这个空行?我会期待 <tbody>只是空的。这是 JSF 的正确行为吗?还是我配置有误?

请指教,

-八月

最佳答案

根据 Mojarra 2.3.8 的源代码,这是一种鼓励行为,TableRenderer(正如其名称所示)负责并 explicitly doing this :

com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(FacesContext, UIComponent):

if(!renderedRow) {
// if no row with data has been rendered, render that empty row in question:
this.renderEmptyTableRow(writer, data);
}

您的选择包括:

1) 向您的数据表添加一个渲染属性:

<h:dataTable value="#{backingBean.entityList}"
rendered="#{not empty backingBean.entityList}" ...>
...
</h:dataTable>
<h:outputText rendered="#{empty backingBean.entityList}"
value="No data to display, sooo sorry :-("/>

2) 覆盖 TableRenderer 以更好地满足您的需求:

package my;

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.component.UIData;
import javax.faces.context.FacesContext;

import com.sun.faces.renderkit.html_basic.TableRenderer;

public class CustomTableRenderer extends TableRenderer {
@Override
public void encodeChildren(final FacesContext context, final UIComponent component) throws IOException {
final UIData data = (UIData) component;
final int rowCount = data.getRowCount();
if (rowCount > 0) {
super.encodeChildren(context, component);
} else {
// do what super.encodeChildren does, but your way ...
}
}
}

遗憾的是,您不能只覆盖 com.sun.faces.renderkit.html_basic.TableRenderer.renderEmptyTableRow(ResponseWriter, UIComponent) 并使其不执行任何操作,因为它是 private .

faces-config.xml 中注册您的自定义渲染器:

<render-kit>
<renderer>
<component-family>javax.faces.Data</component-family>
<renderer-type>javax.faces.Table</renderer-type>
<renderer-class>my.CustomTableRenderer</renderer-class>
</renderer>
</render-kit>

编辑:引入了有问题的行为in a commit修复 issue #1009 with comment :

Fix for issue 1009: Rendered h:dataTable/h:panelGrid without rows/content do not validate against XHTML 1.0 Transitional (and html4)

git-svn-id: https://svn.java.net/svn/mojarra~svn/trunk@7669 761efcf2-d34d-6b61-9145-99dcacc3edf1

太糟糕了,我再也找不到那个问题了,but @Kukeltje did!

关于css - h :dataTable always displays one row; won't display zero rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54790826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com