Session Bean 代表客戶與 EJB 容器的會話,封裝業務邏輯並協調 Entity Bean 或直接存取資料庫。本文以經典「HelloWorld」示範完整開發流程:先定義介面,再實現 Bean,最後部署驗證。
先設計客戶如何使用 (Remote/Home),再編寫 Bean 邏輯,避免介面與實現脫節。
package usingJ2EE.hello;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface HelloWorldSession extends EJBObject {
String getGreeting() throws RemoteException;
void setGreeting(String greeting) throws RemoteException;
}
package usingJ2EE.hello;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface HelloWorldSessionHome extends EJBHome {
HelloWorldSession create() throws RemoteException, CreateException;
HelloWorldSession create(String initialGreeting) throws RemoteException, CreateException;
}
package usingJ2EE.hello;
import javax.ejb.*;
public class HelloWorldSessionImpl implements SessionBean {
private String greeting;
private SessionContext context;
public HelloWorldSessionImpl() {} // public 無參建構子
// 容器回調:注入 SessionContext
public void setSessionContext(SessionContext ctx) { this.context = ctx; }
// 對應 Home.create()
public void ejbCreate() throws CreateException { greeting = "Hello World!"; }
// 對應 Home.create(String)
public void ejbCreate(String g) throws CreateException { greeting = g; }
// 生命週期回調 (Stateful Bean 才會真正觸發 Passivate/Activate)
public void ejbActivate() {}
public void ejbPassivate() {}
public void ejbRemove() {}
// 業務方法 (不拋 RemoteException)
public String getGreeting() { return greeting; }
public void setGreeting(String g) { greeting = g; }
}
HelloWorldSession
usingJ2EE.hello.HelloWorldSessionHome
usingJ2EE.hello.HelloWorldSession
usingJ2EE.hello.HelloWorldSessionImpl
Stateful
Container
Context ctx = new InitialContext();
HelloWorldSessionHome home = (HelloWorldSessionHome)
PortableRemoteObject.narrow(ctx.lookup("java:comp/env/ejb/HelloWorld"),
HelloWorldSessionHome.class);
HelloWorldSession session = home.create("Hi EJB!");
System.out.println(session.getGreeting()); // 輸出: Hi EJB!
session.remove();
create,Bean 實現 ejbCreate,容器負責映射。setSessionContext 注入的上下文,用於 getEJBObject()、getUserTransaction() 等。greeting 狀態);Stateless 則無 ejbActivate/Passivate 實際觸發。EJB 3.0+ (JPA、CDI、@Stateless/@Stateful 註解) 已大幅簡化此模型,但理解 2.x 架構有助於掌握容器服務 (事務、安全、並發、遠程) 的本質運作方式。