身為 .NET 開發人員,您是否正計畫將既有的電子商務應用程式移植至 Java 2 Platform, Enterprise Edition (J2EE)?抑或是想從零開始打造第一個 J2EE 專案?無論哪種情況,本指南都能助您快速上手。J2EE 是一套使用 Java 語言開發 Web 及分散式應用程式的平台獨立開放標準。我們將不僅介紹如何使用 Java 進行 J2EE Web 應用程式開發,更會將這些新知識與您在 .NET 開發經驗中熟悉的概念、技術做連結,助您平滑轉型。
若您猶豫是否投入新開發環境,不妨先看看 J2EE 帶來的實質優勢:
J2EE 定義了一組完善的標準規範,市面上存在多種 J2EE 實作供您部署代碼。只要堅持使用標準 API、避開廠商專屬擴充功能,您的應用程式無需修改程式碼即可在不同 J2EE 實作間自由遷移。
J2EE 實作支援從大型主機到 Wintel、UNIX、Linux 等多種平台。您只需編寫一次應用程式,即可部署至各種不同的作業系統環境。
J2EE 提供標準 API 存取 CICS、IMS、ERP、CRM 等傳統 EIS 系統,並內建 Web Services 支援,讓您能整合 .NET 系統及其他符合業界標準的系統。此外,Java Message Service (JMS) 提供標準訊息傳遞 API,Java Database Connectivity (JDBC) 則統一關聯式資料庫存取方式。這廣泛的整合能力,讓您在不犧牲既有系統投資的前提下,靈活串聯異質環境。
J2EE 規格由全球專家透過 Java Community Process (JCP) 共同制定。JCP 會公開草案徵求社群意見,即使您不主動參與,也能掌握未來技術走向。規格附帶的參考實作更讓您在決策前能先行試用驗證新技術。
J2EE 由多個用於開發分散式應用的組件組成。您可用它構建 Web 應用、傳統 Client-Server 應用,並透過標準 API 連接關聯式資料庫等傳統資源。對於來自 ASP.NET 背景的開發者,Java Servlets 與 JavaServer Pages (JSP) 是最實用的兩大核心組件。
Servlet 是在 Web 伺服器 (如 IIS、Apache) 中執行的 Java 類別,概念類似 ISAPI Filter、ASP.NET HttpHandler 或 CGI 程式。當用戶瀏覽器呼叫特定 URL 時啟動,Servlet 能存取 HTTP 請求的所有資訊,並直接產生回應內容,或將請求轉導至其他資源。實務上,多數 J2EE Web 應用主要將 Servlet 作為 HTML 表單提交的目標以處理用戶輸入,再將回應頁面生成委派給 JSP。
JSP 頁面類似 ASP.NET 頁面,都是包含伺服器端執行腳本的 HTML 頁面。關鍵差異在於:ASP.NET 使用 C#、VB.NET 等 .NET 語言,而 JSP 使用 Java 語言。典型 JSP 頁面交織著 Java 程式碼片段、JSP 專屬類 HTML 標籤與靜態 HTML,輸出動靜態混合內容。Servlet 與 JSP 的關係,概念上對應 ASP.NET 中 HttpHandler 與 ASPX 頁面的關係:前者為可直接輸出 HTML 的程式碼,後者為可內嵌程式碼的 HTML 文件。
ASP.NET 開發者熟知 ASP.NET Runtime 配合 IIS 運作,並可加入自訂 HttpHandler 與組件。這雖部署便利,卻鎖定在 Windows 平台。J2EE 採取不同架構:為實現跨平台,它不將 Servlet/JSP 執行引擎內嵌入 Web 伺服器,而是引入獨立的應用程式伺服器 來執行它們。大多數應用程式伺服器 (如 IBM WebSphere) 另提供外掛模組橋接特定 Web 伺服器 (如 IIS、Apache),讓您自由選擇 Web 伺服器。
這種架構帶來三大優勢:
J2EE 規範強制採用標準部署格式,核心是部署描述符 — 一份 XML 文件,定義 URL 到 Servlet 的對應映射。應用程式伺服器依此決定呼叫哪個 Servlet。
JSP 頁面在首次請求時,會被應用程式伺服器轉譯編譯成一個特殊的 Servlet 並載入記憶體,直到 JSP 檔案異動才會重新編譯。此機制類似 ASP.NET Runtime 處理 ASPX 頁面的方式,有效降低效能開銷。
J2EE 設計考量了 MVC 架構,明確分離三大層次:
雖 J2EE 不強制使用 MVC,但其鬆耦合特性極具價值。例如需支援同一資料的多種視圖 (不同部門看不同子集),MVC 讓資料庫存取代碼 (模型) 可被多個視圖元件重用。若視圖與資料存取緊耦合 (如傳統 ASP.NET 頁面混雜 SQL 與 HTML),每新增一視圖就得複製資料存取代碼,不僅維護困難、易出錯,更違反 DRY 原則。

典型流程:用戶提交表單至 Servlet (控制器) → Servlet 分析輸入、呼叫模型層業務邏輯 → 將結果傳遞給 JSP (視圖) 渲染呈現。注意模型與視圖無直接關聯,控制器扮演中介角色。
若您使用過 ASP.NET Web Forms 開發 UI,JSF 就是 J2EE 世界的對應標準。JSF 提供執行期元件模型,支援工具廠商開發拖拉式視覺化設計工具,也允許廠商開發客製化元件。例如 WebSphere Studio 5.11 整合的 Page Designer 實作了 JSF 規範,提供 HTML 表單、DataGrid、DataList 等熟悉元件,並採用「Code-behind」模式 (以 Java 撰寫) 處理 UI 事件。
JSF 獨特的頁面導航樹結構,能將多頁面分組為邏輯樹狀流程,適合根據用戶輸入或特徵動態決定導航路徑。每個頁面擁有邏輯名稱,事件處理代碼即可透過這些名稱控制分支流向。
Servlet 與 JSP 奠基 Web 開發,以下技術提供進階企業級功能:
存取 CICS、IMS、ERP、CRM 等傳統 EIS 系統的標準 API,免除學習各系統專屬 API 之苦。
本節假設您專注於伺服器端 Web 開發,略過 GUI 部分,聚焦非視覺化核心。先介紹 Java SDK、Hello World 入門,再深度比較 Java 與 VB.NET、C# 的異同。內容節選自 Scott Stricker 教程《Java programming for C/C++ developers》。
Java SDK 包含命令列工具 (javac 編譯器、java 解譯器) 與基礎類別庫 (Java Platform)。Java 程式編譯為平台獨立位元組碼,執行時由 JIT 編譯器轉為原生碼。建議下載最新 Java 1.4.2 SDK (免費),安裝選「典型安裝」,勾選安裝原始碼 (src.zip) 以利研讀核心類別實作。安裝後需配置環境變數 (PATH、CLASSPATH),詳見 SDK 文件。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Java 區分大小寫,關鍵字皆小寫。源檔名必須與類別名完全一致 (含大小寫),副檔名 .java。編譯:javac HelloWorld.java 產生 HelloWorld.class。執行:java HelloWorld (勿加 .class)。main() 方法對應 VB.NET Sub Main() 或 C# Main(),void 回傳對應 Sub,有回傳值對應 Function。執行於受管環境,執行期錯誤可被優雅處理。
兩者皆為單一繼承物件導向語言,根類別分別為 System.Object (VB.NET) 與 java.lang.Object (Java)。Java 引入原始類型 (primitive types),非物件、無方法、參數傳遞永為傳值。對應關係如下:
| Java 原始類型 | 描述 | VB.NET 對應 | 描述 |
|---|---|---|---|
| int | 32-bit 有號整數 | Integer | 32-bit 有號整數 |
| long | 64-bit 有號整數 | Long | 64-bit 有號整數 |
| short | 16-bit 有號整數 | Short | 16-bit 有號整數 |
| char | 16-bit 無號整數 (Unicode) | Char | 16-bit 無號整數 |
| byte | 8-bit 有號整數 | Byte | 8-bit 無號整數 |
| boolean | true/false | Boolean | True/False |
| float | 32-bit 浮點數 | Single | 32-bit 浮點數 |
| double | 64-bit 浮點數 | Double | 64-bit 浮點數 |
每種原始類型有對應包裝類別 (如 Integer 包裝 int),可將原始值當物件處理。VB.NET 則隱式將實值型別裝箱為 Object。Java 參數傳遞:原始類型傳值,物件參考傳值 (即參考本身的值),無 ByRef/ByVal 關鍵字。常用系統類別對應:java.lang.String↔String、java.math.BigDecimal↔Decimal、java.util.Date↔Date。Java 無結構與模組,所有代碼必屬於類別或介面。
兩者皆單一繼承、多介面實作。語法差異:
// VB.NET
Public Class Child
Inherits Parent
Implements IOne, ITwo
End Class
// Java
public class Child extends Parent implements IOne, ITwo { }
Java 用 extends 表繼承,implements 表實作介面 (逗號分隔)。
Java 套件 對應 VB.NET 命名空間,用於組織類別避免命名衝突。慣例:全小寫、反向網域名為前綴 (如 com.mycompany.myapp.utilities)。宣告與引用範例:
// VB.NET
Namespace MyApp.Utilities
Public Class Foo ... End Class
End Namespace
Imports MyApp.Utilities.Foo
// Java
package com.mycompany.myapp.utilities;
public class Foo { }
import com.mycompany.myapp.utilities.Foo;
VB.NET 編譯為 Assembly (DLL);Java 打包為 JAR (Java Archive) 檔 (.jar),本質為標準 ZIP。SDK 提供 jar.exe 工具操作。包名對應目錄結構 (點號轉路徑分隔符),編譯時 -d 指定根目錄。範例:
// 建立 package com.mycompany.test 的 Test.java
javac -d c:\javapack Test.java
// 產生 c:\javapack\com\mycompany\test\Test.class
jar -cvf Test.jar com
// 使用
java -classpath Test.jar com.mycompany.test.Test
或將 JAR 加入 CLASSPATH 環境變數 (分號分隔)。
public/private/protected 行為大同小異。VB.NET 預設 Friend (同組件);Java 預設 包內可見 + 子類別可見,近似 VB.NET Protected Friend。
VB.NET 需父方法非 private、標註 Overridable、子類用 Overrides、父方法非 NotOverridable。Java 條件較寬:父方法非 private、非 final,子類同名同簽章即隱含覆寫。Java final ≈ VB.NET NotOverridable。
結構幾乎相同 (源自 C++ 異常處理論文),皆有 Exception 基類。差異在編譯器檢查:VB.NET 可選擇捕獲或拋給呼叫者;Java 對受檢異常 (繼承 Exception 但非 RuntimeException) 強制要求捕獲或在方法簽章用 throws 宣告。捕獲所有異常:VB.NET 可省略 Catch 參數;Java 用 catch (Throwable e)。
Java 允許兩種語法:int[] arr; 或 int arr[];;VB.NET 僅 Dim arr() As Integer。兩者皆需顯式配置記憶體 (new int[30] / ReDim arr(30)),索引從 0 開始。
Java 無直接對應 VB.NET Delegate 的結構,可用單一方法介面模擬。
Java 強型別,等同 VB.NET Option Explicit On,變數必先宣告。
Java 無 OnError GoTo,完全靠異常機制。
VB.NET 用 Sub New();Java 用與類別同名方法。多載語法類似。
VB.NET Property 整合 Get/Set;Java 用欄位 + 獨立 getXxx()/setXxx() 方法 (JavaBeans 慣例)。
VB.NET 語法雖延續傳統,但已引入繼承、介面、異常處理等 OO 特性,與 Java 相似度高。建議先嘗試移植小型 VB.NET 程式,善用 Java Platform 文件查找對應 System.* 命名空間的類別。
C# 與 Java 相似度極高,重點說明差異。
根類別:System.Object (C#) vs java.lang.Object (Java)。原始類型對應:int/long/short/char/byte/boolean (Java) ↔ int/long/short/char/byte/bool (C#)。Java 需顯式包裝 (如 new Integer(i));C# 隱式裝箱。參數傳遞預設行為相同 (實值型別傳值、參考型別傳參考值),C# 另提供 ref 強制實值型別傳參考。系統類別對應:String↔string、BigDecimal↔decimal、Object↔object。
// C#
public class Child : Parent, IOne, ITwo { }
// Java
public class Child extends Parent implements IOne, ITwo { }
概念同 VB.NET。C# using 對應 Java import。慣例同前。
C# Assembly (DLL) vs Java JAR。操作方式同前。
C# 預設 private;Java 預設包內+子類可見,近似 C# internal (僅限同組件)。
C# 需父方法 virtual、子類 override、父非 sealed。Java 同前:父非 private/final 即隱含可覆寫。Java final ≈ C# sealed。
機制同 VB.NET。C# 捕獲區參數可省略;Java 用 Throwable。未捕獲受檢異常 Java 需 throws 宣告,C# 不需。
C# 僅 int[] arr;;Java 兩種皆可。
Java 無委派 (用單一方法介面模擬),無索引子 (寫成一般方法)。
Java 不支援 (C# 從 C++ 引入),可用方法模擬。
C# unsafe 允許指標操作繞過 GC;Java 語言層面無指標、無 unsafe,遵循「一次編寫,到處執行」哲學,避免平台相依、記憶體洩漏、失控代碼。
C# 背景讓遷移 Java 相對容易。語法、概念高度相似 (繼承、介面、異常處理幾乎相同)。建議先移植小型 C# 程式,善用 Java 文件對照 System.* 類別。