1. 程式人生 > >EJB2.0教程 詳解EJB技術及實現原理

EJB2.0教程 詳解EJB技術及實現原理

tee nsa 普通 事情 println 配置 ransac 教程 聲明

EJB是什麽呢?
EJB是一個J2EE體系中的組件.再簡單的說它是一個能夠遠程調用的javaBean.它同普通的javaBean有兩點不同.
第一點,就是遠程調用.
第二點,就是事務的功能,我們在EJB中聲明的事務會通過容器幫助我們來處理.支持EJB的SERVER有以下幾個:
Weblogic
Webspere
Appserver
Jboss

我選用的是weblogic+JBuilder9開發.回過來我們繼續說這個EJB的原理.它是分布式的.這個的意思其實很簡單不需要想太復雜.就 是我們把事情不是交給一個人去處理.而是把事情劃分一下交給多個人處理,而多個人處理之後我們讓這個分配的人來把最後得到的結合處理.

EJB我們首先要明確它是放在服務器端的組件.
一共有三種EJB
1,SessionBean 復雜處理業務邏輯的.
2,EntityBean 處理數據
3,MessageBean 消息Bean異步,耦合的處理.

那麽誰能調用EJB呢?也或者說EJB被誰調用呢?我們說它就是放在server的一個能夠遠程調用的javaBean.所以它可以被Java的語 言調用servlet,jsp等都ok的說.而且它還可以被C++語言調用.很強大吧.EJB的最基本的出發點就是推動Java在服務器端的編程能力.所 以呢它的功能就我個人來看太強悍了..= =

這個遠程調用是通過什麽呢.Java是通過RMI-JRMP(java遠程方法調用)協議來調用.EJB就是通過這個來實現的.C++是通過 Corba-iiop協議來調用的.這個協議支持兩端不同語言的調用.Corba是公共對象請求代理服務iiop是網絡內部對象協議.

下面我們來簡單說一下這個分布式的調用。客戶端發送一個請求給服務器首先是傳給stub代理類它發送參數給skeleton委托類然後這個類調用我們的實現類取得結果再遠路返回。這樣一個分布處理就結束了。後面會具體的結合代碼分析。先記住這個大致的結構就好。

我們寫一個EJB需要做那些工作呢?
1,寫一個接口繼承EJBObject 這個類作為遠程接口
2,寫一個接口繼承EJBHome 這個類裏有一個方法是create()它返回接口類型。
3,寫一個Bean繼承SessionBean, 這個類裏包含一個create()方法和一個業務方法。
4,寫一個ejb-jar.xml 這個xml是把上面的三個文件組合起來

5,寫一個weblogic-ejb-jar.xml 這個xml是連接查找source的作用

上面的兩個xml文件需要放在META-INF目錄下。而以上這些類都需要打包在一個jar文件中然後在server部署。這樣就完成了EJB的部署。例如:

  1. import javax.ejb.*;
  2. import java.rmi.*;
  3. public interface AddCount extends EJBObject
  4. {
  5. public int addCount(int a,int b) throws RemoteException;
  6. }

AddCountHome.java這個是繼承EJBHome的類.它裏面包含的這個create()返回的是AddCount類型對象.

  1. import javax.ejb.*;
  2. import java.rmi.*;
  3. public interface AddCountHome extends EJBHome
  4. {
  5. public AddCount create() throws RemoteException,CreateException;
  6. }

下面這個是我們的Bean.這個類繼承了SessionBean

  1. import javax.ejb.*;
  2. public class AddCountBean implements SessionBean
  3. {
  4. public void ejbCreate()
  5. {
  6. }
  7. public void setSessionContext(SessionContext ctx)
  8. throws EJBException,
  9. java.rmi.RemoteException
  10. {
  11. }
  12. public void ejbRemove()
  13. throws EJBException,
  14. java.rmi.RemoteException
  15. {
  16. }
  17. public void ejbActivate()
  18. throws EJBException,
  19. java.rmi.RemoteException
  20. {
  21. }
  22. public void ejbPassivate()
  23. throws EJBException,
  24. java.rmi.RemoteException
  25. {
  26. }
  27. public int addCount(double a,double b)
  28. {
  29. return a+b;
  30. }
  31. }

這個裏面我們實現了業務的方法 addCount(){a+b;}。同時需要指出一下它的其他方法(這些僅僅簡單指出後面的教程有詳細說明)。首先是ejbCreate()這個方法實際 上是對我們的遠程接口的實現類的初始化.setSessionContext(SessionContext ctx)設置context.容器是在這個方法之後產生的實例.

ejbRemove()毫無疑問是一個實例結束移 除.ejbActivate()激活方法.它的作用是激活鈍化.ejbPassivate()鈍化方法.當實例的內容長時間不進行處理的時候就會鈍化.也 就是閑置的意思.以上這幾個是SessionBean的基本方法.希望大家可以自己慢慢理解.之後也會反復說到這些的.

下面我們寫xml文件
首先是ejb-jar.xml

 
  1. xml version = "1.0" encoding = "UTF-8" ?>
  2. Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd" >
  3. < ejb-jar >
  4. < enterprise-beans >
  5. < session >
  6. < display-name > first display-name >
  7. < ejb-name > add ejb-name >
  8. < home > AddCountHome home >
  9. < remote > AddCount remote >
  10. < ejb-class > AddCountBean ejb-class >
  11. < session-type > Stateless session-type >
  12. < transaction-type > Container transaction-type>
  13. session >
  14. enterprise-beans >
  15. < assembly-descriptor >
  16. < container-transaction >
  17. < method >
  18. < ejb-name > add ejb-name >
  19. < method-name > * method-name >
  20. method >
  21. < trans-attribute > Required trans-attribute >
  22. container-transaction >
  23. assembly-descriptor >
  24. ejb-jar >

下面這個是weblogic-ejb-jar.xml

  1. xml version = "1.0" encoding = "UTF-8" ?>
  2. < weblogic-ejb-jar >
  3. < weblogic-enterprise-bean >
  4. < ejb-name >
  5. add
  6. ejb-name >
  7. < jndi-name > rainnight jndi-name >
  8. weblogic-enterprise-bean >
  9. weblogic-ejb-jar >

我們接下來寫測試類

 
  1. import java.util.*;
  2. import java.naming.*;
  3. import java.rim.*;
  4. public class AddTest{
  5. public static void main(String bb[])throws Exception{
  6. Hashtable hash = new Hashtable();
  7. hash.put(Context.INITIAL_COUNTEXT_FACTORY,
  8. "weblogic.jndi.WLInitialContextFactory");
  9. hash.put(Context.PROVIDER_URL,
  10. "t3://localhost:7001");
  11. Object obj = context .lookup("rainnight");
  12. AddCountHome home = (AddCountHome)PortableRemoteObject(obj,AddCountHome.class);
  13. AddCount local = home .create();
  14. System.out.println(local.add(1,1));
  15. }
  16. }

測試類的hash是初始化我們的weblogic 的xml信息.這裏的t3://localhost:7001是weblogic的特殊協議指向的是ip位置.然後 lookup("rainnight")查找jndi,而實際上也就是通過這個jndi找到我們的ejb組件.通過得到的對象我們對比一下是不是Home 類型.然後我們執行home.create()產生AddCount的實例.最後調用方法就ok了.


下面是如何執行這個的方法.
第一步,jdk,weblogic.需要快些下載安裝啦..
第二步,配置環境變量.基本的java的環境變量如何配置我就不說了.
這裏需要特別指出要把java目錄下的lib中的tools.jar加載到我們的class_path中.
然後我們再把weblogic的目錄下的server目錄下的lib中的weblogic.jar找到也加載進來.
這樣我們編譯需要的東西就ok了.
第三步,編譯java類.
第四步,打包.jar cvf AddCount.jar *.class META-INF/*.xml
第五步,java weblogic.appc AddCount.jar
第六步,部署到weblogic中.
第七步,運行Test類.

EJB2.0教程 詳解EJB技術及實現原理