0

これが私が試したサンプルコードです

  <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
    pageEncoding="ISO-8859-1"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
<title>Sample1</title>  
</head>  
<body>  
<form action="ActionServlet" method="post">  
<h1>This is inside sample1</h1>  
<input type="submit">  
</form>  
</body>  
</html> 

2012 年 11 月 19 日月曜日 10:58:11 PM に投稿されたプライベート メッセージの引用 これは私が試したサンプル コードです。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
    pageEncoding="ISO-8859-1"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
<title>Sample1</title>  
</head>  
<body>  
<form action="ActionServlet" method="post">  
<h1>This is inside sample1</h1>  
<input type="submit">  
</form>  
</body>  
</html>  

送信をクリックすると、コントロールは ActionServlet という名前のサーブレットに移動します

 public class ActionServlet extends HttpServlet {  
    private static final long serialVersionUID = 1L;  

    /** 
     * Default constructor.  
     */  
    public ActionServlet() {  
        // TODO Auto-generated constructor stub  
    }  

    /** 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // TODO Auto-generated method stub  
        doPost(request, response);  
    }  

    /** 
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // TODO Auto-generated method stub  
        System.out.println("This is inside doPost method for action servlet");  

        System.out.println("Before calling EJB for action servlet");  
        try{  
            Context ic = new InitialContext();  

            //first instance creation  
            StateFulServiceHome home=(StateFulServiceHome)ic.lookup("Stateful1234");  
            StateFulService sample=(StateFulService)home.create();  
            sample.setName("Hello1223");  
            sample.getName();  
            //second instance creation  
            Context ic1 = new InitialContext();  
            StateFulServiceHome home1=(StateFulServiceHome)ic1.lookup("Stateful1234");  
            StateFulService sample1=(StateFulService)home1.create();  
            sample1.getName();  
        }catch (Exception e) {  
            e.printStackTrace();  
        }  
        System.out.println("After calling EJB in action servlet1");  
        request.getRequestDispatcher("Sample2.jsp").forward(request,response);  

    }  

}  

ActionServlet は、ステートフル セッション Bean という名前の Bean でビジネス メソッドを呼び出します。

public class StateFulBean implements SessionBean{  
    String name;  
    public void setName(String name)throws RemoteException{  
        this.name =name;  
    }  
    private SessionContext context;  
    public void ejbActivate() throws EJBException, RemoteException {  
        // TODO Auto-generated method stub  
        System.out.println("*********This is inside ejbActivate method***********");  

    }  

    public void ejbPassivate() throws EJBException, RemoteException {  
        // TODO Auto-generated method stub  
        System.out.println("*********This is inside ejbpassivate method***********");  

    }  

    public void ejbRemove() throws EJBException, RemoteException {  
        // TODO Auto-generated method stub  
        System.out.println("*********This is inside Ejb remove method***********");  

    }  
    public void ejbCreate() throws EJBException,RemoteException{  
        System.out.println("*********This is inside create method***********");  
    }  
    public void setSessionContext(SessionContext ctx) throws EJBException,  
            RemoteException {  
        // TODO Auto-generated method stub  
        context=ctx;  
        System.out.println("*********This is for set session context***********");  
    }  
    public void getName()throws RemoteException{  
        System.out.println("***********This is for start of getting business method*****");  
        System.out.println("The name obtained is"+this.name);  
        System.out.println("***********This is for end of getting business method*****");  
    }  

} 

    public interface StateFulService extends EJBObject {  
    public void getName()throws RemoteException;  
    public void setName(String name)throws RemoteException;  
} 



  public interface StateFulServiceHome extends EJBHome {  
    public StateFulService create() throws RemoteException,CreateException;  
}  

そして最後に私の ejb-jar.xml

 <?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">  
<ejb-jar>  
 <enterprise-beans>  
   <session>  
      <ejb-name>Stateful1234</ejb-name>  
      <home>StateFulServiceHome</home>  
      <remote>StateFulService</remote>  
      <ejb-class>StateFulBean</ejb-class>  
      <session-type>Stateful</session-type>  
      <transaction-type>Container</transaction-type>  
   </session>  
</enterprise-beans>  
</ejb-jar>  

ステートフル セッション Bean とステートレス セッション Bean で同じ出力が得られます。Bean がステートフルとして定義されている場合、2 回目の Bean のルックアップ中に名前を取得する必要があると想定しています。

どこか間違っていたら教えてください。

-シャム

4

1 に答える 1

0

私の仮定は、私のBeanがステートフルとして定義されている場合、2回目のBeanのルックアップ中に名前を取得する必要があるということです。

これは、ステートフルセッションBeanが機能する方法ではありません。ステートフルセッションBeanを使用する場合、プロキシをBeanの「どこかに」格納できます。つまり、コンテナでメソッドを一定期間呼び出さなかった場合に、コンテナがそれをパッシベーションします。Beanが破棄される前であればいつでも、プロキシを介して後続の要求が行われた場合、コンテナはクライアント(この場合はサーブレット)を「記憶」します。言い換えると、後続の呼び出しは会話状態を記憶し、したがってセッションBeanのステートフルな性質を記憶します。HTTPリクエスト間でも、セッションBeanに状態を格納できます(したがって、プロキシへの参照を格納する理由)。

これはルックアップとはほとんど関係がないことに注意してください。あなたのコードでは:

//first instance creation  
StateFulServiceHome home=(StateFulServiceHome)ic.lookup("Stateful1234");  
StateFulService sample=(StateFulService)home.create();  
sample.setName("Hello1223");  
sample.getName();  
//second instance creation  
Context ic1 = new InitialContext();  
StateFulServiceHome home1=(StateFulServiceHome)ic1.lookup("Stateful1234");  
StateFulService sample1=(StateFulService)home1.create();  
sample1.getName();

セッションBeanの2つのインスタンスを作成し、それらに2つのプロキシがあります。2番目のBeanは、明らかに最初のBeanに格納されている状態を認識しません。

HttpSessionステートレスセッションBeanを検討するには、特にオブジェクトにプロキシへの参照を格納することは少し無意味であることを覚えておく必要があります。これは主に、Bean内に格納されている状態が、メソッド呼び出しの間のみ有効であるためです。EJBコンテナはステートレスセッションBeanのプールを管理し、各呼び出しにはプール内の異なる未使用のインスタンスが含まれる場合があります。

PS-EJB 2.xを今学んでいる理由はありますか?古いだけでなく、その一部はJava EE 6アプリでは不要になり、一部(エンティティBean)はJavaEE7でプルーニングされています。

于 2012-11-22T04:41:56.163 に答える