posts - 25, comments - 11, trackbacks - 0, articles - 37

          EJB入門文章

          Posted on 2008-11-01 02:58 J2EE Home工作室 閱讀(118) 評論(0)  編輯  收藏 所屬分類: EJB

          一.Enterprise Beans
          在EJB(Enterprise Java Beans)中定義了兩種不同類別的Enterprise Bean :
          *會話 Bean (Session Bean)
          *實體Bean (Entity Bean)

          1. 會話 Bean (Session Bean)
          會話 Bean 是調用它的客戶端代碼要完成的工作。當客戶端與服務器建立聯系,那么一個會話 Bean 就建立起來了。根據會話 Bean 的狀態不同有分為:
          A. 狀態會話 Bean (Stateful Session Bean)
          B. 無狀態會話 Bean (Stateless Session Bean)
          1.1 狀態會話 Bean (Stateful Session Bean)
          當客戶機和服務器建立連接之后,狀態會話 Bean (Stateful Session Bean) 將一直在客戶機和服務器之間保持著用戶的某個狀態。例如:用戶使用銀行的ATM時,經過驗證之后,用戶可以連續執行多次操作,在這個過程當中,用戶的合法狀態將一直被保留,直到她將信用卡取出,結束這次操作。這時,狀態會話 Bean (Stateful Session Bean) 也就被銷毀。
          1.2無狀態會話 Bean (Stateless Session Bean)
          當客戶機和服務器建立連接之后,無狀態會話 Bean (Stateless Session Bean)處理單一的用戶請求或商務過程。無狀態會話 Bean (Stateless Session Bean)不需要從以前的請求中提取任何狀態。例如,用戶的用戶密碼確認。用戶輸入密碼后,發送請求。組件返回真或假來確認用戶,一旦過程完成,無狀態會話 Bean (Stateless Session Bean) 也宣告結束。
          2. 實體Bean (Entity Bean)
          實體Bean (Entity Bean)只是數據模型,它不包括商務邏輯。實體Bean (Entity Bean)可以將關系/對象數據庫的數據映射到內存中供其它組件使用。實體Bean (Entity Bean)是一直存在的,而且具有很高的容錯性能。實體Bean (Entity Bean)能供允許多用戶同時訪問。

          二. 會話 Bean (Session Bean)
          Ejb的執行過程是被放在一個EJB容器中進行的,所以客戶端不會直接調用我們寫好的Enterprise Bean ,而是調用EJB容器生成的一個EJBObject (EJB對象)來實現。那么,我們在編寫服務器端的Enterprise Bean 時,就要考慮這點。既然客戶端不能直接訪問,就由EJBObject來代勞,所以在編寫服務器端時,就要編寫服務器端的一個接口(Remote)用來與客戶機聯系,實力化EJBObject。要生成EJBObject 就要調有Home 接口,來建立這個實力。


          以下是會話 Bean 的代碼分析:
          A.Enterprise Bean 類:sailorsy.class
          1.setSessionContext(SessionContext ctx)方法
          它是EJB容器和Enterprise Bean互相作用的關口。

           

           import java.rmi.*;import javax.ejb.*;public class sailorsy implements SessionBean{private SessionContext ctx=null;public voic setSessionContext(SessionContext ctx){this.ctx=ctx;}//setSessionContext}//class sailorsy
           

          2.ejbCreate(…)方法
          它可以初始化Enterprise Bean ,可以定義不同的ejbCreate(…)方法,每個方法所帶的參數不同。但是,必許要存在至少一種。

           

             import java.rmi.*;  import javax.ejb.*;public class sailorsy implements SessionBean{private SessionContext ctx=null;public voic setSessionContext(SessionContext ctx){this.ctx=ctx;}//setSessionContext        public void ejbCreate() {        }//ejbCreate}//class sailorsy
           

          3.ejbPassivate()方法
          如果初始化的Enterprise Bean 過多,EJB容器將其中的一些掛起(passivate),釋放他們所占用的空間。

           

             import java.rmi.*;  import javax.ejb.*;public class sailorsy implements SessionBean{private SessionContext ctx=null;public voic setSessionContext(SessionContext ctx){this.ctx=ctx;}//setSessionContext        public void ejbCreate() {        }//ejbCreate        public void ejbPassivate() {        }//ejbPassivate}//class sailorsy
           

          4.ejbActivate()方法
          和ejbPassivate正好相反,它將被掛起的Bean從新調回。

           

           import java.rmi.*;  import javax.ejb.*;public class sailorsy implements SessionBean{private SessionContext ctx=null;public voic setSessionContext(SessionContext ctx){this.ctx=ctx;}//setSessionContext        public void ejbCreate() {        }//ejbCreate        public void ejbPassivate() {        }//ejbPassivate                public void ejbActivate() {        }//ejbActivate}//class sailorsy
           

          5.ejbRemove()方法
          它可以清除EJB容器中的Bean。

           

             import java.rmi.*;  import javax.ejb.*;public class sailorsy implements SessionBean{private SessionContext ctx=null;public voic setSessionContext(SessionContext ctx){this.ctx=ctx;}//setSessionContext        public void ejbCreate() {        }//ejbCreate        public void ejbPassivate() {        }//ejbPassivate                public void ejbActivate() {        }//ejbActivate        public void ejbRemove() {        }//ejbRemove                public String showname(){          return "Hello,my name is sailorsy";        }//自己的商務方法}//class sailorsy
           

          以上這些是EJB必需的回調方法,我們可以在里面加入自己的方法,加入自己的商務邏輯。
          B.Home 接口: sailorsyHome

           

              import java.rmi.*;import javax.ejb.*;public interface sailorsyHome extends EJBHome {  public sailorsyRemote create() throws RemoteException, CreateException;}C. Remote接口:sailorsyRemoteimport java.rmi.*;import javax.ejb.*;public interface sailorsyRemote extends EJBObject {  public java.lang.String showname() throws RemoteException;}
           

          三.調用會話 Bean:sailorsyTestClient1

           

                   import javax.naming.*;import javax.ejb.*;import javax.rmi.PortableRemoteObject;import java.rmi.*;public class sailorsyTestClient1 {  private sailorsyHome sailorsyHomeObject = null;  //Construct the EJB test client  public sailorsyTestClient1() {    try {      //以下是客戶端使用JNDI定位Home對象。      Context ctx = new InitialContext();      //look up jndi name      Object ref = ctx.lookup("sailorsy");      //cast to Home interface      sailorsyHomeObject = (sailorsyHome) PortableRemoteObject.narrow(ref, sailorsyHome.class);    }    catch(Exception e) {      e.printStackTrace();    }  }  //----------------------------------------------------------------------------  // Utility Methods  //----------------------------------------------------------------------------  public sailorsyHome getHome() {    return sailorsyHomeObject;  }  //Main method  public static void main(String[] args) throws Exception{    sailorsyTestClient1 client = new sailorsyTestClient1();    sailorsyRemote sr=client.getHome() .create() ;    String s=sr.showname() ;    System.out.print(s);    // Use the getHome() method of the client object to call Home interface    // methods that will return a Remote interface reference.  Then    // use that Remote interface reference to access the EJB.  }}
           

          以上的EJB在win2000+jbuilder5/jbuilder6+BAS4.5經過測試。


          以下是整個EJB的執行過程:
          1. 客戶端通過JNDI檢索Home對象的引用;
          2. JNDI返回Home對象的引用;
          3. 請求創建一個新的EJB對象;
          4. 創建EJB對象;
          5. 返回EJB對象;
          6. 調用商務方法;
          7. 調用Enterprise Bean.

          主站蜘蛛池模板: 武宁县| 太康县| 安达市| 鄢陵县| 太仆寺旗| 舒兰市| 瓮安县| 嘉义县| 绥滨县| 崇义县| 桂东县| 保康县| 荔浦县| 陆河县| 东平县| 凌源市| 新竹市| 聂荣县| 微山县| 三都| 卫辉市| 武强县| 丰顺县| 延庆县| 贵阳市| 砀山县| 绥宁县| 鄯善县| 清徐县| 遂平县| 美姑县| 西宁市| 深水埗区| 青岛市| 丰顺县| 宜昌市| 炎陵县| 莱西市| 凤城市| 汪清县| 太仆寺旗|