當客戶端 (Servlet、JSP、另一個 EJB) 與 Session Bean 部署在同一個 JVM (同一個應用伺服器) 時,使用本地介面 可避免 RMI 序列化/網路開銷,效能大幅提升。本文示範本地介面定義、JSP 呼叫流程與 JNDI 命名規則。
package service;
import java.util.List;
import javax.ejb.Local;
@Local
public interface ShoppingCart {
void addCommodity(String value);
List<String> getCommodity();
}
@Local:標記為本地業務介面RemoteException同一個 Bean 類別可同時實作遠端與本地介面:
@Stateful
public class ShoppingCartBean implements ShoppingCart, ShoppingCartRemote {
// 實作內容參考前文「有狀態 SessionBean」
private List<String> shoppingCart = new ArrayList<String>();
// ... 實作方法
}
JBossWeb)<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"
import="java.util.List, java.util.Properties,
javax.naming.InitialContext, service.ShoppingCart" %>
<html>
<body>
<%
Properties prop = new Properties();
InitialContext ctx = new InitialContext();
// 關鍵:JNDI 名稱以 /local 結尾
ShoppingCart shoppingCart = (ShoppingCart) ctx.lookup("ShoppingCartBean/local");
shoppingCart.addCommodity("自行車");
shoppingCart.addCommodity("筆記本電腦");
shoppingCart.addCommodity("液晶電視");
List<String> commodities = shoppingCart.getCommodity();
for (String commodity : commodities) {
System.out.println(commodity); // 輸出至 Eclipse Console
}
%>
</body>
</html>
| 介面類型 | JNDI 名稱格式 | 範例 | 適用場景 |
|---|---|---|---|
| 遠端 | Bean名/remote (JAR)耳名/Bean名/remote (EAR) | ShoppingCartBean/remote | 跨 JVM、跨機器、非 Java 客戶端 |
| 本地 | Bean名/local (JAR)耳名/Bean名/local (EAR) | ShoppingCartBean/local | 同 JVM 內:Servlet、JSP、EJB 互呼 |
| 限制 | 說明 |
|---|---|
| 跨應用伺服器叢集 | 叢集環境下本地介面僅限同節點,跨節點需遠端介面或叢集感知機制 |
| 傳遞非序列化物件 | 本地介面允許,但若未來遷移為遠端將失效,建議實作 Serializable |
| 安全傳播 | 本地呼叫自動傳播呼叫者 Principal/Role,遠端需配置 Security Domain |