1

検索フォーム、結果を表示するための ui:repeat、およびページャーを含む JSF 2.0 facelets ビューがあります。これは、リクエスト Bean によってサポートされています。フォーム ポストは、現在のページと検索条件で構成されます。ページャーには、データセット内の位置に応じて、次のページと前のページへのリンクが表示され、フォームの検索条件を使用したクエリの結果の数が表示されます。したがって、コンポーネント ツリーはリクエスト属性に依存します。たとえば、次のページのリンクで次のようにレンダリングされた属性を使用しています

<h:commandLink action="#{listBean.nextPage}" rendered="#{listBean.hasNextPage}" >...

ユーザーがこのリンクをクリックすると、POST リクエストに現在のページと検索基準が含まれます。問題は、RESTORE_VIEW でコンポーネント ツリーが既にビルドされていることです。現時点では、リクエスト属性がまだ適用されていないため、検索条件がないため、ユーザーが現在どのページにいるのか、データセット内にいくつのレコードがあるのか​​わかりません。したがって、このフェーズでは listBean.hasNextPage は false と評価されます。これにより、CommandLink がコンポーネント ツリーから消えるようです。APPLY_REQUEST_VALUES の後、カウント クエリを作成できます。この情報と現在のページを使用して、listBean.hasNextPage を計算できます。ただし、RENDER_RESPONSEまで再評価されないようです。アクションは INVOKE_APPLICATION でまったく呼び出されません。また、迷惑なエラーはありません。

render を c:if に置き換えると動作します。c:if は RENDER_RESPONSE で 1 回だけ評価され、コンポーネントはデフォルトで最初のフェーズのツリーにあります。(まれな、認められた) ケースでは、実際には次のページが存在しないようにデータセットの数が変更され、それでもアクションが呼び出され、ユーザーが不正なページに移動するため、私はそれがあまり好きではありません。また、Facelets で JSTL タグを使用することは一般的に推奨されないことも理解しています。どうしてか分かりません。

APPLY_REQUEST_VALUES の後まで評価を遅らせるトリックはありますか? 現在のリクエストに依存するプロパティでこの属性を使用する方法が必要です。参考までに、これは JBoss ポートレット ブリッジを使用した Liferay 上のポートレット 2.0 アプリですが、一般的な JSF の問題だと思います。

ご回答ありがとうございます。私はまだJSFを学んでいます-私はページャーを書くのはそれほど難しいことではありません:-)

4

1 に答える 1

2

あなたの説明から、新しいリクエスト (ポストバック) の開始時に新しいデータセットが必要だと思われるようですが、そうではありません。

現在のリクエストをレンダリングするために使用されるデータセットではなく、ユーザーがクリックしたばかりのページをレンダリングするために使用されたデータセットを利用可能にする必要があるRESTORE_VIEWまでの間。INVOKE_APPLICATION

これを実現する最も簡単な方法は、バッキング Bean を作成@ViewScopedし、インスタンス変数を介してデータセットへの参照を保持することです。ポストバック後、JSF は「古い」データセットを自動的に保持し、ライフサイクルの最初の部分でこれを使用します。次に、INVOKE_APPLICATION次のページをロードするためのすべてのデータがあるため、「新しい」データセットとブール値を設定しhasNextPageます。

RENDER_RESPONSEその後、新しい値で発生し、新しいページをレンダリングします。

于 2011-07-25T09:43:03.607 に答える