0

JSF、EJB、およびJPAでWebアプリケーションを作成する際に、イデオロギー的な問題が発生します。

状況の例は次のとおりです。

管理者は、ユーザーのリストをデータテーブルに表示します。次に、user1を選択すると、新しいユーザーエディションサイトに移動します。この問題は、2番目のカードまたはウィンドウを開いて、同じセッションで同時編集するuser2を選択しようとした場合に発生します。エディション後にuser1データを保存しようとすると、エンドポイントでuser2によって上書きされているため、保存できません。

データの保存:プロジェクトのビュー部分[下の図を参照]にデータを保存していないため、データを表示した後、マネージドBeanが破棄されています。したがって、コントローラーの部分では、現在選択されているユーザーをエンドポイント[ステートフルEJB Bean]のフィールドとして保持することにしました。これは、セッションスコープのマネージドBeanによって保持されるため、セッションに対して一定です。コレクションをエンドポイントまたはセッションスコープのマネージドBeanに保存しないでください。

問題:特定のケースは状況の概要です。このアプリケーションでは、セッション中に同じタイプの複数のエンティティを編集します。

質問:ユーザー/管理者の現在の選択をどこにどのように保存する必要がありますか。これにより、選択したエンティティのエディションが作成されます。

データをビューに保存し、リクエストスコープの部分を使用すると、同じセッションで複数のエンティティを制御できましたが、適切なアプローチではないと思います。ただし、これをコントローラーパーツに格納すると、同じセッションで編集される同じタイプの1つのエンティティが制限されます。

ここの図:http ://i.stack.imgur.com/9PyYr.jpg

4

2 に答える 2

2

したがって、うまくいけば学んだ教訓は、データの編集やページ間でのデータの転送にセッションスコープを使用しないことです。

ここで行うべきことは、編集するユーザーのIDのみを使用してGETリクエストを使用することです。次に、編集ページで、単一のビュースコープのバッキングBeanを使用します。

このパターンを使用すると、追加の拡張機能は必要ありません。残念ながら、デフォルトの@ViewScopedはCDI Beanで機能しないため、CDIBeanをバッキングBeanとして使用する場合にのみCODIが必要になります。CODIは、CDIで動作するバージョンを提供します。

ただし、JSFマネージドBeanを使用する場合は、上記のパターンに従ってください。問題はありません。

于 2012-07-28T15:14:22.573 に答える
1

Java EEサーバー(Glassfish 3.1)を使用しているため、JSFとは異なるスコープをサポートするCDIを使用できるという利点があります。CODIと呼ばれるCDI拡張機能があり、いわゆる「ウィンドウスコープ」を提供します。これにより、ブラウザウィンドウごとにBeanのスコープを設定して、問題を解決できます。ウィンドウスコープの詳細については、こちらをご覧ください

もう1つのオプションは、独自のウィンドウスコープもサポートするIceFacesJSFライブラリを使用することです。詳細については、こちらをご覧ください

于 2012-07-27T14:20:19.717 に答える