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

從 .NET 邁向開放標準:J2EE 核心概念與架構全解析(上)

     編輯:Java 相關知識

身為 .NET 開發人員,您是否正計畫將既有的電子商務應用程式移植至 Java 2 Platform, Enterprise Edition (J2EE)?抑或是想從零開始打造第一個 J2EE 專案?無論哪種情況,本指南都能助您快速上手。J2EE 是一套使用 Java 語言開發 Web 及分散式應用程式的平台獨立開放標準。我們將不僅介紹如何使用 Java 進行 J2EE Web 應用程式開發,更會將這些新知識與您在 .NET 開發經驗中熟悉的概念、技術做連結,助您平滑轉型。

為何選擇 J2EE?

若您猶豫是否投入新開發環境,不妨先看看 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 核心組件速覽

J2EE 由多個用於開發分散式應用的組件組成。您可用它構建 Web 應用、傳統 Client-Server 應用,並透過標準 API 連接關聯式資料庫等傳統資源。對於來自 ASP.NET 背景的開發者,Java Servlets 與 JavaServer Pages (JSP) 是最實用的兩大核心組件。

Java Servlets:伺服器端的請求處理器

Servlet 是在 Web 伺服器 (如 IIS、Apache) 中執行的 Java 類別,概念類似 ISAPI Filter、ASP.NET HttpHandler 或 CGI 程式。當用戶瀏覽器呼叫特定 URL 時啟動,Servlet 能存取 HTTP 請求的所有資訊,並直接產生回應內容,或將請求轉導至其他資源。實務上,多數 J2EE Web 應用主要將 Servlet 作為 HTML 表單提交的目標以處理用戶輸入,再將回應頁面生成委派給 JSP。

JavaServer Pages (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 文件。

Web 伺服器與應用程式伺服器:架構分工

ASP.NET 開發者熟知 ASP.NET Runtime 配合 IIS 運作,並可加入自訂 HttpHandler 與組件。這雖部署便利,卻鎖定在 Windows 平台。J2EE 採取不同架構:為實現跨平台,它不將 Servlet/JSP 執行引擎內嵌入 Web 伺服器,而是引入獨立的應用程式伺服器 來執行它們。大多數應用程式伺服器 (如 IBM WebSphere) 另提供外掛模組橋接特定 Web 伺服器 (如 IIS、Apache),讓您自由選擇 Web 伺服器。

這種架構帶來三大優勢:

  • Web 伺服器選擇自由: 可保留慣用的 Web 伺服器提供靜態頁面服務,應用程式伺服器專司動態元件。移植 ASP.NET 應用時,可並行運行 IIS 與 ASP.NET Runtime,分階段遷移,無需一次重寫。
  • 平台選擇自由: 一次編寫,部署至任何支援應用程式伺服器的作業系統 (Windows、AIX、Linux 等),不受特定 Web 伺服器平台限制。
  • 應用程式伺服器廠商選擇自由: 遵循業界標準的 Servlet/JSP 規範,應用程式可在 WebSphere Express、Apache Tomcat 等多種環境部署。J2EE 更定義標準打包格式 (WAR/EAR),讓應用程式無需重編譯即可在不同伺服器、平台間遷移。

應用程式伺服器如何執行 Servlet 與 JSP

J2EE 規範強制採用標準部署格式,核心是部署描述符 — 一份 XML 文件,定義 URL 到 Servlet 的對應映射。應用程式伺服器依此決定呼叫哪個 Servlet。

JSP 頁面在首次請求時,會被應用程式伺服器轉譯編譯成一個特殊的 Servlet 並載入記憶體,直到 JSP 檔案異動才會重新編譯。此機制類似 ASP.NET Runtime 處理 ASPX 頁面的方式,有效降低效能開銷。

模型-視圖-控制器 (MVC) 架構

J2EE 設計考量了 MVC 架構,明確分離三大層次:

  • 模型: 應用程式資料與業務規則 (業務邏輯)
  • 視圖: 使用者介面
  • 控制器: 定義應用程式如何回應用戶輸入或模型變化 (應用邏輯)

MVC 的實務優勢

雖 J2EE 不強制使用 MVC,但其鬆耦合特性極具價值。例如需支援同一資料的多種視圖 (不同部門看不同子集),MVC 讓資料庫存取代碼 (模型) 可被多個視圖元件重用。若視圖與資料存取緊耦合 (如傳統 ASP.NET 頁面混雜 SQL 與 HTML),每新增一視圖就得複製資料存取代碼,不僅維護困難、易出錯,更違反 DRY 原則。

J2EE 組件對應 MVC

典型流程:用戶提交表單至 Servlet (控制器) → Servlet 分析輸入、呼叫模型層業務邏輯 → 將結果傳遞給 JSP (視圖) 渲染呈現。注意模型與視圖無直接關聯,控制器扮演中介角色。

JavaServer Faces (JSF):豐富 UI 元件框架

若您使用過 ASP.NET Web Forms 開發 UI,JSF 就是 J2EE 世界的對應標準。JSF 提供執行期元件模型,支援工具廠商開發拖拉式視覺化設計工具,也允許廠商開發客製化元件。例如 WebSphere Studio 5.11 整合的 Page Designer 實作了 JSF 規範,提供 HTML 表單、DataGrid、DataList 等熟悉元件,並採用「Code-behind」模式 (以 Java 撰寫) 處理 UI 事件。

JSF 獨特的頁面導航樹結構,能將多頁面分組為邏輯樹狀流程,適合根據用戶輸入或特徵動態決定導航路徑。每個頁面擁有邏輯名稱,事件處理代碼即可透過這些名稱控制分支流向。

其他關鍵 J2EE 技術

Servlet 與 JSP 奠基 Web 開發,以下技術提供進階企業級功能:

Enterprise JavaBeans (EJB):伺服器端業務元件

  • Session Bean: 類比 .NET COM+ 服務,運行於容器中,享有宣告式交易管理、角色安全、分散式透明存取、實例池化等服務。分無狀態 (方法間不保留狀態,容器可任意調度實例) 與有狀態 (維護會話狀態,適合對話式交互、重建中間狀態成本高的場景) 兩種。
  • Entity Bean: 進階版 ADO.NET DataSet 概念,為持久資料的物件表達,封裝資料模型關係,同樣運行於容器享有企業級服務。屬共享物件,容器處理並發控制並確保 ACID 特性。部署時可無程式碼變更對應不同持久存儲。
  • Message-Driven Bean: 充當 JMS 相容訊息中介軟體監聽器,針對特定隊列配置,訊息到達時由容器啟動執行應用邏輯。每個 J2EE 1.3 相容伺服器必內建 JMS 實作,也可整合 WebSphere MQ 等產品。

Java Connector Architecture (JCA)

存取 CICS、IMS、ERP、CRM 等傳統 EIS 系統的標準 API,免除學習各系統專屬 API 之苦。

Java 程式設計基礎:從 .NET 視角快速上手

本節假設您專注於伺服器端 Web 開發,略過 GUI 部分,聚焦非視覺化核心。先介紹 Java SDK、Hello World 入門,再深度比較 Java 與 VB.NET、C# 的異同。內容節選自 Scott Stricker 教程《Java programming for C/C++ developers》。

Java SDK 簡介與安裝

Java SDK 包含命令列工具 (javac 編譯器、java 解譯器) 與基礎類別庫 (Java Platform)。Java 程式編譯為平台獨立位元組碼,執行時由 JIT 編譯器轉為原生碼。建議下載最新 Java 1.4.2 SDK (免費),安裝選「典型安裝」,勾選安裝原始碼 (src.zip) 以利研讀核心類別實作。安裝後需配置環境變數 (PATH、CLASSPATH),詳見 SDK 文件。

第一個 Java 程式:Hello World

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。執行於受管環境,執行期錯誤可被優雅處理。

Java vs Visual Basic .NET 核心差異

類型系統

兩者皆為單一繼承物件導向語言,根類別分別為 System.Object (VB.NET) 與 java.lang.Object (Java)。Java 引入原始類型 (primitive types),非物件、無方法、參數傳遞永為傳值。對應關係如下:

Java 原始類型描述VB.NET 對應描述
int32-bit 有號整數Integer32-bit 有號整數
long64-bit 有號整數Long64-bit 有號整數
short16-bit 有號整數Short16-bit 有號整數
char16-bit 無號整數 (Unicode)Char16-bit 無號整數
byte8-bit 有號整數Byte8-bit 無號整數
booleantrue/falseBooleanTrue/False
float32-bit 浮點數Single32-bit 浮點數
double64-bit 浮點數Double64-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;

封裝重用:JAR vs Assembly

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 用與類別同名方法。多載語法類似。

屬性 vs 欄位

VB.NET Property 整合 Get/Set;Java 用欄位 + 獨立 getXxx()/setXxx() 方法 (JavaBeans 慣例)。

小結:VB.NET 開發者的遷移建議

VB.NET 語法雖延續傳統,但已引入繼承、介面、異常處理等 OO 特性,與 Java 相似度高。建議先嘗試移植小型 VB.NET 程式,善用 Java Platform 文件查找對應 System.* 命名空間的類別。

Java vs C# 核心差異

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# 開發者的遷移建議

C# 背景讓遷移 Java 相對容易。語法、概念高度相似 (繼承、介面、異常處理幾乎相同)。建議先移植小型 C# 程式,善用 Java 文件對照 System.* 類別。

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