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