轉(zhuǎn): EJB2.0雨夜教程之一
EJB2.0雨夜教程之一EJB雨夜原創(chuàng)講解
初識(shí)EJB
EJB是什么呢?
EJB是一個(gè)J2EE體系中的組件.再簡(jiǎn)單的說(shuō)它是一個(gè)能夠遠(yuǎn)程調(diào)用的javaBean.
它同普通的javaBean有兩點(diǎn)不同.
第一點(diǎn),就是遠(yuǎn)程調(diào)用.
第二點(diǎn),就是事務(wù)的功能,我們?cè)贓JB中聲明的事務(wù)會(huì)通過(guò)容器幫助我們來(lái)處理.
支持EJB的SERVER有以下幾個(gè):
Weblogic
Webspere
Appserver
Jboss
我選用的是weblogic+JBuilder9開(kāi)發(fā).
回過(guò)來(lái)我們繼續(xù)說(shuō)這個(gè)EJB的原理.
它是分布式的.這個(gè)的意思其實(shí)很簡(jiǎn)單不需要想太復(fù)雜.
就是我們把事情不是交給一個(gè)人去處理.而是把事情劃分一下交給多個(gè)人處理,
而多個(gè)人處理之后我們讓這個(gè)分配的人來(lái)把最后得到的結(jié)合處理.
EJB我們首先要明確它是放在服務(wù)器端的組件.
一共有三種EJB
1,SessionBean 復(fù)雜處理業(yè)務(wù)邏輯的.
2,EntityBean 處理數(shù)據(jù)
3,MessageBean 消息Bean異步,耦合的處理.
那么誰(shuí)能調(diào)用EJB呢?
也或者說(shuō)EJB被誰(shuí)調(diào)用呢?
我們說(shuō)它就是放在server的一個(gè)能夠遠(yuǎn)程調(diào)用的javaBean.
所以它可以被Java的語(yǔ)言調(diào)用servlet,jsp等都o(jì)k的說(shuō).
而且它還可以被C++語(yǔ)言調(diào)用.很強(qiáng)大吧.
EJB的最基本的出發(fā)點(diǎn)就是推動(dòng)Java在服務(wù)器端的編程能力.
所以呢它的功能就我個(gè)人來(lái)看太強(qiáng)悍了..= =
這個(gè)遠(yuǎn)程調(diào)用是通過(guò)什么呢.
Java是通過(guò)RMI-JRMP(java遠(yuǎn)程方法調(diào)用)協(xié)議來(lái)調(diào)用.EJB就是通過(guò)這個(gè)來(lái)實(shí)現(xiàn)的.
C++是通過(guò)Corba-iiop協(xié)議來(lái)調(diào)用的.這個(gè)協(xié)議支持兩端不同語(yǔ)言的調(diào)用.
Corba是公共對(duì)象請(qǐng)求代理服務(wù)
iiop是網(wǎng)絡(luò)內(nèi)部對(duì)象協(xié)議.
下面我們來(lái)簡(jiǎn)單說(shuō)一下這個(gè)分布式的調(diào)用。
客戶(hù)端發(fā)送一個(gè)請(qǐng)求給服務(wù)器
首先是傳給stub代理類(lèi)它發(fā)送參數(shù)給skeleton委托類(lèi)然后這個(gè)類(lèi)調(diào)用我們的實(shí)現(xiàn)類(lèi)取得結(jié)果再遠(yuǎn)路返回。
這樣一個(gè)分布處理就結(jié)束了。
后面會(huì)具體的結(jié)合代碼分析。
先記住這個(gè)大致的結(jié)構(gòu)就好。
我們寫(xiě)一個(gè)EJB需要做那些工作呢?
1,寫(xiě)一個(gè)接口繼承EJBObject 這個(gè)類(lèi)作為遠(yuǎn)程接口
2,寫(xiě)一個(gè)接口繼承EJBHome 這個(gè)類(lèi)里有一個(gè)方法是create()它返回接口類(lèi)型。
3,寫(xiě)一個(gè)Bean繼承SessionBean, 這個(gè)類(lèi)里包含一個(gè)create()方法和一個(gè)業(yè)務(wù)方法。
4,寫(xiě)一個(gè)ejb-jar.xml 這個(gè)xml是把上面的三個(gè)文件組合起來(lái)
5,寫(xiě)一個(gè)weblogic-ejb-jar.xml 這個(gè)xml是連接查找source的作用
(不同的server會(huì)是不同的。這里選用的是weblogic)
上面的兩個(gè)xml文件需要放在META-INF目錄下。
而以上這些類(lèi)都需要打包在一個(gè)jar文件中然后在server部署。
這樣就完成了EJB的部署
例如:
我們寫(xiě)個(gè)簡(jiǎn)單的計(jì)算吧。
(先聲明下吧本教程的說(shuō)明都是我自己的理解,
也許并不是一些文檔上的描述那么正規(guī)但是很方便理解的。
如果有實(shí)在無(wú)法茍同的地方大家多多包含。這是為了便于理解的講解)
AddCount.java這個(gè)就是我們繼承EJBObject的類(lèi).
import javax.ejb.*;
import java.rmi.*;
public interface AddCount extends EJBObject
{
public int addCount(int a,int b) throws RemoteException;
}
接口的作用.在這里強(qiáng)調(diào)一下吧.所有實(shí)現(xiàn)這個(gè)接口的類(lèi)都會(huì)是這個(gè)接口的類(lèi)型.
同時(shí)都包含接口的方法的實(shí)現(xiàn).
這個(gè)接口中的方法也就是在以后會(huì)實(shí)現(xiàn)的方法.我們這里要做的是一個(gè)加法的運(yùn)算.
AddCountHome.java這個(gè)是繼承EJBHome的類(lèi).它里面包含的這個(gè)create()返回的是AddCount類(lèi)型對(duì)象.
import javax.ejb.*;
import java.rmi.*;
public interface AddCountHome extends EJBHome
{
public AddCount create() throws RemoteException,CreateException;
}
下面這個(gè)是我們的Bean.這個(gè)類(lèi)繼承了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;
}
}
這個(gè)里面我們實(shí)現(xiàn)了業(yè)務(wù)的方法addCount(){a+b;}
同時(shí)需要指出一下它的其他方法(這些僅僅簡(jiǎn)單指出后面的教程有詳細(xì)說(shuō)明)
首先是ejbCreate()這個(gè)方法實(shí)際上是對(duì)我們的遠(yuǎn)程接口的實(shí)現(xiàn)類(lèi)的初始化.
setSessionContext(SessionContext ctx)設(shè)置context.容器是在這個(gè)方法之后產(chǎn)生的實(shí)例.
ejbRemove()毫無(wú)疑問(wèn)是一個(gè)實(shí)例結(jié)束移除.
ejbActivate()激活方法.它的作用是激活鈍化.
ejbPassivate()鈍化方法.當(dāng)實(shí)例的內(nèi)容長(zhǎng)時(shí)間不進(jìn)行處理的時(shí)候就會(huì)鈍化.也就是閑置的意思.
以上這幾個(gè)是SessionBean的基本方法.希望大家可以自己慢慢理解.
之后也會(huì)反復(fù)說(shuō)到這些的.
下面我們寫(xiě)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>
下面這個(gè)是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>
我們接下來(lái)寫(xiě)測(cè)試類(lèi)
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));
}
}
測(cè)試類(lèi)的hash是初始化我們的weblogic的xml信息.
這里的t3://localhost:7001是weblogic的特殊協(xié)議指向的是ip位置.
然后lookup("rainnight")查找jndi,而實(shí)際上也就是通過(guò)這個(gè)jndi找到我們的ejb組件.
通過(guò)得到的對(duì)象我們對(duì)比一下是不是Home類(lèi)型.
然后我們執(zhí)行home.create()產(chǎn)生AddCount的實(shí)例
最后調(diào)用方法就ok了.
下面是如何執(zhí)行這個(gè)的方法.
第一步,jdk,weblogic.需要快些下載安裝啦..
第二步,配置環(huán)境變量.基本的java的環(huán)境變量如何配置我就不說(shuō)了.
這里需要特別指出要把java目錄下的lib中的tools.jar加載到我們的class_path中.
然后我們?cè)侔褀eblogic的目錄下的server目錄下的lib中的weblogic.jar找到也加載進(jìn)來(lái).
這樣我們編譯需要的東西就ok了.
第三步,編譯java類(lèi).
第四步,打包.jar cvf AddCount.jar *.class META-INF/*.xml
第五步,java weblogic.appc AddCount.jar
第六步,部署到weblogic中.
第七步,運(yùn)行Test類(lèi).
初識(shí)EJB
EJB是什么呢?
EJB是一個(gè)J2EE體系中的組件.再簡(jiǎn)單的說(shuō)它是一個(gè)能夠遠(yuǎn)程調(diào)用的javaBean.
它同普通的javaBean有兩點(diǎn)不同.
第一點(diǎn),就是遠(yuǎn)程調(diào)用.
第二點(diǎn),就是事務(wù)的功能,我們?cè)贓JB中聲明的事務(wù)會(huì)通過(guò)容器幫助我們來(lái)處理.
支持EJB的SERVER有以下幾個(gè):
Weblogic
Webspere
Appserver
Jboss
我選用的是weblogic+JBuilder9開(kāi)發(fā).
回過(guò)來(lái)我們繼續(xù)說(shuō)這個(gè)EJB的原理.
它是分布式的.這個(gè)的意思其實(shí)很簡(jiǎn)單不需要想太復(fù)雜.
就是我們把事情不是交給一個(gè)人去處理.而是把事情劃分一下交給多個(gè)人處理,
而多個(gè)人處理之后我們讓這個(gè)分配的人來(lái)把最后得到的結(jié)合處理.
EJB我們首先要明確它是放在服務(wù)器端的組件.
一共有三種EJB
1,SessionBean 復(fù)雜處理業(yè)務(wù)邏輯的.
2,EntityBean 處理數(shù)據(jù)
3,MessageBean 消息Bean異步,耦合的處理.
那么誰(shuí)能調(diào)用EJB呢?
也或者說(shuō)EJB被誰(shuí)調(diào)用呢?
我們說(shuō)它就是放在server的一個(gè)能夠遠(yuǎn)程調(diào)用的javaBean.
所以它可以被Java的語(yǔ)言調(diào)用servlet,jsp等都o(jì)k的說(shuō).
而且它還可以被C++語(yǔ)言調(diào)用.很強(qiáng)大吧.
EJB的最基本的出發(fā)點(diǎn)就是推動(dòng)Java在服務(wù)器端的編程能力.
所以呢它的功能就我個(gè)人來(lái)看太強(qiáng)悍了..= =
這個(gè)遠(yuǎn)程調(diào)用是通過(guò)什么呢.
Java是通過(guò)RMI-JRMP(java遠(yuǎn)程方法調(diào)用)協(xié)議來(lái)調(diào)用.EJB就是通過(guò)這個(gè)來(lái)實(shí)現(xiàn)的.
C++是通過(guò)Corba-iiop協(xié)議來(lái)調(diào)用的.這個(gè)協(xié)議支持兩端不同語(yǔ)言的調(diào)用.
Corba是公共對(duì)象請(qǐng)求代理服務(wù)
iiop是網(wǎng)絡(luò)內(nèi)部對(duì)象協(xié)議.
下面我們來(lái)簡(jiǎn)單說(shuō)一下這個(gè)分布式的調(diào)用。
客戶(hù)端發(fā)送一個(gè)請(qǐng)求給服務(wù)器
首先是傳給stub代理類(lèi)它發(fā)送參數(shù)給skeleton委托類(lèi)然后這個(gè)類(lèi)調(diào)用我們的實(shí)現(xiàn)類(lèi)取得結(jié)果再遠(yuǎn)路返回。
這樣一個(gè)分布處理就結(jié)束了。
后面會(huì)具體的結(jié)合代碼分析。
先記住這個(gè)大致的結(jié)構(gòu)就好。
我們寫(xiě)一個(gè)EJB需要做那些工作呢?
1,寫(xiě)一個(gè)接口繼承EJBObject 這個(gè)類(lèi)作為遠(yuǎn)程接口
2,寫(xiě)一個(gè)接口繼承EJBHome 這個(gè)類(lèi)里有一個(gè)方法是create()它返回接口類(lèi)型。
3,寫(xiě)一個(gè)Bean繼承SessionBean, 這個(gè)類(lèi)里包含一個(gè)create()方法和一個(gè)業(yè)務(wù)方法。
4,寫(xiě)一個(gè)ejb-jar.xml 這個(gè)xml是把上面的三個(gè)文件組合起來(lái)
5,寫(xiě)一個(gè)weblogic-ejb-jar.xml 這個(gè)xml是連接查找source的作用
(不同的server會(huì)是不同的。這里選用的是weblogic)
上面的兩個(gè)xml文件需要放在META-INF目錄下。
而以上這些類(lèi)都需要打包在一個(gè)jar文件中然后在server部署。
這樣就完成了EJB的部署
例如:
我們寫(xiě)個(gè)簡(jiǎn)單的計(jì)算吧。
(先聲明下吧本教程的說(shuō)明都是我自己的理解,
也許并不是一些文檔上的描述那么正規(guī)但是很方便理解的。
如果有實(shí)在無(wú)法茍同的地方大家多多包含。這是為了便于理解的講解)
AddCount.java這個(gè)就是我們繼承EJBObject的類(lèi).
import javax.ejb.*;
import java.rmi.*;
public interface AddCount extends EJBObject
{
public int addCount(int a,int b) throws RemoteException;
}
接口的作用.在這里強(qiáng)調(diào)一下吧.所有實(shí)現(xiàn)這個(gè)接口的類(lèi)都會(huì)是這個(gè)接口的類(lèi)型.
同時(shí)都包含接口的方法的實(shí)現(xiàn).
這個(gè)接口中的方法也就是在以后會(huì)實(shí)現(xiàn)的方法.我們這里要做的是一個(gè)加法的運(yùn)算.
AddCountHome.java這個(gè)是繼承EJBHome的類(lèi).它里面包含的這個(gè)create()返回的是AddCount類(lèi)型對(duì)象.
import javax.ejb.*;
import java.rmi.*;
public interface AddCountHome extends EJBHome
{
public AddCount create() throws RemoteException,CreateException;
}
下面這個(gè)是我們的Bean.這個(gè)類(lèi)繼承了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;
}
}
這個(gè)里面我們實(shí)現(xiàn)了業(yè)務(wù)的方法addCount(){a+b;}
同時(shí)需要指出一下它的其他方法(這些僅僅簡(jiǎn)單指出后面的教程有詳細(xì)說(shuō)明)
首先是ejbCreate()這個(gè)方法實(shí)際上是對(duì)我們的遠(yuǎn)程接口的實(shí)現(xiàn)類(lèi)的初始化.
setSessionContext(SessionContext ctx)設(shè)置context.容器是在這個(gè)方法之后產(chǎn)生的實(shí)例.
ejbRemove()毫無(wú)疑問(wèn)是一個(gè)實(shí)例結(jié)束移除.
ejbActivate()激活方法.它的作用是激活鈍化.
ejbPassivate()鈍化方法.當(dāng)實(shí)例的內(nèi)容長(zhǎng)時(shí)間不進(jìn)行處理的時(shí)候就會(huì)鈍化.也就是閑置的意思.
以上這幾個(gè)是SessionBean的基本方法.希望大家可以自己慢慢理解.
之后也會(huì)反復(fù)說(shuō)到這些的.
下面我們寫(xiě)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>
下面這個(gè)是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>
我們接下來(lái)寫(xiě)測(cè)試類(lèi)
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));
}
}
測(cè)試類(lèi)的hash是初始化我們的weblogic的xml信息.
這里的t3://localhost:7001是weblogic的特殊協(xié)議指向的是ip位置.
然后lookup("rainnight")查找jndi,而實(shí)際上也就是通過(guò)這個(gè)jndi找到我們的ejb組件.
通過(guò)得到的對(duì)象我們對(duì)比一下是不是Home類(lèi)型.
然后我們執(zhí)行home.create()產(chǎn)生AddCount的實(shí)例
最后調(diào)用方法就ok了.
下面是如何執(zhí)行這個(gè)的方法.
第一步,jdk,weblogic.需要快些下載安裝啦..
第二步,配置環(huán)境變量.基本的java的環(huán)境變量如何配置我就不說(shuō)了.
這里需要特別指出要把java目錄下的lib中的tools.jar加載到我們的class_path中.
然后我們?cè)侔褀eblogic的目錄下的server目錄下的lib中的weblogic.jar找到也加載進(jìn)來(lái).
這樣我們編譯需要的東西就ok了.
第三步,編譯java類(lèi).
第四步,打包.jar cvf AddCount.jar *.class META-INF/*.xml
第五步,java weblogic.appc AddCount.jar
第六步,部署到weblogic中.
第七步,運(yùn)行Test類(lèi).
posted on 2007-09-29 16:41 夏雪 閱讀(2394) 評(píng)論(2) 編輯 收藏