EJB2.x和EJB3.0開發步驟的不同之處

舉兩個隨處可見的例子說說 EJB2.x和EJB3.0開發步驟的不同之處,這兩個例子只是爲了清楚的說明它們開發步驟的不同之處,不保證能夠運行,例子的顯示輸出結果在eclipse的控制檯中顯示。

        先說說EJB3.0吧: 

        EJB3.0,不需要創建Home和對象接口,不需要組件接口(javax.ejb.SessionBean和javax.ejb.MessageDrivenBean),使用java元數據註釋(@?  其中“?“表示註釋名),簡化了EJB環境的API。

       EJB3.0開發步驟:
       1. 編寫業務代碼,Bean類
       2. 生成部署描述符
       3. 將2,3打包成Ejb-jar文件
       4. 部署Ejb-jar文件到容器,查看EJB容器看是否部署成功
       5. 編寫執行客戶應用
       與其相關的小例子:
1.創建一個業務接口 Test.java類
package com.ejb.interface
/**
   * Test的業務接口
   
*/

public interface Test {
           
/**
              * @return返回成功消息給用戶 
              
*/

            
public String test();
}

2.創建一個無狀態會話bean     TestBean.java類

package com.ejb.bean
import javax.ejb.Remote;
import javax.ejb.Stateless;
/**
   * 無狀態會話Bean
   
*/

@Stateless
@Remote(Test.
class)
public class TestBean implements Test {
    
public String test() {
        System.
out.println("test()");
        
return "------sucess------";
    }

}

3.調用test()方法    TestClient.java

package com.ejb.bean.client
import javax.naming.Context;
import javax.naming.InitialContext;
/**
 * 調用遠程的無狀態會話bean
 
*/

 
public class TestClient{
      
public static void main(String[] args)throws Exception{
     
/**
         * 初始化上下文 jndi
         
*/

     Context c 
= new InitialContext();     
     Test test 
= (Test)c.lookup("com.ejb.interface.Test");
     
/**
        * 調用Bean實例的test()方法,並將結果在控制檯輸出
        
*/

     System.out.println(test.test());
        }

 }
4.部署描述符
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" 
xmlns
="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
>
</ejb-jar>

 

          下面看看EJB2.x的開發步驟吧,看完下面這個就會覺得EJB3.0真的簡化了很多啊^_^。

1.遠程接口 Test.java

package com.ejb2.test
/**
 *TestEJB組件的遠程接口,
 
*/

public interface Test extends java.ejb.EJBObject{
    
//用於返回成功消息的方法
    public String test() throws java.rmi.RemoteException;
}
2.本地接口 TestLocal.java
/**
 *TestEJB組件的本地接口,
 
*/

public interface TestLocal extends java.ejb.EJBLocalObject{
    
//用於返回成功消息的方法
    public String test();
}
3.Home接口 TestHome.java
package com.ejb2.test
/**
 *TestEJB組件的Home接口,
 ×create()()方法方法對應於TestBean中的ejbCreate
 
*/

public interface TestHome extends javax.ejb.EJBHome{
    
//創建EJB對象
    Test create() throws java.rmi.RemoteException,javax.ejb.CreateException;
}
4.本地Home接口
package com.ejb2.test
/**
 *TestEJB組件的本地Home接口
 
*/

public interface TestLocalHome extends javax.ejb.EJBLocalHome{
    
//創建EJB對象
    TestLocal create() throws javax.ejb.CreateException;
}

5.Bean類 TestBean.java
package com.ejb2.test
/**
 *無狀態會話Bean
 
*/

public class TestBean implements javax.ejb.SessionBean{
    
private javax.ejb.SessionContext ct;
    
//EJB規範要求的實現
    public void ejbCreate(){
        System.out.println(
"ejbCreate()");
    }

    
public void ejbRemove(){
        System.out.println(
"ejbRemove()");
    }
    
    
public void ejbActivate(){
        System.out.println(
"ejbActivate()");
    }
    
    
public void ejbPassivate(){
        System.out.println(
"ejbPassivate()");
    }
    
    
public void setSessionContext(javax.ejb.SessionContext ct){
      
this.ct=ct;
    }
    
    
//業務方法
    public String test(){
        System.out.println(
"test()");
        
return "--------sucess---------";
    }

}
6.EJB應用 TestClient.java
package com.ejb2.test
/**
 *客戶端代碼,調用TestEJB組件中的業務方法
 
*/

 
public class TestClient{
 
 
public static void main(String[] args)throws Exception{
     
//設定jndi屬性信息
     Properties pp = System.getProperties();
     }
   
     
//初始化上下文
     Context ct =  new InitialContext(pp);
     
//引用到Home對象,創建EJB對象工廠
     Object obj = ct.lookup("package com.ejb2.test.TestHome");
     
// 轉換成RMI-IIOP對象操作
     TestHome th = (TestHome)javax.rmi.PortableRemoteObject.narrow(obj,TestHome.class);
     
//創建Home EJB對象
     Test test = test.create();
     
//調用EJB對象的test()方法,並在控制檯顯示結果
     System.out.println(test.test());]
     
//銷燬EJB對象
     test.remove();
}

7.部署描述符
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" 
xmlns
="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
 <enterprise-Beans>
   
<session>
        
<ejb-name>TestEJB</ejb-name>
        
<home>com.ejb2.test.TestHome</home>
        
<local-home>com.ejb2.test.TestLocalHome</local-home>
        
<local>com.ejb2.test.Testbean</local>
        
<session-type>Stateless</session-type>
        
<transaction-type>Container</transaction-type>
    
</session> 
 
</enterprise-Beans>    
</ejb-jar>

            

        是不是發現EJB3.0的開發步驟簡化了許多呢,我剛接觸EJB2.1的時候,開它的開發步驟看的我暈乎乎的,不過幸好當時邊做項目邊學它,很快就把它的開發步驟給弄通了,當我接觸到EJB3.0的時候,就放開始學習3.0而把2.1的學習基本上放棄了。個人認爲,即使以前沒有接觸過EJB2.x,也不影響你學習EJB3.0,沒有接觸過EJB的人,完全可以直接學習EJB3.0,而不用先學EJB2.x在學EJB3.0。    

   從上面例子的比較可以看出EJB2.x ,EJB3.0業務方法調用變得不同了。

       2.x本地客戶和遠程客戶通過home接口創建了本地(本地home接口)或遠程(遠程home接口)EJB對象引用,EJB對象會生成EJB Home接口和EJB對象接口對應的實現。 客戶通過本地或遠程EJB對象接口調用業務方法。調用EJB Bean類中的業務方法前,容器生成的EJB對象會調用容器專有的API來獲得中間件服務,在調用EJB Bean類的業務方法後,容器生成的EJB對象會調用容器專有的API來獲得中間件服務。

        3.0用業務接口來代替本地和遠程的Home接口,本地客戶和遠程客戶都通過業務接口調用EJB組件的業務方法。在調用EJB Bean類的業務方法時也做了改變,調用EJB Bean類的業務方法前,EJB容器會生成包裹類,調用EJB Bean類的業務方法前後,都會通過EJB容器成生的包裹類調用容器專有的API來獲得中間件服務。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章