[英]JSF + primefaces calling getter way too much times
我在SO上閱讀了有關此主題的所有答案(不僅如此),但是這些都不能解決我的問題。 我有數據表:
<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>
reportBean上的getReportData()非常簡單(無需計算):
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-05-15 07:38:07,405()調試NoneGroupedReportData-調用21600次的getColumns
對於具有約30行和10列的dataTable。
我知道為什么JSF會多次調用getter,但是幾乎是22k,為什么? 當我需要更多結果(> 1000)時,它將不會在5分鍾內呈現,因為它不斷地調用此getter。 問題出在哪里,如何達到每行最多5到10次調用getColumns()的狀態?
我嘗試使用jstl c:set“ caching”,但沒有任何結果( http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/ )
編輯:我的猜測是,getter調用不是“錯誤”,而是表明我以錯誤的方式使用了dataTable。
問題是您要訪問兩次相同的數據結構,
N: <p:dataTable value="#{reportBean.reportData.rows}" ...
然后里面的相同號碼:dataTable的您正在使用
M: <p:columns value="#{reportBean.reportData.columns}" ...
這會導致N * M產品的末尾給出21600次,因為您正在兩個嵌套標簽中訪問相同的數據結構...
目前尚不清楚您要構建哪種數據表,但是我認為您應該重新組織數據結構。
如果您試圖將多個值放在每一行的單個列中,則較簡單的解決方案會將M更改為:
M: <p:columns value="#{rows.columns}" ...
但這將涉及更改數據結構,以將列組件放入行組件中。
問候,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.