0

私は次のJSF(1.2)を持っています:

<h:outputText rendered="#{fn:length(testBeanToDelete.names) gt 0}">
    <t:dataList value="#{testBeanToDelete.names}" var="name" rowIndexVar="index">
        <p>#{name}</p>
    </t:dataList>
</h:outputText>
<h:form id="test_form">
    <h:commandLink value="Filter" actionListener="#{testBeanToDelete.filter}"/>
</h:form>

私の問題は、フィルターボタンをクリックすると、イベントメソッドフィルターの前にgetNames()メソッドが呼び出されることです。getNames()メソッドで、name == nullかどうかを確認してから、リストを作成します。

ただし、新しいフィルターされたリストを作成するためにフィルターメソッドが呼び出された場合(基本的には、DBから異なるフィルターされた値を取得したい)が必要ですが、DBを2回呼び出したくありません。

どうすればこの目標を達成できますか?

前もって感謝します。

4

1 に答える 1

0

JSF ライフサイクルで最初に行われるのは、ビューの復元フェーズでページを再構築することです。ここでのポイントは、最後のリクエストのときと同じようにページを再構築することです。ここで getNames() が呼び出されます。

その後、応答のレンダリング段階で JSF ライフサイクルの最後に、新しいページの値に対して getNames() が再度呼び出されます。

ビューの復元フェーズで DB 呼び出しを回避する唯一の方法は、最後のリクエストで返された dataList のコレクションを保存することです。バッキング Bean は、リクエストよりも高いスコープを持つ必要があります。そうしないと、リクエスト間で何らかの方法でそれらを保存する必要があります。これは些細なことではなく、処理を誤るとサーバーの RAM が過剰に使用されるという問題が発生する可能性があるため、注意してください。

トリニダードを使用していますか? その場合、ページ フロー スコープでデータリストのコレクションを保存することで解決できます。それでも、そのデータベース呼び出しを回避する価値があるかどうかを考えてみてください。

于 2012-05-07T16:17:19.407 に答える