com.yourcompany.ejb3
├── RemoteHelloWorld.java // 遠程業務接口
├── LocalHelloWorld.java // 本地業務接口
├── HelloWorldBean.java // Bean 實現類
├── jndi.properties // 客戶端 JNDI 配置
└── hello.jsp // Web 客戶端測試
package com.yourcompany.ejb3;
public interface RemoteHelloWorld {
String say(String name);
}
package com.yourcompany.ejb3;
public interface LocalHelloWorld {
String say(String name);
}
package com.yourcompany.ejb3;
import javax.ejb.Stateless;
import javax.ejb.Remote;
import javax.ejb.Local;
@Stateless
@Remote({RemoteHelloWorld.class})
@Local({LocalHelloWorld.class})
public class HelloWorldBean implements RemoteHelloWorld, LocalHelloWorld {
public String say(String name) {
return \"這是一個無狀態的 EJB3 會話 BEAN,作者:\" + name;
}
}
關鍵點:@Stateless 聲明無狀態會話 Bean;@Remote/@Local 綁定業務接口;實現類同時實現兩接口。
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
<%
Properties props = new Properties();
props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(\"jndi.properties\"));
InitialContext ctx = new InitialContext(props);
RemoteHelloWorld remote = (RemoteHelloWorld) ctx.lookup(\"HelloWorldBean/remote\");
out.println(remote.say(\"Christina007[remote]\") + \"
\");
LocalHelloWorld local = (LocalHelloWorld) ctx.lookup(\"HelloWorldBean/local\");
out.println(local.say(\"Christina007[local]\") + \"
\");
%>
這是一個無狀態的 EJB3 會話 BEAN,作者:Christina007[remote]
這是一個無狀態的 EJB3 會話 BEAN,作者:Christina007[local]
JBoss EJB3 默認綁定名:Bean類簡名/remote、Bean類簡名/local。可通過 @RemoteBinding/@LocalBinding 自定義。
@Stateless、@Remote、@Local。jndi.properties,通過 InitialContext.lookup() 獲取代理調用。EJB 3.0 摒棄了 2.x 繁瑣的 Home/Component 接口、部署描述符,以註解驅動、POJO 開發模型大幅降低門檻,是 Java EE 邁向輕量化的關鍵里程碑。