1

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 () DEBUG NoneGroupedReportData - getColumns が 21600 回呼び出されました

~30 行と 10 列の dataTable の場合。

JSF がゲッターを何度も呼び出す理由はわかっていますが、ほぼ 22k の理由は何ですか? より多くの結果 (>1000) が必要な場合、このゲッターを際限なく呼び出すため、5 分でレンダリングされません。問題はどこにあり、行ごとに getColumns() が最大 5 ~ 10 回呼び出される状態をどのように達成できますか?

jstl c:set "caching" を使用してみましたが、結果はありません ( http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/ )

編集:ゲッターの呼び出しは「間違っている」のではなく、 dataTable を間違った方法で使用していることを示していると思います。

4

1 に答える 1

5

問題は、同じデータ構造に 2 回アクセスしていることです。

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

そして、使用している同じ p:dataTable の内側

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

これにより、 21600回のネストされたタグで同じデータ構造にアクセスしているため、最後にN * M積が発生します...

構築しようとしているデータテーブルの種類は明確ではありませんが、データ構造を再編成する必要があると思います。

各行の1つの列内に複数の値を入れようとしている場合のより簡単な解決策は、Mを次のように変更します。

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

ただし、データ構造を変更して、コンポーネントをコンポーネントに配置する必要があります。

よろしく、

于 2013-05-15T12:09:29.193 に答える