1
            <ui:repeat  value="#{bean.allResults}" var="result">
                <ui:fragment rendered="#{result.condition1}">
                    <ui:include src="/item1.xhtml">
                </ui:fragment>
                <ui:fragment rendered="#{result.condition2}">
                    <ui:include src="/item2.xhtml">
                </ui:fragment>
                <ui:fragment rendered="#{result.condition3}">
                    <ui:include src="/item3.xhtml">
                </ui:fragment>
                <ui:fragment rendered="#{result.condition4}">
                    <ui:include src="/item4.xhtml">
                </ui:fragment>
            </ui:repeat>

JSF / JSTL /Facelets
を使用する際のベストプラクティスに関していくつか質問があります。上記のコードのようなJSFページがあります。このループが10個の結果を返し、各結果に対して1つの条件のみがtrueに評価されると仮定します。したがって、ユーザーは、ロードされるとhtmlページに10件の結果が表示されます。

  1. HTMLで表示されるアイテムは10個だけですが、コンポーネントツリーには40個のアイテムが含まれますが、falseと評価されたアイテムが含まれます。上記の動作は正確ですか?

  2. 1が真であり、コンポーネントツリーに多くの非表示のコンポーネントが含まれている可能性がある場合、パフォーマンスの問題は、40ではなく400のアイテムだったとしましょう。

  3. FaceletesまたはJSFには、c:ifのように動作し、ツリーにコンポーネントを含めない条件付きタグハンドラーがありますか?または、最後の手段としてc:ifを使用する必要がありますか?JSTLの使用を避けようとしています。

ありがとう。

4

1 に答える 1

3

htmlには10個のアイテムしか表示されませんが、コンポーネントツリーには40個のアイテムが含まれます

レンダリングがfalseであっても、含まれているコンポーネントはコンポーネントツリーの一部になるというのは正しいことです。ただし、<ui:repeat>コンポーネントツリーのコンテンツを複製することはありませんが、JSFライフサイクルの各フェーズで子コンポーネントを繰り返し処理します。したがって、コンポーネントツリーには4つの「アイテム」コンポーネントのみが含まれます。

1が真であり、コンポーネントツリーに多くの非表示のコンポーネントが含まれている可能性がある場合、パフォーマンスの問題は、40ではなく400のアイテムだったとしましょう。

関連する回答に記載されているように、それは可能ですが、目立つようになるには多くのコンポーネントが必要です。(私はこれについてしばらく前にベンチマークを行いました。手元に数値はありませんが、IIRCは、600のレンダリングされていないコンポーネントを追加すると、Webアプリケーションの応答時間に300ミリ秒を追加しました。)

c:ifのように動作し、ツリーにコンポーネントを含めない条件付きタグハンドラーはありますか?または、最後の手段としてc:ifを使用する必要がありますか?

値式を持つTagHandlerにはさまざまな制限があるため、可能な限りそれらを避けておくことをお勧めします。しかし、はい、実際にコンポーネントツリーに含まれないようにするために、<c:if>私も使用しています。

于 2011-12-02T22:19:37.263 に答える