EJB是J2EE中最重要的技術(shù)之一,它是支持分布式事務(wù)的分布式組件,我們以Hello World為例,編寫第一個(gè)名為Hello的最簡(jiǎn)單的Session Bean。
根據(jù)EJB2.1規(guī)范,編寫一個(gè)Session Bean需要以下幾個(gè)類和接口:
遠(yuǎn)程接口Hello,客戶端使用這個(gè)接口來(lái)訪問EJB:
// Hello.java
// 遠(yuǎn)程接口:EJBObject
import javax.ejb.*;
import java.rmi.*;
public interface Hello extends EJBObject {
// 業(yè)務(wù)方法,必須拋出RemoteException:
public String say() throws RemoteException;
}
Home接口HelloHome,客戶端使用這個(gè)接口來(lái)創(chuàng)建EJB并在稍后調(diào)用其業(yè)務(wù)方法:
// HelloHome.java
// Home接口,負(fù)責(zé)創(chuàng)建EJB:
import java.io.*;
import java.rmi.*;
import javax.ejb.*;
public interface HelloHome extends EJBHome {
// create方法需要拋出RemoteException和CreateException:
Hello create() throws RemoteException, CreateException;
}
實(shí)現(xiàn)業(yè)務(wù)邏輯的類HelloBean,客戶端永遠(yuǎn)無(wú)法直接訪問它,只能通過遠(yuǎn)程接口來(lái)間接訪問它,HelloBean只有一個(gè)業(yè)務(wù)方法:
// HelloBean.java
// 實(shí)現(xiàn)真正業(yè)務(wù)方法的Bean,由容器管理,
// 客戶端通過遠(yuǎn)程接口間接訪問它:
import java.rmi.*;
import javax.ejb.*;
public class HelloBean implements SessionBean {
private SessionContext ctx;
public String say() {
return "Hello, world.";
}
public void setSessionContext(SessionContext ctx) {
this.ctx = ctx;
}
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
}
從上面可以看到,為了編寫一個(gè)Bean,需要額外的兩個(gè)接口支持,并且,由于HelloBean不實(shí)現(xiàn)Hello接口,這些方法申明和實(shí)現(xiàn)如果不一致,只有在部署時(shí)才能發(fā)現(xiàn)問題。某些工具(如XDoclet)可以根據(jù)特定的注釋自動(dòng)生成Remote和Home接口。在EJB 3.0規(guī)范中,開發(fā)者就只需要編寫B(tài)ean,剩下的Remote和Home接口都由工具根據(jù)EJB 3的注釋自動(dòng)生成,因此大大簡(jiǎn)化了開發(fā)。
為了提高EJB的調(diào)用速度,如果客戶端和EJB容器位于同一個(gè)JVM內(nèi)(例如運(yùn)行在同一個(gè)JVM中的JSP和EJB),還可以使用本地接口,但是這兩個(gè)接口不是必需的,因此我們不去實(shí)現(xiàn)它。
現(xiàn)在我們一共有3個(gè)文件:Hello.java,HelloHome.java,HelloBean.java,放在C:\example目錄下,然后開始編譯:
C:\example>javac *.java
在當(dāng)前目錄下可以找到編譯后的Hello.class,HelloHome.class和HelloBean.class三個(gè)文件。
下載源碼:點(diǎn)擊下載
下一步:部署(待續(xù))