2

JSF /PrimeFacesWebアプリケーションがあります。1ページ<p:dataTable><p:fileDownload>コンポーネントが使用されます。Beanコンストラクターは、DBからデータをロードします。ページが読み込まれると正常に動作します。ダウンロードボタンは、データテーブルの最後の列にあります。このボタンをクリックすると、ファイルダウンロードコントローラーに移動し、すべてが正常に機能します。

しかし、クエリに基づいてデータテーブルの結果をフィルタリングする検索関数をページに追加すると、ダウンロードボタンをクリックしてもダウンロードされたファイルは返されず、ページが更新されるだけです。

これはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

2

valueこれは、の背後にあるモデル<p:dataTable>が、検索結果とともにテーブルを表示する要求とファイルをダウンロードする要求の間で互換性がないように変更された場合に発生する可能性があります。これは、Beanがリクエストスコープの場合に発生する可能性があります。その後、モデルはすべてのHTTPリクエストで新しく作成されます。フォーム送信リクエスト中に、JSFはデータテーブルでアクションを見つけて実行しながら、モデルを反復処理する必要があります。ただし、モデルがフォームが表示されたときと同じモデルを表していない場合、これはすべて失敗します。

Beanをビュースコープに配置すると、(post)コンストラクターでモデルを適切に初期化し、(action)listenerメソッドでモデルを変更し、getterメソッドでは変更しない場合、問題が修正されます。ビュースコープのBeanインスタンスは、同じビューにポストバックしている限り存続するため、リクエストごとにモデルが再初期化されることはありませんが、同じビューのリクエスト間で同じモデルが再利用されます。

または、技術的な理由でBeanをリクエストスコープに保持する必要がある場合は、検索クエリに基づいてモデルを適切に初期化できるように、検索クエリもリクエストパラメータとして渡す必要があります。

于 2012-09-27T11:38:31.297 に答える