2013-05-15 66 views
1

我讀過關於這個主題的所有答案(不僅僅是),但是這些都不能解決我的問題。 我有數據表:JSF + primefaces調用getter方式的次數太多了

<p:dataTable 
       value="#{reportBean.reportData.rows}" 
       var="row" 
       styleClass="listBlock dataTableOverflowAuto fullScreenTable" 
       rendered="#{!reportBean.reportData.grouped}"> 
       <f:facet name="header"> 
        #{msg['report.table.header']} 
       </f:facet> 

       <p:column> 
        #{row.integrationName} 
       </p:column> 

       <p:column> 
        #{row.integrationId} 
       </p:column> 

       <p:column> 
        #{row.service} 
       </p:column> 

       <p:columns value="#{reportBean.reportData.columns}" 
          var="column"> 
        <f:facet name="header"> 
         #{column} 
        </f:facet> 
        <h:outputText value="#{row.getData(column)}" escape="false" /> 
       </p:columns> 

getReportData()上reportBean很簡單(沒有計算):

public ReportDataInterface getReportData() { 
     return reportData; 
} 

,返回的數據是:

public class NoneGroupedReportData implements ReportDataInterface { 
    private int counter = 0; 
    Logger logger = LoggerFactory.getLogger(getClass()); 
    private List<String> columns = new LinkedList<String>(); 
    public void addRow(Row row) { 
     addColumns(row); 
    } 

    public List<String> getColumns() { 
     counter++; 
     logger.debug("getColumns called {} times", counter); 
     return columns; 
    } 

.... 

,其結果是

2013年5月15日0 7:38:07405()DEBUG NoneGroupedReportData - getColumns 稱爲21600倍

對於與dataTable的30〜行和10列。

我知道爲什麼JSF調用干將多次,但幾乎22K,爲什麼呢?當我需要更多結果(> 1000)時,它不會在5分鐘內渲染,因爲它無休止地調用這個吸氣劑。 問題在哪裏,我怎樣才能達到getColumns()被調用的每行最多5〜10次的狀態?

我一直在使用JSTLÇ嘗試:設置「緩存」,但沒有任何結果(http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/

編輯:我的猜測是,吸呼不是「錯誤」,但簽署,我在錯誤的方式使用的dataTable 。

+3

你沒有在這裏給出完整的故事。 'NoneGroupedReportData'實例在哪裏? – kolossus

+0

它是視圖範圍。 NoneGroupedReportData的實例是託管bean的屬性。 – DominikM

+0

您引用reportData至少3次,它們可能是不必要的。沒必要單獨獲取行和列。 – erencan

回答

5

的問題是,要訪問的相同的數據結構兩次,

N: <p:dataTable value="#{reportBean.reportData.rows}" ... 

然後INSIDE同一號碼:dataTable中使用的是

M: <p:columns value="#{reportBean.reportData.columns}" ... 

這導致一個Ñ * M產品最後給出您的21600次,因爲您正在訪問相同數據結構兩個嵌套標記 ...

不清楚你想要構建什麼樣的數據表,但我認爲你應該重組你的數據結構。

更簡單的解決方案,如果你正試圖把多個值一個單個列中的每一行將改變M至:

M: <p:columns value="#{rows.columns}" ... 

但是,這將涉及到更改數據結構,把你的組件分成您的組件。

Regards,