2011-09-13 7 views
0

現在、私はseamプロジェクトに取り掛かり、問題があります。シームアクションメソッドは2回実行されますか?

新しいページ(MyPage.xhtmlというxhtml)を作成しました。 XHTMLで 私のコードは、コマンドボタンとAAを見つけることができます。リピータは私のデータを表示するには:私のアクションで

<!-- 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であるため、入力ボックスとコマンドボタンが表示され、リッチ:パネルは表示されません。
  2. showDetailsブール値をtrueに設定するとパネルが表示され、反復処理では自分のアクションメソッドfindRecords()が呼び出されます。ここまでは順調ですね!
  3. しかし、もう一度自分のアクションボタンをクリックすると、アクションメソッドfindRecords()が2回実行されます。そして、ここに私の問題があります...

なぜ2回実行する必要がありますか?どうすれば一度に制限できますか?今、私たちは多くのパフォーマンスを必要とします。

クリプトン、

ディルク

答えて

0

おそらく方法は、ビューの再構築(ビューのリストア・フェーズ)の間と、再びレンダリング中に実行される(応答フェーズをレンダリング)。

メソッドが既に実行されているかどうかをキャッシュするか、ボタンをクリックしてデータを送信するための簡単なゲッターを提供するだけで実行してください。必要なときだけ使用すると、データベース・クエリのような高価な操作を行う必要があり、一般的なノート(キャッシュ結果)として、またはアプリケーションフェーズ中に

(一般actionまたはactionListenerを使用して)

0

私の代わりにこのような何かをして使用しますデータを格納するスコープ。 repeatの中でそのような関数を使用すると、repeatの各行のメソッドにアクセスします。

<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(); 
} 
関連する問題