我正在使用旧版JSF Web应用程序,而我的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>
Run Code Online (Sandbox Code Playgroud)
这是浏览器呈现的内容:
<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>
Run Code Online (Sandbox Code Playgroud)
以下是支持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"});
}
Run Code Online (Sandbox Code Playgroud)
为什么JSF呈现此空行?我本来希望<tbody>
只是空的。这是JSF的正确行为吗?还是我配置错误?
请指教,
-八月
根据Mojarra 2.3.8的源代码,这是鼓励行为,TableRenderer
(顾名思义)负责并明确地这样做:
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);
}
Run Code Online (Sandbox Code Playgroud)
您的选择包括:
1)向您的dataTable添加一个呈现的属性:
<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 :-("/>
Run Code Online (Sandbox Code Playgroud)
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 ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,您不能仅仅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>
Run Code Online (Sandbox Code Playgroud)
编辑:有问题的行为是在提交中引入的,它修复了带有注释的问题#1009:
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
Run Code Online (Sandbox Code Playgroud)
太糟糕了,我再也找不到该问题了,但是@Kukeltje做到了!
归档时间: |
|
查看次数: |
106 次 |
最近记录: |