- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在遗留 JSF 网络应用程序中工作,我的 h:dataTable 元素给我带来了麻烦。通常,它会准确显示我想要的方式 - 一个标题和几行,所有内容都有适当的填充和边距以及所有内容。
但是,如果我尝试显示一个包含零行的表格(这对我来说是一个有效的用例),JSF 仍然呈现一行,尽管内容为空。
这是这个 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/
关闭。这个问题是off-topic .它目前不接受答案。 想要改进这个问题? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正在在线开发哈佛 CS50 的 PSET3,并且在 CS50 十五场游戏的“获胜”功能方面遇到问题。 该函数适用于 4x4 网格拼图,但不适用于 3x3 对于 3x3 的情况,该函数返回 true
我在 pset 的最后一部分,每当我使用 ./fifteen 3 #include #include #include // b
我正在学习 Javascript 并开始了第一个游戏元素:井字游戏。 我的元素及其代码: Tic Tac Toe Project 如果用户在井字游戏中获胜,我希望能够显示通知。 现在我只想测试我的“获
我刚刚将 MAMP 3 升级到 MAMP 4,而 MySQL 不再启动。 错误日志文件一遍又一遍地写着: 160905 11:22:17 mysqld_safe mysqld restarted 20
我目前正在构建一款非常流行的 Tic-Tac-Toe 游戏的复制品,该游戏使用纯 ruby 构建并经过测试的 TDD 风格。 我遇到的唯一问题是,在我的一生中,我无法弄清楚如何检查玩家何时获胜。我知道
我想构建 OSX 小部件以快速制作基于流数据的可视化仪表板组件的原型(prototype)。我想使用 d3.js 来进行显示,但是我尝试的最基本的事情都遇到了错误,我没有能力/耐心去解析。 在我开始在
我正在尝试在 android 中制作谷歌地图应用程序。我在 SDK 管理器中安装了 Google Play 服务。当我运行该应用程序时,模拟器中出现错误文本: App won't run unless
我的模拟器有问题,它不想启动,它阻止了加载屏幕。 最佳答案 我也遇到了这个问题,解决方法是打开模拟器,然后在顶部菜单中:Simulator > Reset content and setting。 关
我知道我需要一个 target="_blank,但它在我放置它的任何地方都不起作用。请帮忙! 最佳答案 你可以试试这个... 关于javascript - 添加目标 ="_blank to my
我正在用 PHP 使用 mySQL 编写一个模拟选举的网络应用程序。 我有三个表:Candidates、Elections 和 Votes。 Votes 包含 CandidateID、Election
在David Beazley's talk on generators ,他说,作为一个警告: Functions that consume an entire iterable won't term
我正在通过 Android Studio 使用 Android 模拟器来实现一个使用 Google map 的应用程序,但是当我运行该应用程序时,我在模拟器屏幕上收到以下消息: “如果您的设备不支持
我正在 Salesforce 中创建 DocuSign 自定义按钮。在运行 DocuSign 按钮逻辑之前尝试在某些字段值不满足时添加错误。 我想要的条件是,如果机会阶段的选择列表值不等于“已关闭”,
我正在尝试使用 BaseGameUtils 将游戏集成到我的应用程序中。一切看起来都很好,但是当我运行该应用程序时,我收到消息“在您更新 Google Play 服务之前,此应用程序不会运行”,当我单
我正在开发的网站上使用 jplayer html5 媒体播放器,但它无法在 Chrome 上播放某些 mp3。我试过在浏览器的 native 播放器中播放这些 mp3,但两者都无法播放。另一方面,当我
在 Programming Rust 一书中的 References Are Never 部分,他们指出没有与 C 的 NULL 类似的东西。那一点我明白了。然后他们说 Rust won't conv
Auto-Scaling 下的 EC2 可能由于内存问题而无法扩展。我的自动缩放设置会检查 CPU,因为默认情况下无法将内存添加到 cloudwatch 指标中。有什么建议可以让我的服务器在上述情况下
每当我启动 Azure Cloud Shell 时,都会收到此错误: 无法装载 azure 文件共享。您的云驱动器将不可用您的 Cloud Shell session 将是短暂的,因此任何文件或系统更
我在 UITableViewCell 中有一个灵活的可编辑 UITextView。一个简单项目的完整源代码可以在 https://github.com/AlexChekanov/TextViewInT
我是一名优秀的程序员,十分优秀!