1. 程式人生 > >EJB2.0雨夜教程之一

EJB2.0雨夜教程之一

EJB雨夜原創講解

初識EJB

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的作用
                                 (不同的server會是不同的。這裡選用的是weblogic)

上面的兩個xml檔案需要放在META-INF目錄下。
而以上這些類都需要打包在一個jar檔案中然後在server部署。
這樣就完成了EJB的部署
例如:
我們寫個簡單的計算吧。
(先宣告下吧本教程的說明都是我自己的理解,
也許並不是一些文件上的描述那麼正規但是很方便理解的。
如果有實在無法苟同的地方大家多多包含。這是為了便於理解的講解)
AddCount.java這個就是我們繼承EJBObject的類.

import javax.ejb.*;
import java.rmi.*;

public interface AddCount extends EJBObject
{
        public int addCount(int a,int b) throws RemoteException;
}
介面的作用.在這裡強調一下吧.所有實現這個介面的類都會是這個介面的型別.
同時都包含介面的方法的實現.
這個介面中的方法也就是在以後會實現的方法.我們這裡要做的是一個加法的運算.


AddCountHome.java這個是繼承EJBHome的類.它裡面包含的這個create()返回的是AddCount型別物件.


import javax.ejb.*;
import java.rmi.*;

public interface AddCountHome extends EJBHome
{
        public AddCount create() throws RemoteException,CreateException;
}





下面這個是我們的Bean.這個類繼承了SessionBean
import javax.ejb.*;

public class AddCountBean implements SessionBean
{
        public void ejbCreate()
        {
        }
        public void setSessionContext(SessionContext ctx)
                       throws EJBException,
                              java.rmi.RemoteException
        {
        }
        public void ejbRemove()
               throws EJBException,
                      java.rmi.RemoteException
        {
        }

        public void ejbActivate()
                 throws EJBException,
                        java.rmi.RemoteException
        {
        }
        public void ejbPassivate()
                  throws EJBException,
                         java.rmi.RemoteException
        {
        }
        public int addCount(double a,double b)
        {
                return a+b;
        }
}
這個裡面我們實現了業務的方法addCount(){a+b;}
同時需要指出一下它的其他方法(這些僅僅簡單指出後面的教程有詳細說明)
首先是ejbCreate()這個方法實際上是對我們的遠端介面的實現類的初始化.
setSessionContext(SessionContext ctx)設定context.容器是在這個方法之後產生的例項.
ejbRemove()毫無疑問是一個例項結束移除.
ejbActivate()啟用方法.它的作用是啟用鈍化.
ejbPassivate()鈍化方法.當例項的內容長時間不進行處理的時候就會鈍化.也就是閒置的意思.
以上這幾個是SessionBean的基本方法.希望大家可以自己慢慢理解.
之後也會反覆說到這些的.




下面我們寫xml檔案
首先是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>
            <display-name>first</display-name>
            <ejb-name>add</ejb-name>

            <home>AddCountHome</home>
            <remote>AddCount</remote>
            <ejb-class>AddCountBean</ejb-class>

            <session-type>Stateless</session-type>
            <transaction-type>Container</transaction-type>     
        </session>
    </enterprise-beans>
    <assembly-descriptor>
        <container-transaction>
            <method>
                <ejb-name>add</ejb-name>
                <method-name>*</method-name>
            </method>
            <trans-attribute>Required</trans-attribute>
        </container-transaction>
        
    </assembly-descriptor>
</ejb-jar>

下面這個是weblogic-ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN' 'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'>
<weblogic-ejb-jar>
    <weblogic-enterprise-bean>
        <ejb-name>
                add  
                </ejb-name>
        
        <jndi-name>rainnight</jndi-name>

    </weblogic-enterprise-bean>
</weblogic-ejb-jar>


我們接下來寫測試類

import java.util.*;
import java.naming.*;
import java.rim.*;
public class AddTest{
        public static void main(String bb[])throws Exception{
                Hashtable hash = new Hashtable();
                hash.put(Context.INITIAL_COUNTEXT_FACTORY,
                                "weblogic.jndi.WLInitialContextFactory");
                hash.put(Context.PROVIDER_URL,
                                "t3://localhost:7001");
                Object obj = context.lookup("rainnight");
                AddCountHome home = (AddCountHome)PortableRemoteObject(obj,AddCountHome.class);
                AddCount local = home.create();
                System.out.println(local.add(1,1));
        }
}

測試類的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類