0

私は EJB を初めて使用するので、質問でばかげたことを気にしないでください。

誰かがうまくいけば解決できるのではないかと疑っています。

次のステートフル Bean があります。

@Stateful
public class SessionBean implements SessionBeanRemote {

    private int count = 0;

    @Override
    public int getCount(){
    count++;
    return count;

    }

}

そして、これは Bean (サーブレット) を呼び出すクライアントです。

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        InitialContext ctx;
        HttpSession session = null;
        SessionBeanRemote obj;
        try {
            if (session.getAttribute("myBean") == null) {
                ctx = new InitialContext();
                obj = (SessionBeanRemote) ctx.lookup("SessionBean/remote");
                session.setAttribute("myBean", obj);
            } else {
                obj = (SessionBeanRemote) session.getAttribute("myBean");
            }

            System.out.println(obj.getCount());

        } catch (NamingException ex) {
            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

最終的にセッション Bean を保持する必要があるのは HttpSession である場合、なぜ EJB を使用するのか、最初にセッション Bean に格納してからその Bean を格納するのではなく、必要なものをセッションに直接格納しないのはなぜだろうかと考えていました。セッション。

また、@Stateful アノテーションを @Stateless に変更してから、クライアント側で同じコードを実行し、Bean をセッションに保存すると、セッションから同じ Bean を抽出できるので、違いは何ですか?ステートレスとステートフルの間では、新しいルックアップが行われると、同じステートレス Bean が返される可能性があることを知っています。ステートフル Bean と同様に、ルックアップを行うと常に新しいものになります。しかし、それだけですか?

PS 先に述べたように、私は EJB を初めて使用し、すべての疑問は、オンラインのいくつかのチュートリアルと SO に関するいくつかの質問から理解したことに基づいています。また、ローカルで実行しようとしましたが、残念ながら「アプリの読み込み中の例外: EJB コンテナーの初期化エラー」というエラーのため、GlassFish にアプリケーションをデプロイできません。私はそれを調べようとしています。

4

3 に答える 3

1

これらは 2 つの無関係な概念です。

懸念事項を分離する場合は、そうすべきです。次に、HTTP セッションと EJB セッションは、論理的に異なるレイヤーで動作します。http セッションは、個々の Web ブラウザーとユーザーの状態を保持するためのものです。EJB セッションは、エンタープライズ アプリケーション クライアントのコンテキスト内で、トランザクション、スケーラブル、耐障害性、および「透過的に」(場合によってはリモートの) 参照を保持するために使用されます。

EJB を使用して Web コンテンツを提供しているという事実は、同じ EJB を使用して JFC/Swing (または JavaFX) クライアントを提供できないという意味ではありません。

于 2015-01-15T04:14:46.787 に答える
0

EJB セッション

EJB のセッションは、サーバーの JVM で SessionBeans を使用して維持されます。ビジネス ロジック、計算、または動的ページを含めることができ、クライアントが使用できる Bean を設計します。ステートフルとステートレスの 2 つの異なるセッション Bean があります。

ステートフル:単一のクライアント (各 Bean のオブジェクト) に接続されています。そのクライアントの状態を維持し、そのクライアントのみが使用でき、クライアントが「死ぬ」と、セッション Bean は「失われます」。ステートフル Bean のライフサイクルはクライアントにバインドされます。(役割ベースのアプリケーション/システムで非常に役立ちます)

ステートレス:ステートレス セッション Bean は状態を維持せず、2 つの呼び出しが連続して行われたとしても、同じクライアントが同じステートレス Bean を使用するという保証はありません。ステートレス セッション EJB のライフサイクルは、ステートフル セッション EJB のライフサイクルとは少し異なります。各セッションを追跡し、クライアントからの要求をセッション Bean の正しいインスタンスにリダイレクトし、すべてのセッションで同じジョブにリダイレクトする方法を正確に把握するのは、EJB コンテナの責任です。

どこ:

HTTPSession: request オブジェクトを介して取得します。新しい HttpSession オブジェクトを実際にインスタンス化することはできず、ビジネスロジックや計算は含まれていませんが、オブジェクトを格納する場所 (クライアントを出力として、またはサーバーを入力として)、および 2 つ以上のシステムの通信のための場所です。ネットワーク経由で。

于 2015-01-15T04:57:29.820 に答える