首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

Java EE 6 Web 開發新範式:EJB 3.1 內嵌於 WAR 實戰 (上)

     編輯:J2EE

前言:EJB 3.1 打破包裝邊界,讓企業級組件輕裝上陣

Java EE 6 (JSR 316) 引入的 EJB 3.1 (JSR 318) 帶來里程碑式改進:**EJB 組件可直接打包在 WAR 的 `WEB-INF/classes` 或 `WEB-INF/lib/*.jar` 中**,無需獨立的 `ejb-jar.xml` 或 EAR 封裝。這意味著 Web 應用即可擁有事務、安全、並發、定時、異步等企業級服務,極大簡化了輕量級應用的部署與開發模型。本文通過 NetBeans 6.9 + GlassFish 3.0.1 實戰演示,展示如何創建、部署、測試內嵌 EJB 的 WebService。

1. 環境準備

  • JDK 6 或 7
  • NetBeans 6.9 (內建 GlassFish 3.0.1)
  • 或獨立安裝 GlassFish 3.0.1+ + 任意 IDE (Eclipse/IntelliJ)

2. 創建 Web 應用專案 (NetBeans)

  1. File → New Project → Java Web → Web Application
  2. 專案名:`EJBInWarDemo`,位置自選
  3. Server:GlassFish Server 3.0.1,Java EE Version:Java EE 6
  4. Finish

NetBeans 創建 Web 專案

指定專案位置

選擇 GlassFish 3.0.1

3. 編寫無狀態 Session Bean (內嵌於 WAR)

在 `src/java/com/demo/ejb` 下創建 `CalculatorBean.java`:

package com.demo.ejb;

import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

@Stateless
@WebService(serviceName = "CalculatorService")
public class CalculatorBean {

    @WebMethod(operationName = "add")
    public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
        return a + b;
    }

    @WebMethod(operationName = "multiply")
    public int multiply(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
        return a * b;
    }
}

關鍵點:

  • 無需 `ejb-jar.xml`,註解完全替代部署描述符。
  • 類直接放在 `WEB-INF/classes` (或打包在 `WEB-INF/lib/ejb.jar`)。
  • 同時加上 `@WebService` 即暴露為 JAX-WS 端點,GlassFish 自動發布 WSDL。

4. 部署與驗證

  1. 右鍵專案 → Run (或 Clean and Build 再 Deploy)
  2. NetBeans 啟動 GlassFish,部署 WAR,瀏覽器自動打開
  3. 訪問 WSDL:`https://localhost:8080/EJBInWarDemo/CalculatorService?wsdl`
  4. 使用 SOAP UI / Postman / `wsimport` 生成客戶端調用測試

5. 目錄結構對比:傳統 EAR vs Java EE 6 WAR 內嵌

層級傳統 EAR (Java EE 5)Java EE 6 WAR 內嵌
部署單元`.ear` 包含 `.war` + `.jar` (EJB)單一 `.war`
EJB 位置`ejb-module.jar` 在 EAR 根目錄`WEB-INF/classes` 或 `WEB-INF/lib/*.jar`
類加載隔離EAR 級 ClassLoader 隔離Web 應用單一 ClassLoader (簡化、但需注意依賴衝突)
共享庫EAR `lib/` 目錄`WEB-INF/lib/` (同 WAR)
部署描述符`application.xml` + `ejb-jar.xml` + `web.xml`可選 `web.xml`、`ejb-jar.xml` (註解優先)

6. 進階:EJB 3.1 新特性速覽

  • 單例:`@Singleton` + `@Startup` + `@PostConstruct` 啟動初始化、應用級緩存。
  • 異步:`@Asynchronous` + `Future` 返回值,容器管理線程池。
  • 定時器:`@Schedule` (日曆式) / `TimerService` (程式化),支援持久化定時器。
  • 無接口視圖:本地業務接口可省略,直接注入 Bean 類 (需無公共非最終方法衝突)。
  • 可移植全局 JNDI 名稱:`java:global[/app-name]/module-name/bean-name[!interface]`。

7. 常見坑與避坑指南

  1. 依賴衝突:WAR 單一 ClassLoader,若 EJB 與 Web 引用不同版本同一庫 → `LinkageError`。解決:統一版本、或模組化拆分為 EAR。
  2. 事務邊界:Servlet/Filter 中注入 EJB 時,預設事務屬性 `REQUIRED`,異常回滾。若需獨立事務 → EJB 方法加 `@TransactionAttribute(REQUIRES_NEW)`。
  3. WebService 線程安全:JAX-WS 端點預設多線程共享實例,確保無狀態或使用 `ThreadLocal`/請求範圍 Bean。
  4. GlassFish 版本:3.0.1 較舊,生產建議升級至 Payara / Eclipse GlassFish 5/6/7 (Jakarta EE 8/9/10)。

結語

EJB 3.1 內嵌 WAR 是 Java EE 6 向「輕量級、規範驅動、零配置」邁出的關鍵一步。它讓 Web 開發者以極低成本獲得企業級服務,同時保持 WAR 部署的簡潔性。下篇將深入實戰:單例啟動緩存、異步報表生成、定時器清理過期數據、RESTful 整合 (JAX-RS),並展示如何在 Maven/Gradle 專案中實現相同結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved