0

私は現在シームプロジェクトに取り組んでおり、問題があります。

新しいページ(MyPage.xhtmlというxhtml)を作成しました。xhtml my codeには、データを表示するためのコマンドボタンとaa:repeaterがあります。

<!-- input fields that are filters for my table shown below -->
<h:commandButton value="View details" action="/MyPage.xhtml"/>

<rich:panel rendered=#{myAction.showDetails}>
    <a:repeat value="#{myAction.findRecords()}" var="record">
        <!-- Some of my code to display a table, nothing fancy -->
    </a:repeat>
</rich:panel>

私の行動ではこれがあります:

@DataModel
private List<MyEntity> records = new ArrayList<MyEntity>();

public List<MyEntity> findRecords() {
    //Do some query
    Query query = entityManager.createNamedQuery("myEntityQuery");
    records = query.getResultList();
    return records;
}

ページの仕組みは次のとおりです。

  1. showDetailsブール値がfalseであるため、rich:panelではなく、入力ボックスとコマンドボタンが表示されます。
  2. showDetailsブール値がtrueに設定されている場合、パネルが表示され、反復によってアクションメソッドfindRecords()が呼び出されます。ここまでは順調ですね!
  3. しかし、アクションボタンをもう一度クリックすると、アクションメソッドfindRecords()が2回実行されます。そして、これが私の問題です...

なぜ2回実行する必要があるのですか?どうすれば1回に制限できますか?今では多くのパフォーマンスが必要です。

Kr、

ダーク

4

2 に答える 2

0

ほとんどの場合、このメソッドは、ビューの再構築中(ビューの復元フェーズ)およびレンダリングの再実行中(レンダリング応答フェーズ)に実行されます。

メソッドがすでに実行されているかどうかをキャッシュするか、ボタンをクリックしたときにのみ実行して、データを配信するための簡単なゲッターを提供してください。

一般的な注意として、データベースクエリなどのコストのかかる操作は、必要な場合(結果をキャッシュする)またはアプリケーションの呼び出しフェーズ(通常はactionまたはを使用するactionListener)でのみ実行する必要があります。

于 2011-09-13T12:42:31.757 に答える
0

代わりにこのようなことを行い、スコープを使用してデータを保存します。このような関数を繰り返し使用すると、繰り返しの各行のメソッドにアクセスします。

<h:commandButton value="View details" action="/MyPage.xhtml"/>

<rich:panel rendered=#{myAction.showDetails}>
    <a:repeat value="#{records}" var="record">
        <!-- Some of my code to display a table, nothing fancy -->
    </a:repeat>
</rich:panel>



@Out
private List<MyEntity> records = new ArrayList<MyEntity>();

@Factory(value="records")
public void findRecords() {
   //Do some query
   Query query = entityManager.createNamedQuery("myEntityQuery");
   records = query.getResultList();
}
于 2011-09-18T19:34:58.037 に答える