私は 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 にアプリケーションをデプロイできません。私はそれを調べようとしています。