2011-12-23 3 views
0

次のシナリオで共通のパターンがあるのだろうかと思います。@PostConstructとcommandButton/commandLinkのパラメータの場合

ひとつのリクエストスコープ付きBeanで1つのJSFページをサポートしています。 ユーザーがこのページを入力すると、データベーステーブルからすべてのデータ行をフェッチしたいと思う。 同じJSFページには、問合せ基準を提供するためのフォームが含まれています。ユーザーが照会条件を指定してフォームを送信すると、その結果を同じページにも表示したいと考えています。

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

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

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

答えて

2

使用する必要があるのは、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> 
+0

ありがとう!それは仕事をするはずです。 ViewScoped Beanの唯一の問題は、私が気づいている限り、GETリクエストパラメータを使用することができないことです。しかし、commandLink/Button setPropertyActionListenerを使用して、すべての追加パラメータを渡すことは可能です。 – Dzik

+1

あなたはGETパラメータを ''で使うことができます。これはGETパラメータを扱う '@ ManagedProperty'よりはるかに良いです。 http://stackoverflow.com/questions/4888942/viewparam-vs-managedpropertyvalue-param-idも参照してください。 – BalusC

関連する問題