16

それがここでの私の最初の質問であり、私はそれが正しく行われていることを願っています。

Java EEプロジェクトに取り組む必要があるので、始める前に、簡単なことをして、それができるかどうかを確認しようとしています。

ステートフルセッションBeanで立ち往生しています。

質問は次のとおりです。SFSBを使用してユーザーのセッションを追跡するにはどうすればよいですか。私が見たすべての例は、 SFSBHttpSession属性に「入れる」ことになりました。でも理由がわかりません!つまり、Beanがステートフルである場合、それを維持するためにHttpSessionを使用する必要があるのはなぜですか?

適切なSFSBをクライアントに返すEJBコンテナのタスクではありませんか?

簡単なカウンターBeanで試してみました。セッションを使用しない場合、2つの異なるブラウザに同じカウンターBeanがあります(「インクリメント」をクリックすると、両方の値が変更されます)。セッションを使用すると、ブラウザごとに2つの異なる値があります(Firefoxで「インクリメント」をクリックすると、FirefoxのBeanに1つ追加されます)。

しかし、私の先生は、SFSBは「クライアントとの会話状態」を維持していると言ったのに、なぜHttpSessionを使用せずに機能しないのでしょうか。

私が正しく理解していれば、SFSBでHttpSessionを使用することは、代わりにSLSBで使用することと同じではありませんか?

私の質問が明確であり、私の英語がそれほど貧弱ではないことを願っています!

編集:私はログインシステムに取り組んでいます。すべてがうまくいき、ログインが完了すると、ユーザーのデータを表示するプロファイルページに移動します。しかし、ページをリロードするとデータが消えてしまいます!ロギング中にHttpSessionを追加しようとしましたが、このようにすると、ログアウト後もデータが保持されます。

4

2 に答える 2

31

ステートフルセッションBean(SFSB)は、それ自体がWebレイヤーについて何も知らない純粋なビジネスBeanであるため、Web環境でHTTPセッションと組み合わせる必要があります。

従来、EJBは、必須のモジュール(EJBモジュール)内に存在していましたが、必要に応じてWebアーティファクトにアクセスすることさえできませんでした。これは、階層化されたシステムの側面です。詳細については、「 JavaEE6WARとEARでのEJBのパッケージ化」を参照してください。

ステートフルセッションBeanの元のクライアントは、特にSwingデスクトップアプリケーションであり、バイナリプロトコルを介してリモートEJBサーバーと通信していました。Swingアプリケーションは、プロキシ/スタブオブジェクトを介してリモートステートフルセッションBeanへの接続を取得します。このプロキシには、サーバーが特定のSFSBに関連付けることができるある種のIDが埋め込まれています。このプロキシオブジェクトを保持することにより、Swingクライアントはそれを繰り返し呼び出すことができ、それらは同じBeanインスタンスに移動します。したがって、これにより、クライアントとサーバーの間にセッションが作成されます。

Webアプリケーションの場合、ブラウザーがJava EE Webアプリケーションに最初の要求を行うと、サーバーが特定のインスタンスJSESSIONIDに関連付けることができるようになります。HTTPSessionこれを保持することによりJSESSIONID、ブラウザは各フォローアップリクエストを提供でき、これにより同じhttpセッションサーバー側がアクティブ化されます。

したがって、これらの概念は非常に似ていますが、相互に自動的にマップされるわけではありません。

ブラウザはを取得するだけでJSESSIONID、SFSBIDについての知識はありません。Swingアプリケーションとは異なり、ブラウザはJava Beanと直接通信するのではなく、Webページと通信します。

クライアントの要求を特定のステートフルセッションBeanにマッピングするために、EJBコンテナはSFSBプロキシを介して提供されたIDのみを考慮します。呼び出しがWebモジュール内のコードから発生したかどうかを確認できず、HTTPコンテキストに実際にアクセスできない/アクセスできないはずです。

SFSBにアクセスするクライアントコードであるWebレイヤーは、特定のプロキシ参照を「保持」する必要があります。Webレイヤーで何かを保持するということは、通常、それをHTTPセッションに保存することを意味します。

CDIただし、この自動接続を行うことができると呼ばれるブリッジ技術があります。SFSBにCDIで注釈を付け、CDI@SessionScopedを介して(たとえばを使用して@Inject)SFSBへの参照を取得する場合、SFSBを手動でhttpセッションに入れる必要はありません。ただし、舞台裏では、CDIはとにかくそれを正確に実行します。

于 2011-12-16T21:10:33.540 に答える
3

@RequestScopedではなく@SessionScopedを使用してBeanを定義する必要があります(HttpSessionと同等のソリューションを探している場合)

何かのようなもの

@SessionScoped
public class SessionInfo implements Serializable{
   private String name;
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

以下をご覧ください(詳細説明)

http://www.oracle.com/technetwork/articles/java/cdi-javaee-bien-225152.html

于 2013-03-22T21:29:00.047 に答える