j2ee [編輯本段]J2EE簡介 J2EE Java2平台企業版(Java 2 Platform,Enterprise Edition) J2EE是一套全然不同于傳統應用開發的技術架構,包含許多元件,主要可簡化且規範應用系統的開發與部署,進而提高可移植性、安全與再用價值。 J2EE核心是一組技術規範與指南,其中所包含的各類元件、服務架構及技術層次,均有共通的标準及規格,讓各種依循J2EE架構的不同平台之間,存在良好的相容性,解決過去企業後端使用的資訊産品彼此之間無法相容,導緻企業内部或外部難以互通的窘境。 一、J2EE的概念 目前,Java 2平台有3個版本,它們是适用于小型裝置和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition,J2ME)、适用于桌面系統的Java 2平台标準版(Java 2 Platform Standard Edition,J2SE)、适用于建立伺服器應用程式和服務的Java 2平台企業版(Java 2 Platform Enterprise Edition,J2EE)。J2EE是一種利用Java 2平台來簡化企業解決方案的開發、部署和管理相關的複雜問題的體系結構。J2EE技術的基礎就是核心Java平台或Java 2平台的标準版,J2EE不僅鞏固了标準版中的許多優點,例如"編寫一次、随處運作"的特性、友善存取資料庫的JDBC API、CORBA技術以及能夠在Internet應用中保護資料的安全模式等等,同時還提供了對 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技術的全面支援。其最終目的就是成為一個能夠使企業開發者大幅縮短投放市場時間的體系結構。 J2體系結構提供中間層內建架構用來滿足無需太多費用而又需要高可用性、高可靠性以及可擴充性的應用的需求。通過提供統一的開發平台,J2EE降低了開發多層應用的費用和複雜性,同時提供對現有應用程式內建強有力支援,完全支援Enterprise JavaBeans,有良好的向導支援打包和部署應用,添加目錄支援,增強了安全機制,提高了性能。 二. J2EE的優勢 J2EE為搭建具有可伸縮性、靈活性、易維護性的商務系統提供了良好的機制: 1. 保留現存的IT資産: 由于企業必須适應新的商業需求,利用已有的企業資訊系統方面的投資,而不是重新制定全盤方案就變得很重要。這樣,一個以漸進的(而不是激進的,全盤否定的)方式建立在已有系統之上的伺服器端平台機制是公司所需求的。J2EE架構可以充分利用使用者原有的投資,如一些公司使用的BEA Tuxedo、IBM CICS, IBM Encina,、Inprise VisiBroker 以及Netscape Application Server。這之是以成為可能是因為J2EE擁有廣泛的業界支援和一些重要的'企業計算'領域供應商的參與。每一個供應商都對現有的客戶提供了不用廢棄已有投資,進入可移植的J2EE領域的更新途徑。由于基于J2EE平台的産品幾乎能夠在任何作業系統和硬體配置上運作,現有的作業系統和硬體也能被保留使用。 2. 高效的開發: J2EE允許公司把一些通用的、很繁瑣的服務端任務交給中間件供應商去完成。這樣開發人員可以集中精力在如何建立商業邏輯上,相應地縮短了開發時間。進階中間件供應商提供以下這些複雜的中間件服務: o 狀态管理服務 -- 讓開發人員寫更少的代碼,不用關心如何管理狀态,這樣能夠更快地完成程式開發。 o 持續性服務 -- 讓開發人員不用對資料通路邏輯進行編碼就能編寫應用程式,能生成更輕巧,與資料庫無關的應用程式,這種應用程式更易于開發與維護。 o 分布式共享資料對象CACHE服務 -- 讓開發人員編制高性能的系統,極大提高整體部署的伸縮性。 3. 支援異構環境: J2EE能夠開發部署在異構環境中的可移植程式。基于J2EE的應用程式不依賴任何特定作業系統、中間件、硬體。是以設計合理的基于J2EE的程式隻需開發一次就可部署到各種平台。這在典型的異構企業計算環境中是十分關鍵的。J2EE标準也允許客戶訂購與J2EE相容的第三方的現成的元件,把他們部署到異構環境中,節省了由自己制訂整個方案所需的費用。 4. 可伸縮性: 企業必須要選擇一種伺服器端平台,這種平台應能提供極佳的可伸縮性去滿足那些在他們系統上進行商業運作的大批新客戶。基于J2EE平台的應用程式可被部署到各種作業系統上。例如可被部署到高端UNIX與大型機系統,這種系統單機可支援64至256個處理器。(這是NT伺服器所望塵莫及的)J2EE領域的供應商提供了更為廣泛的負載平衡政策。能消除系統中的瓶頸,允許多台伺服器內建部署。這種部署可達數千個處理器,實作可高度伸縮的系統,滿足未來商業應用的需要。 5.穩定的可用性: 一個伺服器端平台必須能全天候運轉以滿足公司客戶、合作夥伴的需要。因為INTERNET是全球化的、無處不在的,即使在夜間按計劃停機也可能造成嚴重損失。若是意外停機,那會有災難性後果。J2EE部署到可靠的操作環境中,他們支援長期的可用性。一些J2EE部署在WINDOWS環境中,客戶也可選擇健壯性能更好的作業系統如Sun Solaris、IBM OS/390。最健壯的作業系統可達到99.999%的可用性或每年隻需5分鐘停機時間。這是實時性很強商業系統理想的選擇。 三. J2EE 的四層模型 J2EE使用多層的分布式應用模型,應用邏輯按功能劃分為元件,各個應用元件根據他們所在的層分布在不同的機器上。事實上,sun設計J2EE的初衷正是為了解決兩層模式(client/server)的弊端,在傳統模式中,用戶端擔當了過多的角色而顯得臃腫,在這種模式中,第一次部署的時候比較容易,但難于更新或改進,可伸展性也不理想,而且經常基于某種專有的協定??通常是某種資料庫協定。它使得重用業務邏輯和界面邏輯非常困難。現在J2EE 的多層企業級應用模型将兩層化模型中的不同層面切分成許多層。一個多層化應用能夠為不同的每種服務提供一個獨立的層,以下是 J2EE 典型的四層結構: 運作在用戶端機器上的客戶層元件 運作在J2EE伺服器上的Web層元件 運作在J2EE伺服器上的業務邏輯層元件 運作在EIS伺服器上的企業資訊系統(Enterprise information system)層軟體 J2EE應用程式元件 J2EE應用程式是由元件構成的.J2EE元件是具有獨立功能的軟體單元,它們通過相關的類和檔案組裝成J2EE應用程式,并與其他元件互動。J2EE說明書中定義了以下的J2EE元件: 應用用戶端程式和applets是客戶層元件. Java Servlet和JavaServer Pages(JSP)是web層元件. Enterprise JavaBeans(EJB)是業務層元件. 客戶層元件 J2EE應用程式可以是基于web方式的,也可以是基于傳統方式的. web 層元件 J2EE web層元件可以是JSP 頁面或Servlets.按照J2EE規範,靜态的HTML頁面和Applets不算是web層元件。 正如下圖所示的客戶層那樣,web層可能包含某些 JavaBean 對象來處理使用者輸入,并把輸入發送給運作在業務層上的enterprise bean 來進行處理。 業務層元件 業務層代碼的邏輯用來滿足銀行,零售,金融等特殊商務領域的需要,由運作在業務層上的enterprise bean 進行處理. 下圖表明了一個enterprise bean 是如何從用戶端程式接收資料,進行處理(如果必要的話), 并發送到EIS 層儲存的,這個過程也可以逆 向進行。 有三種企業級的bean: 會話(session) beans, 實體(entity) beans, 和消息驅動(message-driven) beans. 會話bean 表示與用戶端程式的臨時互動. 當用戶端程式執行完後, 會話bean 和相關資料就會消失. 相反, 實體bean 表示資料庫的表中一行永久的記錄. 當用戶端程式中止或伺服器關閉時, 就會有潛在的服務保證明體bean 的資料得以儲存.消息驅動 bean 結合了會話bean 和 JMS的消息監聽器的特性, 允許一個業務層元件異步接收JMS 消息. 企業資訊系統層 企業資訊系統層處理企業資訊系統軟體包括企業基礎建設系統例如企業資源計劃 (ERP), 大型機事務處理, 資料庫系統,和其它的遺留資訊系統. 例如,J2EE 應用元件可 能為了資料庫連接配接需要通路企業資訊系統 四. J2EE 的結構 這種基于元件,具有平台無關性的J2EE 結構使得J2EE 程式的編寫十分簡單,因為業務邏輯被封裝成可複用的元件,并且J2EE 伺服器以容器的形式為所有的元件類型提供背景服務. 因為你不用自己開發這種服務, 是以你可以集中精力解決手頭的業務問題。 容器和服務容器設定定制了J2EE伺服器所提供得内在支援,包括安全,事務管理,JNDI(Java Naming and Directory Interface)尋址,遠端連接配接等服務,以下列出最重要的幾種服務: J2EE安全(Security)模型可以讓你配置 web 元件或enterprise bean ,這樣隻有被授權的使用者才能通路系統資源. 每一客戶屬于一個特别的角色,而每個角色隻允許激活特定的方法。你應在enterprise bean的布置描述中聲明角色和可被激活的方法。由于這種聲明性的方法,你不必編寫加強安全性的規則。 J2EE 事務管理(Transaction Management)模型讓你指定組成一個事務中所有方法間的關系,這樣一個事務中的所有方法被當成一個單一的單元. 當用戶端激活一個enterprise bean中的方法,容器介入一管理事務。因有容器管理事務,在enterprise bean中不必對事務的邊界進行編碼。要求控制分布式事務的代碼會非常複雜。你隻需在布置描述檔案中聲明enterprise bean的事務屬性,而不用編寫并調試複雜的代碼。容器将讀此檔案并為你處理此enterprise bean的事務。 JNDI 尋址(JNDI Lookup)服務向企業内的多重名字和目錄服務提供了一個統一的接口,這樣應用程式元件可以通路名字和目錄服務. J2EE遠端連接配接(Remote Client Connectivity)模型管理用戶端和enterprise bean間的低層互動. 當一個enterprise bean建立後, 一個用戶端可以調用它的方法就象它和用戶端位于同一虛拟機上一樣. 生存周期管理(Life Cycle Management)模型管理enterprise bean的建立和移除,一個enterprise bean在其生存周期中将會曆經幾種狀态。容器建立enterprise bean,并在可用執行個體池與活動狀态中移動他,而最終将其從容器中移除。即使可以調用enterprise bean的create及remove方法,容器也将會在背景執行這些任務。 資料庫連接配接池(Database Connection Pooling)模型是一個有價值的資源。擷取資料庫 連接配接是一項耗時的工作,而且連接配接數非常有限。容器通過管理連接配接池來緩和這些問題。enterprise bean可從池中迅速擷取連接配接。在bean釋放連接配接之可為其他bean使用。 容器類型 J2EE應用元件可以安裝部署到以下幾種容器中去: EJB 容器管理所有J2EE 應用程式中企業級bean 的執行. enterprise bean 和它們的容 器運作在J2EE 伺服器上. Web 容器管理所有J2EE 應用程式中JSP頁面和Servlet元件的執行. Web 元件和它們的容器運作在J2EE 伺服器上. 應用程式用戶端容器管理所有J2EE應用程式中應用程式用戶端元件的執行. 應用程式用戶端和它們的容器運作在J2EE 伺服器上. Applet 容器是運作在用戶端機器上的web浏覽器和 Java 插件的結合.。 五. J2EE的核心API與元件 J2EE平台由一整套服務(Services)、應用程式接口(APIs)和協定構成,它對開發基于Web的多層應用提供了功能支援,下面對J2EE中的13種技術規範進行簡單的描述(限于篇幅,這裡隻能進行簡單的描述): 1. JDBC(Java Database Connectivity): JDBC API為通路不同的資料庫提供了一種統一的途徑,象ODBC一樣,JDBC對開發者屏蔽了一些細節問題,另外,JDCB對資料庫的通路也具有平台無關性。 2. JNDI(Java Name and Directory Interface): JNDI API被用于執行名字和目錄服務。它提供了一緻的模型來存取和操作企業級的資源如DNS和LDAP,本地檔案系統,或應用伺服器中的對象。 3. EJB(Enterprise JavaBean): J2EE技術之是以赢得媒體廣泛重視的原因之一就是EJB。它們提供了一個架構來開發和實 施分布式商務邏輯,由此很顯著地簡化了具有可伸縮性和高度複雜的企業級應用的開發。EJB規範定義了EJB元件在何時如何與它們的容器進行互動作用。容器負責提供公用的服務,例如目錄服務、事務管理、安全性、資源緩沖池以及容錯性。但這裡值得注意的是,EJB并不是實作J2EE的唯一途徑。正是由于J2EE的開放性,使得有的廠商能夠以一種和EJB平行的方式來達到同樣的目的。 4. RMI(Remote Method Invoke): 正如其名字所表示的那樣,RMI協定調用遠端對象上方法。它使用了序列化方式在用戶端和伺服器端傳遞資料。RMI是一種被EJB使用的更底層的協定。 5. Java IDL/CORBA: 在Java IDL的支援下,開發人員可以将Java和CORBA內建在一起。他們可以建立Java對象并使之可在CORBA ORB中展開, 或者他們還可以建立Java類并作為和其它ORB一起展開的CORBA對象的客戶。後一種方法提供了另外一種途徑,通過它Java可以被用于将你的新的 應用和舊的系統相內建。 6. JSP(Java Server Pages): JSP頁面由HTML代碼和嵌入其中的Java代碼所組成。伺服器在頁面被用戶端所請求以後對這些Java代碼進行處理,然後将生成的HTML頁面傳回給用戶端的浏覽器。 7. Java Servlet: Servlet是一種小型的Java程式,它擴充了Web伺服器的功能。作為一種伺服器端的應用,當被請求時開始執行,這和CGI Perl腳本很相似。Servlet提供的功能大多與JSP類似,不過實作的方式不同。JSP通常是大多數HTML代碼中嵌入少量的Java代碼,而servlets全部由Java寫成并且生成HTML。 8. XML(Extensible Markup Language): XML是一種可以用來定義其它标記語言的語言。它被用來在不同的商務過程中共享資料。 XML的發展和Java是互相獨立的,但是,它和Java具有的相同目标正是平台獨立性。通過将Java和XML的組合,您可以得到一個完美的具有平台獨立性的解決方案。 9. JMS(Java Message Service): MS是用于和面向消息的中間件互相通信的應用程式接口(API)。它既支援點對點的域,有支援釋出/訂閱(publish/subscribe)類型的域,并且提供對下列類型的支援:經認可的消息傳遞,事務型消息的傳遞,一緻性消息和具有持久性的訂閱者支援。JMS還提供了另 一種方式來對您的應用與舊的背景系統相內建。 10. JTA(Java Transaction Architecture): JTA定義了一種标準的API,應用系統由此可以通路各種事務監控。 11. JTS(Java Transaction Service): JTS是CORBA OTS事務監控的基本的實作。JTS規定了事務管理器的實作方式。該事務管理器是在高層支援Java Transaction API (JTA)規範,并且在較底層實作OMG OTS specification的Java映像。JTS事務管理器為應用伺服器、資料總管、獨立的應用以及通信資料總管提供了事務服務。 12. JavaMail: JavaMail是用于存取郵件伺服器的API,它提供了一套郵件伺服器的抽象類。不僅支援SMTP伺服器,也支援IMAP伺服器。 13. JAF(JavaBeans Activation Framework): JavaMail利用JAF來處理MIME編碼的郵件附件。MIME的位元組流可以被轉換成Java對象,或者轉換自Java對象。大多數應用都可以不需要直接使用JAF。 [編輯本段]J2EE初學者需要注意的問題 體系結構簡單介紹 一、J2EE提出的背景 1、 企業級應用架構的需求 在許多企業級應用中,例如資料庫連接配接、郵件服務、事務處理等都是一些通用企業需求子產品,這些子產品如果每次再開發中都由開發人員來完成的話,将會造成開發周期長和代碼可靠性差等問題。于是許多大公司開發了自己的通用子產品服務。這些服務性的軟體系列統稱為中間件。 2、 為了通用必須要提出規範,不然無法達到通用 在上面的需求基礎之上,許多公司都開發了自己的中間件,但其與使用者的溝通都各有不同,進而導緻使用者無法将各個公司不同的中間件組裝在一塊為自己服務。進而産生瓶頸。于是提出标準的概念。其實J2EE就是基于JAVA技術的一系列标準。 注:中間件的解釋 中間件處在作業系統和更高一級應用程式之間。它充當的功能是:将應用程式運作環境與作業系統隔離,進而實作應用程式開發者不必為更多系統問題憂慮,而直接關注該應用程式在解決問題上的能力 。我們後面說到的容器的概念就是中間件的一種。 二、相關名詞解釋 容器:充當中間件的角色 WEB容器:給處于其中的應用程式元件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接與容器中的環境變量接口互動,不必關注其它系統問題。主要由WEB伺服器來實作。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵守J2EE規範中的WEB APPLICATION 标準。我們把遵守以上标準的WEB伺服器就叫做J2EE中的WEB容器。 容器:Enterprise java bean 容器。更具有行業領域特色。他提供給運作在其中的元件EJB各種管理功能。隻要滿足J2EE規範的EJB放入該容器,馬上就會被容器進行高效率的管理。并且可以通過現成的接口來獲得系統級别的服務。例如郵件服務、事務管理。 WEB容器和EJB容器在原理上是大體相同的,更多的差別是被隔離的外界環境。WEB容器更多的是跟基于HTTP的請求打交道。而EJB容器不是。它是更多的跟資料庫、其它服務打交道。但他們都是把與外界的互動實作進而減輕應用程式的負擔。例如SERVLET不用關心HTTP的細節,直接引用環境變量session,request,response就行、EJB不用關心資料庫連接配接速度、各種事務控制,直接由容器來完成。 RMI/IIOP:遠端方法調用internet對象請求中介協定,他們主要用于通過遠端調用服務。例如,遠端有一台計算機上運作一個程式,它提供股票分析服務,我們可以在本地計算機上實作對其直接調用。當然這是要通過一定的規範才能在異構的系統之間進行通信。RMI是JAVA特有的。 JNDI:JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程式在其上面留下自己的索引,進而滿足快速查找和定位分布式應用程式的功能。 JMS:JAVA消息服務。主要實作各個應用程式之間的通訊。包括點對點和廣播。 JAVAMAIL:JAVA郵件服務。提供郵件的存儲、傳輸功能。他是程式設計中實作郵件功能的核心。相當MS中的EXCHANGE開發包。 JTA:JAVA事務服務。提供各種分布式事務服務。應用程式隻需調用其提供的接口即可。 JAF:JAVA安全認證架構。提供一些安全控制方面的架構。讓開發者通過各種部署和自定義實作自己的個性安全控制政策。 EAI:企業應用內建。是一種概念,進而牽涉到好多技術。J2EE技術是一種很好的內建實作。 三、J2EE的優越性 1、 基于JAVA 技術,平台無關性表現突出 2、 開放的标準,許多大型公司已經實作了對該規範支援的應用伺服器。如BEA,IBM,ORACLE等。 3、 提供相當專業的通用軟體服務。 4、 提供了一個優秀的企業級應用程式架構,對快速高品質開發打下基礎 四、現狀 J2EE是由SUN 公司開發的一套企業級應用規範。現在最高版本是1.6。支援J2EE的應用伺服器有IBM WEBSPHERE APPLICATION SERVER,BEA WEBLOGIC SERVER,JBOSS,ORACLE APPLICATION SERVER,SUN ONE APPLICATION SERVER 等。 [編輯本段]J2EE的13種核心技術 為了聯系實際,GOULD基于WEBLOGIC應用伺服器(來自BEA SYSTEMS公司的一種廣為應用的産品)環境來介紹J2EE的這些技術。 JAVA最初是在浏覽器和用戶端機器中粉墨登場的。當時,很多人質疑它是否适合做伺服器端的開發。現在,随着對JAVA2平台企業版(J2EE)第三方支援的增多,JAVA被廣泛接納為開發企業級伺服器端解決方案的首選平台之一。 J2EE平台由一整套服務(SERVICES)、應用程式接口(APIS)和協定構成,它對開發基于WEB的多層應用提供了功能支援。在本文中我将解釋支撐J2EE的13種核心技術:JDBC, JNDI, EJBS, RMI, JSP, JAVA SERVLETS, XML, JMS, JAVA IDL, JTS, JTA, JAVA MAIL 和 JAF,同時還将描述在何時、何處需要使用這些技術。當然,我還要介紹這些不同的技術之間是如何互動的。此外,為了讓您更好地感受J2EE的真實應用,我将在WEBLOGIC應用伺服器(來自BEA SYSTEMS公司的一種廣為應用的産品)環境下來介紹這些技術。不論對于WEBLOGIC應用伺服器和J2EE的新手,還是那些想了解J2EE能帶來什麼好處的項目管理者和系統分析員,相信本文一定很有參考價值。 宏觀印象: 分布式結構和J2EE 過去,二層化應用--通常被稱為CLIENT/SERVER應用--是大家談論的最多的。在很多情況下,伺服器提供的唯一服務就是資料庫服務。在這種解決方案中,用戶端程式負責資料通路、實作業務邏輯、用合适的樣式顯示結果、彈出預設的使用者界面、接受使用者輸入等。CLIENT/SERVER結構通常在第一次部署的時候比較容易,但難于更新或改進,而且經常基于某種專有的協定(通常是某種資料庫協定)。它使得重用業務邏輯和界面邏輯非常困難。更重要的是,在WEB時代,二層化應用通常不能展現出很好的伸縮性,因而很難适應INTERNET的要求。 SUN設計J2EE的部分起因就是想解決二層化結構的缺陷。于是J2EE定義了一套标準來簡化N層企業級應用的開發。它定義了一套标準化的元件,并為這些元件提供了完整的服務。J2EE還自動為應用程式處理了很多實作細節,如安全、多線程等。用J2EE開發N層應用包括将二層化結構中的不同層面切分成許多層。一個N層化應用A能夠為以下的每種服務提供一個分開的層:顯示:在一個典型的WEB應用中,用戶端機器上運作的浏覽器負責實作使用者界面。 動态生成顯示: 盡管浏覽器可以完成某些動态内容顯示,但為了相容不同的浏覽器,這些動态生成工作應該放在WEB伺服器端進行,使用JSP、SERVLETS,或者XML(可擴充标記語言)和XSL(可擴充樣式表語言)。 業務邏輯:業務邏輯适合用SESSION EJB(後面将介紹)來實作。 資料通路:資料通路适合用ENTITY EJB(後面将介紹)和JDBC來實作。 背景系統內建: 背景系統的內建可能需要用到許多不同的技術,至于何種最佳需要根據背景系統的特征而定。 您可能開始詫異:為什麼有這麼多的層?事實上,多層方式可以使企業級應用具有很強的伸縮性,它允許每層專注于特定的角色。例如,讓WEB伺服器負責提供頁面,應用伺服器處理應用邏輯,而資料庫伺服器提供資料庫服務。 由于J2EE建立在JAVA2平台标準版(J2SE)的基礎上,是以具備了J2SE的所有優點和功能。包括“編寫一次,到處可用”的可移植性、通過JDBC通路資料庫、同原有企業資源進行互動的CORBA技術以及一個經過驗證的安全模型。在這些基礎上,J2EE又增加了對EJB(企業級JAVA元件)、JAVA SERVLETS、JAVA伺服器頁面(JSPS)和XML技術的支援。 分布式結構與WEBLOGIC應用伺服器 J2EE提供了一個架構--一套标準API--用于開發分布式結構的應用,這個架構的實際實作留給了第三方廠商。部分廠商隻是專注于整個J2EE架構中的的特定元件,例如APACHE的TOMCAT提供了對JSP和SERVLETS的支援,BEA系統公司則通過其WEBLOGIC應用伺服器産品為整個 J2EE規範提供了一個較為完整的實作。 WEBLOGIC伺服器已使建立和部署伸縮性較好的分布式應用的過程大為簡化。WEBLOGIC和J2EE代你處理了大量正常的程式設計任務,包括提供事務服務、安全領域、可靠的消息、名字和目錄服務、資料庫通路和連接配接池、線程池、負載平衡和容錯處理等。通過以一種标準、易用的方式提供這些公共服務,象WEBLOGIC伺服器這樣的産品造就了具有更好伸縮性和可維護性的應用系統,使其為大量的使用者提供了增長的可用性。 J2EE技術在接下來的部分裡,我們将描述構成J2EE的各種技術,并且了解WEBLOGIC伺服器是如何在一個分布式應用中對它們進行支援的。最常用的J2EE技術應該是JDBC、JNDI、EJB、JSP和SERVLETS,對這些我們将作更仔細的考察。 JAVA DATABASE CONNECTIVITY (JDBC) JDBC API以一種統一的方式來對各種各樣的資料庫進行存取。和ODBC一樣,JDBC為開發人員隐藏了不同資料庫的不同特性。另外,由于JDBC建立在JAVA的基礎上,是以還提供了資料庫存取的平台獨立性。 JDBC定義了4種不同的驅動程式,現分述如下: 類型 1: JDBC-ODBC BRIDGE 在JDBC出現的初期,JDBC-ODBC橋顯然是非常有實用意義的,通過JDBC-ODBC橋,開發人員可以使用JDBC來存取ODBC資料源。不足的是,他需要在用戶端安裝ODBC驅動程式,換句話說,必須安裝MICROSOFT WINDOWS的某個版本。使用這一類型你需要犧牲JDBC的平台獨立性。另外,ODBC驅動程式還需要具有用戶端的控制權限。 類型 2: JDBC-NATIVE DRIVER BRIDGE JDBC本地驅動程式橋提供了一種JDBC接口,它建立在本地資料庫驅動程式的頂層,而不需要使用ODBC。 JDBC驅動程式将對資料庫的API從标準的JDBC調用轉換為本地調用。使用此類型需要犧牲JDBC的平台獨立性,還要求在用戶端安裝一些本地代碼。 類型 3: JDBC-NETWORK BRIDGE JDBC網絡橋驅動程式不再需要用戶端資料庫驅動程式。它使用網絡上的中間伺服器來存取資料庫。這種應用使得以下技術的實作有了可能,這些技術包括負載 均衡、連接配接緩沖池和資料緩存等。由于第3種類型往往隻需要相對更少的下載下傳時間,具有平台獨立性,而且不需要在用戶端安裝并取得控制權,是以很适合于 INTERNET上的應用。 類型 4: PURE JAVA DRIVER 第4種類型通過使用一個純JAVA資料庫驅動程式來執行資料庫的直接通路。此類型實際上在用戶端實作了2層結構。要在N-層結構中應用,一個更好的做法是編寫一個EJB,讓它包含存取代碼并提供一個對用戶端具有資料庫獨立性的服務。 WEBLOGIC伺服器為一些通常的資料庫提供了JDBC驅動程式,包括ORACLE, SYBASE, MICROSOFT SQL SERVER以及INFORMIX。它也帶有一種JDBC驅動程式用于CLOUDSCAPE,這是一種純JAVA的DBMS,WEBLOGIC伺服器中帶有該資料庫的評估版本。 以下讓我們看一個執行個體。 JDBC執行個體在這個例子中我們假定你已經在CLOUDSCAPE中建立了一個PHONEBOOK資料庫,并且包含一個表,名為CONTACT_TABLE ,它帶有2個字段:NAME 和 PHONE。開始的時候先裝載CLOUDSCAPE JDBC DRIVER,并請求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(); } } } OK。接着我們來看一看JDBC是如何在企業應用中的進行使用。JDBC在企業級應用中的應用以上執行個體其實是很基本的,可能有些微不足道。它假定了一個2層結構。在一個多層的企業級應用中,更大的可能是在用戶端和一個EJB進行通信,該EJB将建立資料庫連接配接。為了實作和改進可伸縮性和系統性能,WEBLOGIC伺服器提供了對連接配接緩沖池CONNECTION POOL的支援。CONNECTION POOL減少了建立和釋放資料庫連接配接的消耗。在系統啟動以後即可建立這樣的緩沖池,此後如故再有對資料庫的請求,WEBLOGIC伺服器可以很簡單地從緩 沖池中取出資料。資料緩沖池可以在WEBLOGIC伺服器的WEBLOGIC.PROPERTIES 檔案中進行定義。(可參考 WEBLOGIC.PROPERTIES 檔案中的例子,WEBLOGIC伺服器的文檔中還有更詳細的參考資訊)在企業級應用的另一 個常見的資料庫特性是事務處理。事務是一組申明STATEMENT,它們必須做為同一個STATEMENT來處理以保證資料完整性。預設情況下JDBC使 用 AUTO-COMMIT 事務模式。這可以通過使用CONNECTION類的 SETAUTOCOMMIT() 方法來實作。 現在我們已經對JDBC有了一些認識,下面該轉向JNDI了。 JAVA NAMING AND DIRECTORY INTERFACE (JNDI) JNDI API被用于執行名字和目錄服務。它提供了一緻的模型來存取和操作企業級的資源如DNS和LDAP,本地檔案系統,後者在應用伺服器中的對象。 在JNDI中,在目錄結構中的每一個結點稱為CONTEXT。每一個JNDI名字都是相對于CONTEXT的。這裡沒有絕對名字的概念存在。對一個應用來說,它可以通過使用 INITIALCONTEXT 類來得到其第一個CONTEXT: CONTEXT CTX = NEW INITIALCONTEXT(); 應用可以通過這個初始化的CONTEXT經有這個目錄樹來定位它所需要的資源或對象。例如,假設你在WEBLOGIC伺服器中展開了一個EJB并将 HOME接口綁定到名字 MYAPP.MYEJB ,那麼該EJB的某個客戶在取得一個初始化 CONTEXT以後,可以通過以下語句定位HOME接口: MYEJBHOME HOME = CTX.LOOKUP( "MYAPP.MYEJB" ); 在這個例子中,一旦你有了對被請求對象的參考,EJB的HOME接口就可以在它上面調用方法。我們将在下面的"ENTERPRISE JAVA BEANS"章節中做更多的介紹。 以上關于JNDI的讨論隻是冰山之一角而已。如果要更進一步地在CONTEXT中查找對象,JNDI也提供了一些方法來進行以下操作: 将一個對象插入或綁定到CONTEXT。這在你展開一個EJB的時候是很有效的。 從CONTEXT中移去對象。 列出CONTEXT中的所有對象。 建立或删除子一級的CONTEXT。 接下來,我們要開始關注EJB了。 ENTERPRISE JAVA BEANS (EJB) J2EE技術之是以赢得某體廣泛重視的原因之一就是EJB。它們提供了一個架構來開發和實施分布式商務邏輯,由此很顯著地簡化了具有可伸縮性和高度複雜的企業級應用的開發。EJB規範定義了EJB元件在何時以及如何與它們的容器進行互動作用。容器負責提供公用的服務,例如目錄服務、事務管理、安全性、資源緩沖池以及容錯性。 EJB規範定義了3中基本的BEAN類型: STATELESS SESSION BEANS: 提供某種單一的服務,不維持任何狀态,在伺服器故障發生時無法繼續存在,生命期相對較短。例如,一個STATELESS SESSION BEAN可能被用于執行溫度轉換計算。 STATEFUL SESSION BEAN: 提供了與用戶端的會話互動,可以存儲狀态進而代表一個客戶。典型例子是購物車。STATEFUL SESSION BEAN在伺服器故障時無法繼續生存,生命期相對較短。每一個執行個體隻用于一個單個的線程 ENTITY BEANS: 提供了一緻性資料的表示-- 通常存放在資料庫中 -- 在伺服器故障發生後能繼續存在。多使用者情況下可以使用EJB來表示相同的資料。ENTITY EJB的一個典型例子是客戶的帳号資訊。 盡管有以上的差別,所有的EJB還是有許多的共同之處: 它們都處理HOME INTERFACE。它定義了一個用戶端是如何建立與消亡EJB的。 可以在BEAN中對定義了用戶端方法的遠端接口進行調用; BEAN類則執行了主要的商務邏輯描述 EJB的開發已經超出了本文的範圍。但是,如果一個EJB已經被開發了或者從第三方進行了購買,它就必須在應用伺服器中進行釋出。WEBLOGIC SERVER 5.1帶有一個EJB DEPLOYER TOOL來協助處理EJB的釋出。當你使用EJB DEPLOYER TOOL的時候,你要定義用戶端所用的JNDI名字來定位EJB。DEPLOYER TOOL将生成WRAPPER類來處理和容器的通信以及在一個JAR檔案中把被請求的JAVA類綁定在一起。一旦EJB被釋出,用戶端就可以使用它的JNDI名字來定位EJB。 首先,它必須得到一個到HOME接口的REFERENCE。 然後,用戶端可以使用該接口,調用一個 CREATE() 方法來得到伺服器上運作的某個BEAN執行個體的句柄; 最後,用戶端可以使用該句柄在BEAN中調用方法。 了解 EJB後,讓我們再來看JSP。 JAVA SERVER PAGES (JSPS) 我們中間可能已經有許多人已經熟悉MICROSOFT的ACTIVE SERVER PAGES (ASP)技術了。JSP和ASP相對應的,但更具有平台對立性。他們被設計用以幫助WEB内容開發人員建立動态網頁,并且隻需要相對較少的代碼。即使WEB設計師不懂得如何程式設計也可以使用JSP,因為JSP應用是很友善的。JSP頁面由HTML代碼和嵌入其中的JAVA代碼所組成。伺服器在頁面被用戶端所請求以後對這些JAVA代碼進行處理,然後将生成的HTML頁面傳回給用戶端的浏覽器。 下面我們來看一個JSP的簡單執行個體。它隻顯示了伺服器的目前日期和時間。雖然,對文法的具體解釋已經超出了本文的範圍,但我們還是可以很直覺地看到,JAVA代碼被放在<%和%>的中間,而JAVA的表達式則放在<%=和%>之間。 Sample JSP Page
Date JSP sample
<% response.setHeader("Refresh", 5); %> The current date is <%= new Date() %>. 您可能有時候聽說過JHTML。這是JSP以前的一種較老的标準。WEBLOGIC伺服器既可支援JSP,又可支援JHTML。 請注意,在預設狀況下,JSP在WEBLOGIC伺服器中并沒有處于有效狀态。要使之有效,你可以編輯WEBLOGIC.PROPERTIES檔案。如果WEB伺服器還沒有處于有效狀态,則要先使之有效。SERVLET的情況和JSP是一樣的。 下面是:JAVA SERVLETS JAVA SERVLETS SERVLET提供的功能大多與JSP類似,不過實作的方式不同。JSP通常是大多數HTML代碼中嵌入少量的JAVA代碼,而SERVLETS全部由JAVA寫成并且生成HTML。 SERVLET是一種小型的JAVA程式,它擴充了WEB伺服器的功能。作為一種伺服器端的應用,當被請求時開始執行,這和CGI PERL腳本很相似。SERVLETS和CGI腳本的一個很大的差別是:每一個CGI在開始的時候都要求開始一個新的程序 -- 而SERVLETS是在SERVLET引擎中以分離的線程來運作的。是以SERVLETS在可伸縮性上提供了很好的改進。在開發SERVLETS的時候,您常常需要擴充JAVA X.SERVLET.HTTP.HTTPSERVLET 類,并且OVERRIDE一些它的方法,其中包括: SERVICE(): 作為DISPATCHER來實作指令-定義方法 DOGET(): 處理用戶端的HTTP GET請求。 DOPOST(): 進行HTTP POST操作 其它的方法還包括處理不同類型的HTTP請求 -- 可以參考HTTPSERVLET API文檔。 以上描述的是标準J2EE SERVLET API的各種方法。WEBLOGIC伺服器提供了一個該API完整的實作途徑。一旦你開發了一個SERVLET,你就可以在 WEBLOGIC.PROPERTIES 中加以注冊并由此可以在WEBLOGIC伺服器中對它進行配置。通過JAVA SERVLETS,我們已經到達了J2EE主要技術的末尾了。但J2EE所提供的并不止于這些。 下面的段落中我們将簡要地看一下現存的一些技術,包括RMI, JAVA IDL和CORBA, JTA, 以及XML,等等。 REMOTE METHOD INVOCATION (RMI) 正如其名字所表示的那樣,RMI協定是在遠端對象上調用一些方法。它使用了連續序列方式在用戶端和伺服器端傳遞資料。RMI是一種被EJB使用的更下層的協定。 JAVA IDL/CORBA 在JAVA IDL的支援下,開發人員可以将JAVA和CORBA內建在一起。 他們可以建立JAVA對象并使之可在CORBA ORB中展開, 或者他們還可以建立JAVA類并作為和其它ORB一起展開的CORBA對象的客戶。後一種方法提供了另外一種途徑,通過它JAVA可以被用于将你的新的應 用和LEGACY系統相內建。 JAVA TRANSACTION ARCHITECTURE (JTA)/JAVA TRANSACTION SERVICE (JTS) JTA定義了一種标準的API,應用系統由此可以存取各種事務監控。 JTS是CORBA OTS事務監控的基本實作。JTS規定了事務管理器的實作方式。該事務管理器是在高層支援JAVA TRANSACTION API (JTA)規範,并且在較底層實作OMG OTS SPECIFICATION的JAVA映像。JTS事務管理器為應用伺服器、資料總管、獨立的應用以及通信資料總管提供了事務服務。 JAVA MAIL AND JAVA BEANS ACTIVATION FRAMEWORK JAVA MAIL是用于存取郵件伺服器的API,它提供了一套郵件伺服器的抽象類。不僅支援SMTP伺服器,也支援IMAP伺服器JAVA MAIL利用JAVA BEANS ACTIVATION FRAMEWORK (JAF)來處理MIME-編碼的郵件附件。MIME的位元組流可以被轉換成JAVA對象,或者轉換自JAVA對象。由此大多數應用都可以不需要直接使用JAF。 JAVA MESSAGING SERVICE (JMS) JMS是用于和面向消息的中間件互相通信的應用程式接口(API)。它既支援點對點的域,又支援釋出/訂閱(PUBLISH/SUBSCRIBE)類型的域,并且提供對下列類型的支援:經認可的消息傳遞、事務型消息的傳遞、一緻性消息和具有持久性的訂閱者支援。JMS還提供了另一種方式來對您的應用與LEGACY BACKEND系統相內建。 EXTENSIBLE MARKUP LANGUAGE (XML) XML是一種可以用來定義其它标記語言的語言。它被用來在不同的商務過程中共享資料。XML的發展和JAVA是互相獨立的,但是,它和JAVA具有的相同目标正是平台獨立性。通過将JAVA和XML的組合,您可以得到一個完美的具有平台獨立性的解決方案。目前正有許多不同的公司在為JAVA和XML的組合而努力。如果要了解更多的這方面的資訊,可以通路SUN的JAVA-XML頁面,或者IBM DEVELOPERWORKS的XML ZONE。 總結 在本文中,我們介紹了建立在J2EE上的分布式應用結構,并且描述了WEBLOGIC伺服器對J2EE的各種支援。然而,我們所揭示的僅僅是冰山之一角而已,要以一篇數千字的文章來展示J2EE潛在的對您的企業級應用的影響可是很不公平的。 我們已經關注了在您開始用J2EE進行工作時最有可能遇到的各類技術:JDBC, JNDI, EJB, JSP和SERVLET。我們也為您提供了一些尚未常見的J2EE技術的背景知識。不管您是一名開發人員,商務應用分析師,或者項目經理,都應該對J2EE和WEBLOGIC伺服器所能提供給我們,給我們的企業以及我們的企業級應用所帶來的意義有一個更好的認識。 J2EE 帶動了Java在企業級的發展,但随着一些輕量級元件的出現,J2EE的臃腫和開發難度高的缺點越來越引起了許多人的注意,EJB2.0也被許多人稱為累贅。随着Spring,Hibernate的不斷完善和發展,EJB3.0出現了,成為了未來Java 企業級開發的新的方向。 使用中繼資料,注釋代替傳統的配置檔案成為了新的熱點。JPA更是代替了傳統的CMP作為了更加便捷的持久化的方案。