EJB 組件運行於 EJB 容器,由伺服器廠商提供。本教學使用 BEA WebLogic Tengah。
https://www.weblogic.com/download.html/export/weblogichttps://www.sun.com/solaris/javaweblogic/classes、weblogic/lib/weblogicaux.jar、當前目錄 .weblogic/lib/solarisweblogic.properties 設定系統密碼 weblogic.password.systemstartTengah.sh 啟動伺服器。透過命令列或主控台「分散式物件」→「Enterprise JavaBeans Transaction Server」驗證部署狀態。註:說明以 Sun Solaris 為例,Windows NT 類似。
Remote 介面是 EJB 的 Client 視圖,開發者以 Java RMI 語法宣告,實作由容器工具產生。限制:所有物件、參數、回傳值、例外須符合「Java to IDL Mapping Specification」有效類型。
package ejb.demo;
import java.rmi.RemoteException; import java.rmi.Remote; import javax.ejb.*;
public interface Demo extends EJBObject, Remote {
// 最簡單範例:不查資料庫,直接回傳字串
public String demoSelect() throws RemoteException;
}
Session Bean 的 Home 介面提供機制讓容器代表 Client 建立新 Session Bean。同樣由開發者用 RMI 宣告,容器工具實作,屬宣告式工作。
package ejb.demo;
import javax.ejb.*; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.*;
public interface DemoHome extends EJBHome {
public Demo create() throws CreateException, RemoteException;
}
實作應用程式邏輯 (商業邏輯)。大部分代碼由 EJB 規格隱含實現,僅需實作介面方法與商業方法。未來工具/模板將自動完成大部分工作。
package ejb.demo;
import javax.ejb.*; import java.io.Serializable; import java.util.*; import java.rmi.*;
public class DemoBean implements SessionBean {
static final boolean verbose = true;
private transient SessionContext ctx;
private transient Properties props;
// SessionBean 介面方法
public void ejbActivate() { if (verbose) System.out.println("ejbActivate called"); }
public void ejbRemove() { if (verbose) System.out.println("ejbRemove called"); }
public void ejbPassivate() { if (verbose) System.out.println("ejbPassivate called"); }
public void setSessionContext(SessionContext ctx) {
if (verbose) System.out.println("setSessionContext called");
this.ctx = ctx; props = ctx.getEnvironment();
}
public void ejbCreate() { if (verbose) System.out.println("ejbCreate called"); }
// **** 商業邏輯 ****
// 唯一自行撰寫的代碼,其餘皆為宣告或介面方法實作
public String demoSelect() throws RemoteException {
return("hello world");
}
}
關鍵觀察:demoSelect() 是唯一發明的代碼,其餘皆為規格規定的樣板代碼。