Хотя rendered = "false", содержимое ah: dataTable всегда оценивается - PullRequest
3 голосов
/ 23 января 2011

У меня проблема с HtmlDataTable из JSF 2.0.На моей веб-странице есть ах: dataTable и некоторый другой контент, который должен отображаться только после входа пользователя.

Содержимое HtmlDataTable загружается из базы данных.Хотя h: dataTable не отображается, когда пользователь не вошел в систему, содержимое все равно оценивается.

Вот код веб-страницы:

<h:panelGroup rendered="#{userBean.loggedIn}">
    <h:dataTable value="#{xxxBean.allXxx}"
                 var="c">
        <h:column>
            <h:outputText value="#{c.name}"/>
        </h:column>
    </h:dataTable>
    <!-- some other content -->
</h:panelGroup>

В getAllXxx () метод я регистрирую вызов метода.Но также, если h: dataTable (и все остальное содержимое) не отображается, метод getAllXxx () по-прежнему вызывается.

Я попытался использовать c: if вместо h: panelGroup.Это будет работать, но тогда у меня возникают проблемы во время процесса входа в систему, так что это не подходящее решение.

Кто-нибудь знает, как это исправить?Заранее спасибо.

1 Ответ

1 голос
/ 23 января 2011

Невозможно воспроизвести вашу проблему на Mojarra 2.0.3 на Tomcat 7.0.5 со следующим SSCCE .

test.xhtml

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>SO question 4774516</title>
    </h:head>
    <h:body>
        <h:panelGroup rendered="#{param.show}">
            <h:dataTable value="#{bean.list}" var="item">
                <h:column>#{item}</h:column>
            </h:dataTable>
        </h:panelGroup>
    </h:body>  
</html>

com.example.Bean

package com.example;

import java.util.Arrays;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class Bean {

    private List<String> list = Arrays.asList("one", "two", "three");

    public List<String> getList() {
        System.out.println("getList() called");
        return list;
    }

}

Открытие http://localhost:8080/playground/test.jsf не показывает никаких строк стандартного вывода. Открытие http://localhost:8080/playground/test.jsf?show=true показывает их.

Ваша проблема вызвана чем-то другим. Либо это ошибка в вашей реализации JSF, либо вы просто неправильно интерпретировали процедуру. Например, на самом деле может быть запросом обратной передачи, при котором получатель вызывается на этапе применения значений запроса, а результат #{userBean.loggedIn} изменяется только на этапе действия вызова. Или геттер называется чем-то другим.

...