J2EE開發n層應用
摘要:在這篇文章中,我們將介紹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。
![]() (兩層的應用體系) |
為了解決這個兩層體系的不足,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)
JNDI API被用來訪問命名和目錄服務。它提供一個相容的模式來訪問和操作企業范圍大的資源,例如一個應用服務器中的DNS、LDAP、本地文件系統或者對象。
在JNDI中,一個目錄結構中的每一個節點被稱為context。每一個JNDI的名字都是與一個context相對的,沒有一個絕對名字的概念。一個應用可以使用InitialContext類來得到它的第一個context:
Context ctx = new InitialContext();
通過這個初始的context,應用就可以經過目錄樹定位到需要的資源或者對象。例如,假定你已經在WebLogic Server中配置了一個EJB,并且在myApp.myEJB中綁定了home接口。EJB的客戶端,在得到這樣一個初始的context后,然后就可以使用以下的代碼來定位到home接口:
MyEJBHome home = ctx.lookup( "myApp.myEJB" );
一旦你得到你所需對象的一個引用--在這個例子中,就是EJB的home接口--然后你可以調用它上面的方法。我們將在后面的“企業Java Beans(Enterprise Java Beans)”中進一步討論它。
以上關于JNDI的討論,只是它的冰山一角。為了在一個context中查找到一個對象,JNDI還提供方法可以做到:
插入或者綁定一個對象到一個context中。在你配置一個EJB時,這是非常有效的方法;
從一個context中移去一個對象
列出一個context中的所有對象
創建和刪除subcontexts
接著,我們將介紹EJB
企業Java Beans(Enterprise Java Beans,EJB)
J2EE其中一個引人注目的技術是EJB。它提供了一個架構來開發和配置到客戶端的分布式商業邏輯,因此可以明顯減少開發擴展性、高度復雜企業應用的難度。EJB規范定義了EJB組件應該如何及何時與它們的容器交互。由容器來負責提供普通的服務,例如目錄服務、事務管理、安全、資源池和容錯。
EJB規范定義了三類基本的bean:
無狀態的session beans(Stateless session beans):這是一個單一使用的服務,不維護任何的狀態,在服務器崩潰時也不再存在,而且生存期也相對地短。例如,一個無狀態的session bean可能用作執行溫度轉換。
有狀態的session bean:它提供了一個傳統的與客戶端交互的方法,存儲客戶端的狀態。在線購物車就是這樣一個有狀態session ean的典型例子。有狀態session beans在服務器崩潰時也不再存在,而且生存期也相對地短,并且每個實例只可以用在一個單一的線程中。
實體bean(Entity beans):這是持久保存數據的代表--典型的是存儲在數據庫中--因此在服務器崩潰后數據仍然存在。多個客戶端可以使用EJB來表示同樣的數據。實體EJB的例子是:一個用戶的帳號信息。
雖然它們有不同,不過所有的EJB也有不少相同的地方。它們都有一個home的接口,用來定義一個客戶如何創建和消除EJB;一個遠程的接口,定義客戶端可以調用哪些bean上的方法;以及一個實現主商業邏輯的bean類。
至于如何開發一個EJB,這已經超出了這篇文章的討論范圍。不過,如果已經開發或者由第三方得到了一個EJB,你就需要在你的應用服務器上配置它。WebLogic Server 5.1帶有一個EJB Deployer Tool來幫助你配置EJB。當你使用EJB Deployer Tool來配置一個EJB時,你需要指定JNDI的名字,以便客戶端可以找到這個EJB。然后 Deployer Tool會產生封裝的類來處理與容器的通信,并且與一些必要的Java類綁定在一起到一個jar文件中。
一旦EJB配置好,客戶端就可以使用它的JNDI名字來查找到該EJB。首先,它必須獲得到home接口的一個引用。然后,使用這個接口,客戶端就可以調用bean的create()方法,以獲得服務器上運行的bean實例的一個句柄。最后,客戶端就可以使用這個句柄來調用bean上的方法。
接著,我們將討論JSP。
JavaServer Pages (JSPs)
或許你已經對微軟的Active Server Pages (ASPs)非常熟悉;JSP也是類似的技術,不過它是平臺無關的。它們都是設計來幫助web內容開發者使用相對較少的代碼就可以創建動態的網頁。web設計者即使不懂得編程,也可以使用JSP來創建動態的網頁。JavaServer Page是HTML代碼和Java代碼的混合。在客戶請求頁面的時候,服務器就會處理Java代碼,然后返回HTML頁面給瀏覽器。
讓我們看一個JSP的簡單例子,它用來顯示服務器的當前日期和時間。至于具體的細節講解,已經超出了本文的討論范圍;不過,你要注意到在< %和%>符號間的是Java代碼,< %= 和 %>間的是Java表達式,表示輸出。
< html> < head> < title>Sample JSP Page< /title> < /head> < body> < h1>Date JSP sample< /h1> < h2> < % response.setHeader("Refresh", 5); %> The current date is < %= new Date() %>. < /h2> < /body> < /html> |
你可以也聽過JHTML,它是一個舊的標準,現在已經被JSP取代了。WebLogic Server不但支持JSP,還支持JHTML。不過,在默認設置下,WebLogic Server是不支持JSP的(對于5.1版本)。你必須編輯weblogic.properties來激活web服務器,對于JSPServlet來說,也是這樣。
Java servlets
servlets提供的功能大部分JSP相同,它采用的是一個有點不同的方法。JSP中大部分是HTML代碼,其中只有少量的Java代碼,而servlets則相反,它完全使用Java編寫,并且產生HTML代碼。
servlet是一個在服務器上運行的Java小程序,它可以擴展Web服務器的功能。這些服務器端的應用可以在被請求時動態執行,與傳統Web服務器上的CGI Perl腳本差不多。CGI腳本和servlet的一個主要不同是:CGI腳本對于每次請求都啟動一個全新的進程--需要額外的系統開銷--而servlet的執行只要在servlet引擎內啟動一個獨立的線程就性了。因此Servlet的擴展性也更好。
在開發servlet時,你通常都要擴展javax.servlet.http.HttpServlet類,并且覆蓋它的一些方法。感興趣的方法包括有:
service(): 作為command-specific方法的一個調度程序
doGet(): 處理來自一個客戶的HTTP GET請求
doPost(): 處理來自一個客戶的HTTP POST請求
還有一些其它的方法來處理不同類型的HTTP請求--可參考HttpServlet API的文本來得到更多相關的信息。
以上討論的方法是標準的J2EE Servlet API全部標準的部分。WebLogic Server實現了所有的API。一旦你開發了自己的servlet,通過在weblogic.properties文件中注冊,你就可以在WebLogic Server中配置它。
以上我們已經介紹了J2EE主要的技術,在下面的部分,我們將簡要地介紹余下的技術,包括有RMI, Java IDL and CORBA, JTA和XML。
Java IDL/CORBA
通過Java的IDL支持,開發者可以將Java與CORBA集成。他們可以創建能配置在一個CORBA ORB中的Java對象,也可以創建作為配置在其它ORB內的CORBA對象客戶端的Java類。對于通過Java將你的新應用和以前的系統集成,后者提供了一個另外的方法。
Java事務體系(JTA)/Java事務服務(JTS)
JTA定義了一個標準的API,應用可以通過它來訪問事務監控器。
JTS是CORBA OTS事務監控器的一個基本實現。JTS指定了一個事務管理器的實現(Transaction Manager),這個管理器在一個高級別上支持Java事務API(JTA)規范,并且在一個低級別上實現了OMG OTS規范的Java映射。一個JTS事務管理器為應用服務器、資源管理器、standalone應用和通信資源管理器提供事務服務。
JavaMail和JavaBeans激活架構(JavaBeans Activation Framework,JAF)
JavaMail是一個用來訪問郵件服務器的API。JavaMail API提供了一套抽象類來模型化一個郵件系統。支持SMTP和IMAP服務器。
JavaMail通過使用JavaBeans Activation Framework (JAF) 來處理MIME加密的郵件附件。MIME字節流和Java對象間可以互相轉化。大多數的應用無需要直接使用JAF。
Java信使服務(Java Messaging Service,JMS)
JMS是一個用來和面向信息的中層通信的API。它不但支持點對點的域,也支持發布/訂閱域,并且提供對擔保信息傳送、事務信息傳送、持久信息和durable subscribers的支持。對于將你的應用和以前的backend系統集成,JMS提供了另外一個方法。
擴展標記語言(Extensible Markup Language,XML)
XML是一個用來定義其它標記語言的的語言。它可被用作商業之間的數據共享。XML的發展是與Java分開的;不過,它的目標和Java類似,都是為了與平臺無關。通過將Java與XML結合,你可以得到一個完全平臺無關的解決方案。多個公司都為在Java和XML間開發一個緊密的集成而工作。具體的信息,可瀏覽Sun站點的Java-XML部分(http://java.sun.com/xml),以及IBM的developerWorks的XML Zone部分(http://www.ibm.com/developer/xml/)。
結論
在這篇文章中,我們介紹了建立在J2EE上的分布體系,對于WebLogic Server對J2EE的支持,我們也作了介紹。當然,對于J2EE的介紹,以上只是冰山一角。
我們集中介紹了你通常要使用的J2EE技術:JDBC, JNDI, EJBs, JSPs和servlets。我們也介紹了一些沒有那么知名的J2EE技術的背景信息。不論你是一個開發者、商業分析家或者項目經理,對于J2EE和WebLogic Server可為你、你的企業或者你的企業應用帶來些什么,現在你將有一個不錯的概念了。
【責任編輯:方舟 頻道主編:趙家雄】 |