J2EE (Java 2 Platform, Enterprise Edition) 整合 EJB、Servlet、JSP、JNDI、XML 等技術,支援瘦客戶端(瀏覽器+HTML)多層架構。本文以 J2EE SDK 1.2.1 為環境,完整演示從 HTML 輸入 → Servlet 控制 → Session Bean 業務邏輯 → 結果回顯的四層協作流程。
C:\J2EE\j2sdkee1.2.1C:\J2EE\jdk1.2.2PATH: %J2EE_HOME%\bin;%JAVA_HOME%\bin
CLASSPATH: %J2EE_HOME%\lib\j2ee.jar
J2EE_HOME: C:\J2EE\j2sdkee1.2.1
JAVA_HOME: C:\J2EE\jdk1.2.2
J2EE 定義四類組件:應用客戶端、EJB、Web 組件、Applet。本例建立:
角色分工:開發者寫 Bean/Servlet,組裝者打包部署,可由不同人員在不同階段完成。
<FORM METHOD="GET" ACTION="BonusAlias">
Enter social security Number: <INPUT TYPE="TEXT" NAME="SOCSEC">
Enter Multiplier: <INPUT TYPE="TEXT" NAME="MULTIPLIER">
<INPUT TYPE="SUBMIT" VALUE="Submit">
</FORM>
表單提交至 BonusAlias(部署時映射至 BonusServlet)。
public class BonusServlet extends HttpServlet {
private CalcHome homecalc;
public void init(ServletConfig config) throws ServletException {
try {
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("calcs"); // JNDI 查找 Home 介面
homecalc = (CalcHome) PortableRemoteObject.narrow(objref, CalcHome.class);
} catch (Exception e) { e.printStackTrace(); }
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
String socsec = request.getParameter("SOCSEC");
int multiplier = Integer.parseInt(request.getParameter("MULTIPLIER"));
Calc calculation = homecalc.create(); // 建立 Bean 實例
double calc = calculation.calcBonus(multiplier, 100.00); // 呼叫業務方法
// 輸出結果頁面
out.println("<H1>Bonus Calculation</H1>");
out.println("Soc Sec: " + socsec + "<br>");
out.println("Multiplier: " + multiplier + "<br>");
out.println("Bonus Amount: " + calc + "<br>");
} catch (Exception e) { e.printStackTrace(); }
out.close();
}
}
ctx.lookup("calcs") 取得 Home 介面參考PortableRemoteObject.narrow() 確保型別安全printStackTrace(),不可留空package Beans;
public interface CalcHome extends EJBHome {
Calc create() throws CreateException, RemoteException;
}
package Beans;
public interface Calc extends EJBObject {
double calcBonus(int multiplier, double bonus) throws RemoteException;
}
package Beans;
public class CalcBean implements SessionBean {
public double calcBonus(int multiplier, double bonus) {
return multiplier * bonus; // 核心業務邏輯
}
// 容器回調方法(本例無需自訂邏輯,保留空實作)
public void ejbCreate() {}
public void setSessionContext(SessionContext ctx) {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void ejbLoad() {}
public void ejbStore() {}
}
| 層次 | 組件 | 職責 |
|---|---|---|
| 第 1 層 (客戶端) | HTML + 瀏覽器 | 輸入/顯示 |
| 第 2 層 (Web 層) | Servlet | 請求分發、JNDI 查找、結果渲染 |
| 第 3 層 (EJB 層) | Session Bean | 核心業務計算 |
| 第 4 層 (資料層) | 資料庫 (下例擴展) | 持久化儲存 |
此範例完整展示 J2EE 四層架構核心協作:Servlet 作為 Web 層控制器,委派業務邏輯給 Session Bean,實現關注點分離。雖技術版本較舊 (J2EE 1.2),但「薄 Servlet、厚 EJB」分層思想、JNDI 查找、RMI-IIOP 遠端調用、容器管理生命週期等核心概念,在現代 Jakarta EE / Spring Boot 微服務架構中依然延續演化。