三個基本class
EJB最少也需要三個class, remote interface, home interface, and bean implementation(bean行為).
1. remote interface 用來揭示EJB對外的一些方法.在這個例子中,the remote interface 就是org.jboss.docs.interest.Interest.
ackage org.jboss.docs.interest;
import javax.ejb.EJBObject; /** |
?
2.home interface 是用來規(guī)定怎樣創(chuàng)建一個實現(xiàn)remote interface的bean. 在本例中home interface 是 org.jboss.docs.InterestHome.
package org.jboss.docs.interest;
import java.io.Serializable; /** |
3.bean implementation 是提供方法的實現(xiàn),這些方法在上述兩種interface中都有規(guī)定了,在本例中是兩個方法: calculateCompoundInterest和create().
這個bean implementation 是 org.jboss.docs.interest.InterestBean.
package org.jboss.docs.interest;
import java.rmi.RemoteException; /** /** Empty method body |
?
這些classes必須打包進(jìn)一個JAR文件中,JAR文件中包含了目錄結(jié)構(gòu)和包的層次.在本例中,這些classes是在包org.jboss.docs.interest, 這樣他們需要在目錄org/jboss/docs/interest/ 下.
部署發(fā)布描述器ejb-jar.xml和jboss.xml
在JAR文檔創(chuàng)建之前,還需要一個叫META-INF的目錄,這是存放部署發(fā)布描述器的(一般叫ejb-jar.xml).大部分商用EJB Server提供圖形化工具來編輯這個 描述器.在JBoss中需要手工:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar> <!-- home interface --> <!-- remote interface --> <!-- bean implementation --> <!--bean 的類型 這里是Stateless --> |
在本例中,一個包中只有一個EJB 這樣就不用描述多個EJB之間是怎樣交互的.
盡管對于所有的EJB服務(wù)器,ejb-jar.xml部署描述器的格式是一樣的(更多精確的定義可以從sun得到DTD).它并沒有規(guī)定所有的必須的信息,比如如何將EJB-NAME和JNDI naming service聯(lián)系起來.
缺省情況下,JNDI name將使用在ejb-jar.xml中<ejb-name>XXX</ejb-name>中的XXX來使用EJB的home interface.
但是如果有多個EJB,在ejb-jar.xml中,在<ejb-name>XXX</ejb-name>中XXX就不能用同一個名字了,一般格式是"[application name]/[bean name]".
那么如果再按照缺省情況,JNDI name就可能找不到你的應(yīng)用程序的入口了,因此我們要特別規(guī)定一下.這就需要在jboss.xml中規(guī)定:
<?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>Interest</ejb-name> <jndi-name>interest/Interest</jndi-name> </session> </enterprise-beans> </jboss> |
這樣,你所有叫Interest文件都被梆定到JNDI name:interest/Interest下面
jndi.properties
雖然有了上面你的應(yīng)用程序和JNDI name的梆定,但是一旦部署發(fā)布到JBoss服務(wù)器上,你還需要一個jndi.properties文件,以告訴調(diào)用你程序的客戶端請求到哪里去初始化JNDI naming service.
? java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory ? |
在本例中,客戶端請求將尋找Interest 這個bean, 然后得到這個bean的home interface. home interface是用來得到這個bean的remote interface.最后,客戶端請求將通過remote interface來使用由EJB提供的功能.