Хотя rendered="false", содержание a h:dataTable всегда оценивается
У меня проблема с 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 ответ
Невозможно воспроизвести вашу проблему на 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}
изменяется только во время фазы действия invoke. Или геттер называется чем-то другим.