0

次のシナリオに共通のパターンがあるかどうか疑問に思っています。

1 つのリクエスト スコープ Bean でサポートされている 1 つの JSF ページがあるとします。ユーザーがこのページに入ったときに、データベース テーブルからすべてのデータ行を取得したいと考えています。同じ JSF ページには、クエリ基準を提供するためのフォームが含まれています。ユーザーがクエリ条件を指定してフォームを送信すると、結果も同じページに表示したいと考えています。

ページ エントリですべての行をフェッチするのに適した場所は @PostConstruct メソッドです。追加の (挿入された) 要求パラメーターは既にここで利用可能であり、クエリで使用できるため、これを行うのに適した場所です。ただし、フォームから送信されたパラメーターはまだ使用できません。これらはアクション メソッドでアクセスできます。

ユーザーがフォーム条件を使用してデータベース テーブルにクエリを実行すると、この場合、データベースは 2 回クエリされます。リクエスト スコープ Bean が再作成され、すべての行をフェッチする @PostConstruct メソッドが呼び出されてから、ユーザーが必要なものをフェッチするフォーム アクション メソッドが呼び出されます。

もちろん、アクション メソッドでのみ DB クエリを使用して、フォームの結果を別の Bean に基づく別の JSF ページにリダイレクトすることもできます。しかし、1 つの JSF ページと 1 つのマネージド Bean で必要なものだけを取得する方法はありますか?

4

1 に答える 1

3

使用する必要があるのは、ViewScoped マネージド Bean と ajax エンジンの組み合わせです。@PostConstructメソッドを使用して、データ テーブルの最初の行をすべてフェッチすることは正しいです。クエリ フォームからのそれ以降のリクエストによって、このメソッドが再びトリガーされることはありません。代わりに、ajax 呼び出しを行ってデータ テーブル内のエントリを整理し、呼び出しの最後に更新するだけで済みます。次のようになります。

<h:dataTable id="myTable">
   ...
</h:dataTable>

<h:form>
   ...
   <h:commandButton actionListener="#{viewScopedBean.sortEntries}">
       <f:ajax render="myTable" execute="myForm" />
   </h:commandButton>
</h:form>
于 2011-12-23T11:04:49.773 に答える