1

こんにちは、インターフェイスを作成しました

@Remote
public interface MathInter{
    public int add(int x, int y);
    public int  showResult();
}

とクラス

@Stateful(mappedName="test")
public class MathImp implements MathInter{
    public int result;
    public int showResult()
    {
        return result;
    }
    @Override
    public int add(int x, int y) {
        result = x + y;
        return x+y;
    }

}

client.jspで使用しました

<%!
    @EJB(mappedName="abc")
    MathInter m;
%>

<%
    out.write("previous result was "+m.showResult());
    out.write("result is "+m.add((int)(Math.random()*100), (int)(Math.random()*100)));
%>

問題は、LAN で、IP アドレスが 192.168.1.4 と 192.168.1.2 の 2 台のコンピューターがあることです。サーバーは192.168.1.4で始まり、サーバーからclient.jspページにアクセスするとMathImpの新しいオブジェクトが作成され、別のコンプ経由でアクセスすると同じオブジェクトが使用されているようです

新しいクライアントへの新しいリクエストでは、新しいオブジェクトが作成される必要はありませんか?

4

1 に答える 1

1

簡単に言うと、1 つの JSP -> 対応するサーブレットの 1 つのインスタンス -> 1 回注入された EJB -> どのクライアントでも同じインスタンスがすべてのリクエスト間で共有されます。

より長い説明:

いいえ、コンテナが新しいクライアントごとに新しいインスタンスを作成する必要はありません。ただし、(あなたの場合のように) 依存性注入ごとに、および JNDI ルックアップ コンテナーごとに、ステートフル セッション Bean の新しいインスタンスを作成する必要があります。

あなたの場合、注入は一度だけ行われます。これは、コンテナーが JSP をサーブレットにコンパイルし、すべての要求を処理するサーブレットのインスタンスが 1 つしかないためです (したがって、そのサーブレットのフィールドへの ejbs の注入は 1 回だけです)。そのため、MathInter の同じインスタンスがすべてのリクエスト間で共有されます。

クライアントごとのインスタンスが必要な場合 (ステートフル セッション Bean の場合のように)、それらをサーブレットに注入するのではなく、単にそれらをルックアップして HttpSession への参照を保存するだけです。

于 2012-05-29T18:45:24.287 に答える