摘要:在這篇文章中,我們將介紹13種J2EE(Java 2平台企業版)的核心技術:JDBC,JNDI,EJBs,RMI,jsp,Java servlets,XML,JMS,Java IDL,JTS,JTA,JavaMail和JAF。為了更好地說明這些技術在實際中的應用,本文將通過BEA System的WebLogic Server來介紹。
Java起初是運用在浏覽器和客戶計算機上的,當時,很多人都懷疑它是否適合用作服務端的開發。現今,隨著越來越多的第三方對Java 2平台企業版(J2EE)的支持,Java已經被廣泛用來開發企業級的服務器端應用。
J2EE平台包含有一整套的服務、應用編程接口(API)和協議,可用於開發多層的基於Web的應用。
在這篇文章中,我們將討論構成J2EE的13種核心技術:JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail和JAF。我們將介紹每種技術適合用在哪裡;我們還將介紹每種不同的技術之間是如何通信的。
為了更好地說明J2EE在現實中的應用,我們將通過WebLogic Server來介紹其中主要的技術,WebLogic Server來自BEA Syetem,它是一個廣泛使用的J2EE工具。要注重的是,這篇介紹性文章的閱讀對象是對WebLogic Server和J2EE不熟悉的開發者、以及對J2EE感愛好的項目經理和商業分析者。
分布式體系和J2EE
以前,兩層的應用--也稱為客戶/服務器應用是很常見的。圖1表示的就是一個典型的兩層體系。在一些情況下,服務器提供的唯一服務就是數據庫服務。在這種情形下,客戶端負責數據訪問、應用商業邏輯、將結果轉換為一個格式以便顯示,為用戶顯示內部的接口,以及接受用戶的輸入。客戶/服務器的體系在開始的時候很輕易配置,不過難於升級或者擴展,而且通常基於私有的協議--典型的是私有的數據庫協議。商業和表現邏輯的重新使用也很難。在Web領域中,可能最重要的就是擴展,而兩層的應用不便於升級擴展,因此不適合用在Internet。
**圖1***************
(兩層的應用體系)
為了解決這個兩層體系的不足,Sun設計了J2EE。J2EE定義了一套標准,可輕松地開發n層的企業應用。它定義了一套標准化、模塊化的組件;並為這些組件提供了一整套完整的服務;以及自動處理應用行為的許多細節---例如安全和多線程。
使用J2EE來開發n層的應用,要將原來的2層體系細分為多個不同的層。一個n層的應用能夠為以下的每個服務提供獨立的層:
表現:在一個典型的Web應用中,運行在客戶機器上的浏覽器負責處理表現
動態產生表現:雖然浏覽器可以處理一些動態產生的表現,不過為了支持多種不同的浏覽器,大部分的動態產生都應該在Web服務器進行,通過使用JSP,servlet或者XML(Extensible Markup Language,擴展標記語言)和XSL(Extensible Stylesheet Language,擴展樣式表語言)。
商業邏輯:實現商業邏輯的最佳方法是通過Session EJB(下文將會提及)。
數據訪問:實現數據訪問的最佳方法是在Entity EJB(下文將會提及),以及使用JDBC。
Backend系統集成:可使用各種不同的技術來與backend系統集成。最佳的選擇在於backend系統的確切種類。
你也許會問:為什麼要這麼多層呢?這是由於分層的方法可得到一個更便於擴展的企業應用。它可讓每個層集中在一個特定的角色上--例如,讓一個Web服務器提供網頁服務,一個應用服務器來提供給用服務,以及一個數據庫服務器來提供數據庫服務。
由於J2EE構建在Java 2平台標准版本上(J2SE),因此它可提供與J2SE一樣的所有優點和特色。包括有“寫一次,到處運行”的便利、用作數據庫訪問的JDBC,與現有企業資源交互的CORBA技術,以及一個經過驗證的安全模型。在這個基礎上,J2EE還加入了對企業JavaBean(EJB)組件、Java servlets, JavaServer Pages (JSPs)和XML技術的支持。
WebLogic Server的分布式體系
J2EE提供了一個框架--一個標准的API--用作開發分布式的體系。實現這個框架的引擎工具留給第三方廠商完成。一些廠商將著重於實現J2EE體系中的某些組件。例如,Apache的Tomcat為JSP和servlet提供支持。BEA System通過它的WebLogic Server產品實現了J2EE的全部特性。
通過提供J2EE規范的一個完整實現,WebLogic Server可用來建立及配置易於擴展和分布式的應用。WebLogic Server和J2EE為你處理一些常見的編程任務。包括有提供事務服務,安全領域、認證信息、命名和目錄服務、數據庫訪問和連接池、線程池、負載均衡和容錯。
通過以一種易於使用和標准的方式提供這些常見的服務,類似WebLogic Server的產品可提供更富擴展性和便於維護的應用。結果是可為大量的用戶提供可用性更強的應用。
J2EE技術
在以下的部分中,我們將討論構成J2EE的每一種技術,並且看看WebLogic Server如何在一個分布式的應用中支持它們。最常用的J2EE技術可能是:JDBC, JNDI, EJB, JSPs和servlets,因此我們也著重討論這些方面。
圖2表示了在一個分布式的應用中,每項J2EE技術最常用在哪裡。
****圖2************
(n層應用體系的一個例子)
Java數據庫連接(JDBC)
JDBC API以一個統一的方式訪問各種數據庫。與ODBC類似,JDBC將開發者和私有數據庫之間的問題隔離開來。由於它建立在Java上,因此JDBC可以提供平台無關的數據庫訪問。
JDBC定義了4種不同的驅動,具體來說,包括有:
類型1:JDBC-ODBC橋
在JDBC剛產生時,JDBC-ODBC橋是非常有用的。通過它,開發者可以使用JDBC來訪問一個ODBC數據源。缺點是,它需要在客戶機器上安裝有一個ODBC驅動,該機器通常是應該運行微軟Windows系統的。使用這一類的驅動器,你就會失去JDBC平台無關的好處。此外,ODBV驅動器需要客戶端的治理。
類型2:JDBC-native驅動橋
JDBC-native驅動橋提供了一個建築在本地數據庫驅動上的JDBC接口--沒有使用ODBC。JDBC驅動將標准的JDBC調用轉變為對數據庫API的本地調用。使用類型2的驅動也會失去JDBC平台無關性的好處,並且需要安裝客戶端的本地代碼。
類型3:JDBC-network橋
JDBC-network橋不需要客戶端的數據庫驅動。它們使用網絡-服務器中層來訪問一個數據庫。這會引出諸如負載均衡、連接池等技術,數據緩沖也是可能的。由於類型3的驅動通常可帶來相對小的下載時間,它是平台無關的,並且不需要客戶端的安裝和治理,因此很適合用作Internet的應用。
類型4:純Java驅動
類型4使用純Java數據庫驅動來提供直接的數據庫訪問。由於類型4驅動運行在客戶端,並且直接訪問數據庫,因此運行在這個模式暗示要使用一個兩層的體系。要在一個n層的體系中使用類型4的驅動,可以通過一個包含有數據訪問代碼的EJB,並且讓該EJB為它的客戶提供一個數據庫無關的服務。
WebLogic Server為一些很常用的數據庫提供了JDBC驅動器,包括有Oracle、Sybase、Microsoft SQL Server, 和Informix。它還帶有一個Cloudscape的JDBC驅動,這是一個純Java DBMS,不過WebLogic Server自帶的是一個評估版本。
接著我們來看一個例子。
JDBC例子
在例子中,我們假設你已經在Cloudscape中設置了一個PhoneBook數據庫,該數據庫包含有一個CONTACT_TABLE表,裡面有NAME和PHONE字段。我們首先載入Cloudscape的JDBC驅動,接著向driver manager請求獲得一個到PhoneBook Cloudscape數據庫的一個連接。使用這個連接,我們建立了一個Statement對象,並且使用它來執行一個簡單的SQL查詢。最後,循環得到結果集的所有項目,將NAME和PHONE字段的內容寫入到標准的輸出中。
import java.sql.*;
public class JDBCExample
{
public static void main( String args[] )
{
try
{
Class.forName("COM.cloudscape.core.JDBCDriver");
Connection conn = DriverManager.getConnection("jdbc:cloudscape:PhoneBook");
Statement stmt = conn.createStatement();
String sql = "SELECT name, phone FROM CONTACT_TABLE ORDER BY name";
ResultSet resultSet = stmt.executeQuery( sql );
String name;
String phone;
while ( resultSet.next() )
{
name = resultSet.getString(1).trim();
phone = resultSet.getString(2).trim();
System.out.println( name + ", " + phone );
}
}
catch ( Exception e )
{
// Handle exception here
e.printStackTrace();
}
}
}
接著,我們將介紹JDBC在企業應用中的使用。
企業應用中的JDBC
上面的例子是很簡單的。它使用的仍然是一個兩層的體系。在一個n層的企業應用中,客戶將與一個EJB通信,並且會進行數據庫的連接。為了提高擴展性和性能,WebLogic Server提供連接池(connection pools)的支持。
通過在服務器啟動的時候建立一個數據庫的連接池,連接池可減少建立和中斷數據庫連接時的系統開銷。假如有數據庫連接的需求,WebLogic Server可從池中選擇一個,而不是創建一個。WebLogic Server的連接池在weblogic.properties中定義(具體可參考你的weblogic.properties中的例子和Weblogic Server中的文檔)。
另一個企業應用中經常用到的數據庫特性是支持事務。事務是一組語句,不過為了保持數據的完整性,這組語句都被看成是一個單一的語句。默認的情況下,JDBC工作在自動提交(auto-commit)的事務模式。你可以使用Connection類的setAutoCommit()方法來覆蓋它。
現在我們對JDBC已經有一個了解了。接著我們將介紹JNDI。
Java命名和目錄接口(Java Naming and Directory Interface,JNDI)
JN