2011-01-23 78 views
3

我遇到了JSF 2.0的HtmlDataTable问题。在我的网页上,我有一个h:dataTable和一些其他内容,只有在用户登录后才能显示。尽管呈现=“false”,但h: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

我有同样的问题。我正在部署GlassFish 3.1。 – Rogach 2011-07-22 16:32:47

回答

1

无法在Tomcat 7.0.5上使用以下SSCCE重现Mojarra 2.0.3上的问题。

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}的结果仅在调用操作阶段期间改变。或者吸气剂被别的东西调用。

+0

你的例子不适用于mojara 2.1.4和mojara 2.0.3和myfaces 2.1.5 这是非常奇怪的 – user1278278 2012-03-19 09:54:36