2011-01-23 74 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