h: dataTable всегда отображает одну строку;не будет отображать ноль строк - PullRequest
0 голосов
/ 20 февраля 2019

Я работаю в устаревшем веб-приложении 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>

Вот методы в компоненте поддержки, которые дают мне мой список результатов:

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?или у меня что-то неправильно настроено?

Пожалуйста, сообщите,

- август

1 Ответ

0 голосов
/ 20 февраля 2019

Согласно исходному коду 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);
}

Возможны следующие варианты:

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>

Редактировать: рассматриваемое поведение было введено в коммите исправление проблемы # 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

Жаль, что я больше не мог найти эту проблему, , но @Kukeltje сделал!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...