1

簡単な要件があります。私の列の数<tr:table/>は動的です。someBean.featuresレンダリングされる列の数を決定するオブジェクトのリストがあります。

次の図は、私の要件を明確にする必要があります。

動的列を含むテーブル

提供されたコードでは<c:forEach/>、JSF 環境で使用すると明らかに問題を引き起こす JSTL タグが使用されていました。彼らは次のようなことをしました:

<tr:table value="#{someBean.values}">
    <tr:column headerText="Name">
        <tr:outputText value="#{someBean.name}"/>
    </tr:column>
    <c:forEach var="col" items="#{someBean.features}">
        <tr:column headerText="Column-#{col.id}">
            <tr:outputText value="#{col.name}"/>
        </tr:column>
    </c:forEach>
</tr:table>

しかし、上記のコードをプロファイリングすると、上記someBean.getValuesのタグへの入力であるメソッド<tr:table/>が約 20 回ではなく、数千回呼び出されていました<c:forEach/><tr:*/>レンダリング時間タグも同様です。

だから、これが私がやろうとしていることです(に置き換え<c:forEach/><tr:iterator/>ください:

<tr:table value="#{someBean.values}">
    <tr:column headerText="Name">
        <tr:outputText value="#{someBean.name}"/>
    </tr:column>
    <tr:iterator var="col" value="#{someBean.features}">
        <tr:column headerText="Column-#{col.id}">
            <tr:outputText value="#{col.name}"/>
        </tr:column>
    </tr:iterator>
</tr:table>

しかし、何らかの理由で、<tr:iterator/>が a の中に配置されるのを好まないようで<tr:table/>、決して実行されません。

解決策、ヒント、ガイドラインは大歓迎です。

ああ、私たちは MyFaces Trinidad 1.0.13 実装で JSF 1.1 を使用しています。

ありがとう。

4

2 に答える 2

1

私が考える唯一の方法(あなたはすでに知っているかもしれません;))は、extend UIXTable<tr:columns items="#{columns}">を記述し、列配列を処理してhtml列に拡張するカスタムタグハンドラーを提供することです。

于 2011-07-02T20:27:39.310 に答える
1

getter 呼び出しは、特に安価な操作です。ゲッターが意図したとおりに仕事をし、 bean プロパティを返すだけであれば、これは実際には害にはなりません。

この懸念から、リクエスト時に 1 回だけ呼び出されるコンストラクターやイベント メソッドではなく、getter メソッド内で高価なビジネス ジョブを誤って実行しているという印象を受けます。それに応じて本当に修正する必要があります。ゲッターはビジネス ジョブを実行しないか、せいぜい遅延読み込みのみを実行する必要があります。

機能する理由と<c:forEach>機能し<tr:iterator>ない理由については、JSTL タグがビューのレンダリング時ではなくビューのビルド時に実行され、コンポーネントの唯一の有効な子がUIDataコンポーネントであるためUIColumnです。基本的に、ビューが構築されると、すべての JSTL タグが実行され、最終的にすべて<tr:column>が適切な場所にある純粋な JSF ビューになります。ビューがレンダリングされると、すべての JSF タグが実行され、ブラウザーに送信できる純粋な HTML の結果が得られます。

以下も参照してください。

于 2011-06-11T16:32:02.320 に答える