9

JSF 2.0 では、ビュー スコープの最も明白な使用例は、潜在的に複数の AJAX ポストバックを含む単一のページです。JSF マネージド Bean の代わりに CDI を使用すると、ビュー スコープがなくなるため、独自に実装するか、(おそらくバグが多い) サード パーティの実装を使用するか、会話スコープを使用する必要があります。

私の質問: 会話スコープは、典型的な AJAX の状況でビュー スコープに代わる価値のあるものですか? ビュー スコープと同様に、セッションごとに複数のインスタンスを許可しますか? 落とし穴は何ですか?

ユーザーがページから離れたときに会話スコープが自動的に削除されず、タイムアウト後に削除されるという落とし穴の 1 つを認識しています。しかし、会話がタイムアウトする前にユーザーがそのページに戻るとどうなるかはわかりません。

アップデート

会話スコープは、セッションごとに複数のインスタンスを実際にサポートしています。この本には多くのことが記載されており、ch のコードを使用してこれを確認できました。2.

4

1 に答える 1

4

どの@ConversationScopedCDI Bean にも、次のフィールドが必要です。

@Inject
private Conversation conversation; 

会話を開始するときはいつでも、Bean が状態にあるかどうかを確認する必要がありますtransient。それ以外の場合は、IllegalStateExceptionスローされます。次のようになります。

public void beginConversation() {
  if (conversation.isTransient()) conversation.begin();
}

これにより、Bean はlong-running状態になります。したがって、ユーザーがページから離れて後で戻ってきた場合、会話がタイムアウトしたかどうかをいつでも確認して、離れたページに移動させることができます。

その上、しばらくの間、@ViewScoped ManagedBeanをCDI Beanと一緒に使用しています。CDI BeanMangedBean@Injectに注入するために引き続き使用できます。私はあなたが逆にできるとは思わない。とにかく、これが後で悪いことが起こるかどうかはわかりません。しかし、これまでのところ、問題に遭遇したことはありません。本当に を使いたい場合は 、試してみるとよいと思います:P.@ViewScoped

アップデート:

会話スコープは、典型的な AJAX の状況でビュー スコープに代わる価値のあるものですか?

@ConversationScopedを完全に置き換えることはできないと思います@ViewScoped

ビュー スコープと同様に、セッションごとに複数のインスタンスを許可しますか?

いいえ、セッションごとに複数のインスタンスを持つことはできません。前述したように、古い会話がまだlong-running状態にある間に新しい会話を開始すると、IllegalStateException.

落とし穴は何ですか?

@ViewScopedoverの主な利点の 1 つは@RequestScoped、ユーザーが同じビューにフォームを送信するたびにデータを再開始する必要がないことです。ただし、 では@ConversationScoped、この利点が過剰に使用されています。この問題は を使用する場合ほど深刻ではありませんが、 Bean が存続@SessionScopedする限り、開始されたデータを保持する必要があります。@ConversationScoped会話が長くなればなるほど、より多くのデータを保持する必要があります。

于 2012-01-01T13:16:53.643 に答える