ユーザーが項目 (私の場合、彼が取り組んでいるプロジェクト) を選択するドロップダウン メニューがあります。Web ページに表示されるほとんどのデータは、その選択に依存します。そのため、選択したプロジェクトに依存するデータベース クエリを実行する EJB Bean を呼び出すビュー スコープ Bean がいくつかあります。
データベースクエリを減らすためにそのデータのほとんどをキャッシュしたいのですが、ユーザーがプロジェクトを変更すると、変更が発生したことを他の Bean に通知する必要があり、新しいデータをフェッチする必要があります。
だから私はアイデアを持っていた:
projectChangeManager (セッション スコープのマネージド Bean) は、選択されているプロジェクトを保存し、プロジェクトが変更されたときにサブスクライバーに通知します。オブザーバーをクリーンアップする @PreDestory メソッドが実装されています。
プロジェクト オブザーバー (範囲指定されたマネージド Bean を表示)、プロジェクトの選択に基づいて EJB からデータを取得、EJB から新しいデータを取得する onProjectChange() メソッドがあります。projectChangeManager.detach(this) を呼び出して projectChangeManager から登録解除する @PreDestory メソッドが実装されています。
これはJSFでの合理的なアプローチですか? または、オブザーバー パターンを実装しないほうがよいのですが、ユーザーがプロジェクトを変更したときに、キャッシュされたすべてのデータをフェッチしてセッション Bean に保存し、ViewScoped Bean で SessionScoped Bean からそのデータにアクセスするだけですか? それとももっと良い方法がありますか?