官术网_书友最值得收藏!

第3課 EJB快速入門

EJB(Enterprise JavaBean)是Java EE的一部分,它是Java EE分布式開發中的框架技術。它定義了Java服務器端服務框架的規范,用以描述一些必需的服務,如事務、安全和名字服務等。因此,EJB提供了分布式企業開發的基礎框架,在這個框架中,開發人員可以進行各種業務的開發、部署和訪問。

本課作為EJB企業開發技術的第一課,我們首先需要了解EJB,并構建起EJB 3運行服務器環境和開發環境,并在該環境下開發第一個HelloWorld應用實例。主要內容如下。

● 開始了解EJB:了解EJB的基本概念、特性、體系結構、組件類型、發展歷史等,對EJB有一個全面整體的了解,為后文的分塊講解做好準備。

● 配置EJB運行環境——JBoss服務器:選擇JBoss作為EJB運行的服務器,并下載和安裝JBoss,測試該環境的可用性,為EJB程序的部署做好準備。

● 配置EJB集成開發環境——Eclipse+JBoss Tools插件:在Eclipse中安裝JBoss Tools插件,并在該集成環境下新建JBoss服務器,啟動和測試可用性。

● EJB快速上手——HelloWorld入門實例:在Eclipse中開發一個Session Bean組件,實現返回歡迎信息的功能,并自動發布部署到JBoss服務器中,然后編寫Java類或JSP頁面實現對EJB服務的訪問。

本課的內容如圖3-1所示,左側方框內構建的是Eclipse+JBoss+JBoss Tools的運行環境和集成開發環境,左側上方是基于該環境開發并部署的HelloWorld服務端,它通過JNDI暴露服務的地址,可以被Java、JSP和Servlet等客戶端程序所訪問。

圖3-1 內容結構圖

通過本節課的學習,你將能夠搭建起EJB運行和開發的環境,并能夠熟練掌握EJB程序的開發、部署和訪問的全過程。

3.1 開始了解EJB

首先我們從以下幾個方面來了解EJB。

● EJB基本概念:EJB、EJB容器和EJB服務器。

● EJB基本特性。

● EJB體系結構。

● EJB組件的3種類型:會話Bean、實體Bean、消息驅動Bean。

● EJB發展歷史:EJB 1.0、EJB 1.1、EJB 2.0、EJB 2.1、EJB 3.0。

● EJB 3.0新特性。

3.1.1 EJB基本概念

EJB(Enterprise JavaBean)是Java EE的一部分,定義了一個用于開發基于組件的企業多重應用程序的標準。其特點包括網絡服務支持和核心開發工具(SDK)。從技術上來說,EJB不是一種產品,而是Sun在Java EE中指定的一套規范,該規范規定了一系列的API,用來實現把EJB概念轉換成EJB產品。

在開始研究EJB之前,我們先來了解EJB中的幾個基本概念: EJB、EJB容器及EJB服務器。

1.EJB

在Java EE里,Enterprise JavaBean稱為企業JavaBean,即它是企業級的JavaBean組件。Enterprise JavaBean和JavaBean都是Java的組件模型,但是Enterprise JavaBean組件模型和JavaBean組件模型有本質的不同:

● JavaBean規范定義了事件和屬性等特征,其重點是允許開發者在開發工具中可視化地操縱組件。JavaBean規范詳細地解釋了組件間事件登記、傳遞、識別和屬性使用、定制和持久化的應用編程接口和語意。

● Enterprise JavaBean規范詳細地定義了一個可以移植性地部署Java組件的服務框架模型。其中并沒提及事件,因為Enterprise JavaBean通常不發送和接受事件。同樣它也沒有提及屬性——屬性定制并不是在開發時進行的,而是在運行時(實際上是在部署時)通過一個部署描述符來描述的。

它們二者都是組件模型規范,但是前者說明了開發工具中應用程序組裝的問題,而后者則側重于部署組件的服務框架的細節。區別是當你使用JavaBean創建服務器應用時,你還得設計整個的服務框架,而Enterprise JavaBean框架則是現成的,你只需遵守它的API即可。對于復雜的服務器端應用程序,顯然使用Enterprise JavaBean比重新開發更簡單。

注意

不要錯誤地認為JavaBean用于客戶端的開發,Enterprise JavaBean用于服務器端的開發。

2.EJB容器

EJB類的對象駐留在EJB容器內,EJB容器是向開發者提供各類服務的環境。容器根據具體的配置可以負責處理安全、事務和實例管理。由于開發人員無須再親自完成這些任務,因此大大節約了開發時間。

J2EE服務器和EJB容器這兩個概念之間存在顯著差別,EJB容器可能屬于J2EE服務器的一部分,但卻并不一定是必需的組成部分。在作為J2EE服務器組成部分的情況下,EJB客戶程序通常會采取Servlet或者JSP的形式。不過,由于取消了對J2EE Web層的依附性,標準的EJB容器服務可以接受多種類型的客戶程序、用Java或其他各種語言編寫的應用程序所發出的請求。同EJB容器的通信才是客戶操作的先決條件。

3.EJB服務器

EJB容器是管理一個或多個EJB類/實例的抽象,它通過規范中定義的接口使EJB類訪問所需的服務。容器由EJB服務器來提供,一旦接口標準化了,廠商就可能提供可以在任何兼容的EJB服務器上運行的容器。

EJB服務器是管理EJB容器的高端進程或應用程序,并提供對系統服務的訪問。EJB服務器也可以提供廠商自己的特性,如優化的數據庫訪問接口,對其他服務(如CORBA服務)的訪問,對SSL 3.0的支持等。一個EJB服務器必須提供對可訪問JNDI的名字服務和事務服務的支持。一些可能的EJB服務器的例子如下:

● 數據庫服務器。

● 應用服務器。

● 中間件服務器。

容器廠商也可以在容器或服務器中提供額外服務的接口。

3.1.2 EJB基本特性

EJB是專門為服務器端組件市場制定的規范。EJB是一種讓開發者快速開發大規模企業應用的組件體系結構,它讓應用開發者在不花費任何代價的前提下,為中間件提供復雜的企業級特性。通過應用EJB,你可以全身心地投入到解決實際問題的應用軟件的開發中,而不用花費精力處理分布式服務器端系統所帶來的底層問題。你可以放心地將EJB認為是大多數企業級應用所需的通用功能組件。EJB模型可以讓你避免這些底層功能的重復開發,從而提高效率。

EJB是Sun的服務器端組件模型,最大的用處是部署分布式應用程序。它具有以下特性:

● EJB增加了與其他系統相兼容的靈活性。對于現有的應用系統,不需要從頭開發企業級的應用系統,在不廢棄現有的企業級應用系統的前提下,將系統升級到EJB模式。

● EJB還支持“即插即用”的企業級特性。EJB這個中間件構造了可擴展的多層體系結構,應用服務器潛在地為運行在其中的組件提供事務處理、連續性、安全、組件生存期管理、線程等服務。

● EJB是跨平臺和跨廠商的。這就出現了一個可以綜合所有廠家產品的通用分布式組件體系結構標準,EJB市場競爭的激烈可以使開發商將注意力集中在最好的應用的開發上。

3.1.3 EJB體系結構

EJB分布式應用程序是基于對象組件模型的,底層的事務服務用了API技術。EJB技術簡化了用Java語言編寫的企業應用系統的開發和配置。EJB技術定義了一組可重用的組件:Enterprise JavaBean。你可以利用這些組件,像搭積木一樣地建立你的分布式應用程序。當你把代碼寫好之后,這些組件就會被組合到特定的文件中去。每個文件有一個或多個Enterprise JavaBean,再加上一些配置參數,最后,這些Enterprise JavaBean被配置到一個裝了EJB容器的平臺上。客戶能夠通過這些Bean的home接口,定位到某個Bean,并產生這個Bean的一個實例。這樣,客戶就能夠調用Bean的應用方法和遠程接口了。

(1)EJB服務器作為容器和底層平臺的橋梁管理著EJB容器和函數。它向EJB容器提供了訪問系統服務的能力。例如數據庫的管理和事務的管理,或者對于其他的Enterprise的應用服務器。所有的EJB實例都運行在EJB容器中。

(2)EJB容器提供了系統級的服務,控制了EJB的生命周期。EJB中有一些易于使用的管理工具,內容如下。

● 安全(Security):配置描述器定義了客戶能夠訪問的不同的應用函數。容器通過只允許授權的客戶訪問這些函數來達到這個效果。

● 遠程鏈接(Remote Connectivity):容器為遠程鏈接管理著底層的通信issues,而且對Enterprise JavaBean的開發者和客戶都隱藏了通信細節。EJB的開發者在編寫應用方法的時候,就像是在調用本地的平臺一樣。客戶也不清楚他們調用的方法可能是在遠程被處理的。

● 生命周期管理(Life Cycle Management):客戶簡單地創建一個Enterprise JavaBean的實例,并通常取消一個實例。而容器管理著Enterprise JavaBean的實例,使Enterprise JavaBean實現最大的效能和內存利用率。容器能夠這樣來激活和使Enterprise JavaBean失效,保持眾多客戶共享的實例池。

● 事務管理(Transaction Management):配置描述器定義了Enterprise JavaBean的事務處理的需求。容器管理著那些管理分布式事務處理的復雜的issues,這些事務可能要在不同的平臺之間更新數據庫。容器使這些事務之間互相獨立,互不干擾,并保證所有的更新數據庫都是成功發生的,否則就回滾到事務處理之前的狀態。

(3)EJB組件是基于分布式事務處理的企業級應用程序的組件。所有的EJB都有如下的特點:

● EJB包含了處理企業數據的應用邏輯。

● 定義了EJB的客戶界面。這樣的界面不受容器和服務器的影響。于是,當一個EJB被集合到一個應用程序中去時,不用更改代碼和重新編譯。

EJB能夠被定制為各種系統級的服務,例如安全和事務處理的特性,都不是屬于EJB類的,而是由配置和組裝應用程序的工具來實現的。

3.1.4 EJB組件的3種類型

EJB組件對象分為3種類型:Session Bean、Entity Bean、Message Driven Bean。根據所需要的Bean行為,決定所采用的Bean類型。下面來看各種類型的作用和使用場景。

1.Session Bean——會話Bean

Session Bean用于實現業務邏輯,它可以是有狀態的,也可以是無狀態的。每當客戶端請求時,容器就會選擇一個Session Bean來為客戶端服務。Session Bean可以直接訪問數據庫,但更多時候,它會通過Entity Bean來實現數據訪問。

會話Bean還可以進一步細分為無狀態會話Bean和有狀態會話Bean。

1)無狀態會話Bean

無狀態會話Bean并不知道客戶或者涉及請求的上下文,從而使其成為單一請求/回應應用的理想工具。比如,一個用戶在Google中搜索關鍵字“Java”,客戶應用程序聯系一個無狀態會話Bean并給其傳遞搜索參數,然后這個Bean訪問數據庫,選擇匹配檢索條件的條目,并把記錄傳回客戶程序。通信完成之后,Bean不保留交互信息。因此,多個客戶程序可以同時訪問無狀態會話Bean卻不會相互影響。

2)有狀態會話Bean

相反,有狀態會話Bean會把請求同特定的客戶聯系起來,在客戶和Bean之間建立一種一對一的關系。購物車Bean就是一個特殊的實例:用戶往購物車里加入商品,輸入地址信息然后下定單,購物車Bean維持狀態,因而它知道所有這些變量都關聯某一特定客戶。

2.Entity Bean——實體Bean

實體Bean表示會話終止之后持久存在的業務對象或者數據。它們通常作為數據庫中的單一記錄存在,當然,其存儲形式也可能采用其他媒介,比如文件等。一個對象就表示一個用戶,有名字、聯系方式等,這些參數代表了實體Bean的用途。作為持久性最本質的內涵之一,實體Bean的唯一標識或者主鍵起到了識別和檢索正確對象信息的作用。實體Bean需要主鍵作為“輔助類”封裝對象的唯一標識符。

Entity Bean是域模型對象,用于實現O/R映射,負責將數據庫中的表記錄映射為內存中的Entity對象。事實上,創建一個Entity Bean對象相當于新建一條記錄,刪除一個Entity Bean會同時從數據庫中刪除對應記錄,當修改一個Entity Bean時,容器會自動將Entity Bean的狀態和數據庫同步。

注意

實體Bean是EJB 1.x和EJB 2.x中的組件,在EJB 3.x中,已經被JPA所代替。

3.Message-Driven Bean——消息驅動Bean

以上的兩種Bean類型以同步方式為EJB客戶提供服務。客戶發出請求然后等待Bean發回結果。消息驅動Bean避免了這一可能的瓶頸問題。采用Java消息服務JMS(Java Messaging Service),客戶程序可以產生一個消息并把消息發布給消息隊列。消息驅動Bean隨之采用或者檢索消息執行其內容。這種事件或者數據的通信就成為異步形式;客戶或者Bean都無須依賴對方的直接響應了。

比如,北京的某一個銀行使用一種應用程序發布最新的匯率消息。這時,部署在上海的一個外部交易Bean從消息隊列中獲取這一消息,然后更新數據庫中的有關記錄。在理想的情況下,消息驅動Bean會把信息傳遞給處理數據庫事務的實體Bean。這樣,每一種Bean把它不能處理的任務轉發從而創建出一種真正的分布式組件結構。

3.1.5 EJB發展歷史

1997年4月12日,Sun發布了一項為企業環境開發Java平臺的創新成果。使用開放式的Java Community Process,Sun促進了一組標準的Java擴展的開發,稱為Enterprise Java API。這些應用程序編程接口(API)為各種各樣的中間件的實現提供了不依賴供應商的編程接口。Enterprise Java API的要點是Enterprise JavaBean API,后者為Java應用程序服務器定義了一個服務器端組件模型,以及一個不依賴供應商的編程接口。

Java EE為Enterprise JavaBean技術提供了工作環境。事實上,Sun把若干項軟件技術都設想為這樣的構件塊,它們將使大型企業能夠把以任務為關鍵的業務系統移植到Java環境中,而Enterprise JavaBean技術不過是這些技術之一。EJB組件是按它們自己的規范定義的,但EJB技術并不是一項獨立的技術。它建立在其他的Java技術之上,這些技術由Sun和其他IT公司聯合規定,它們一起提供了這個框架的內容,該框架就稱為Java 2 Platform,Enterprise Edition。

Java EE中包括以下技術。

● EJB(Enterprise JavaBeans):Java EE中間層,完成商業邏輯。

● JMS(Java Message Service):Java EE的異步消息隊列。

● JNDI(Java Naming and Directory Interface):Java EE的名字查找API,獨立于目錄服務器。

● JCA(Java Connector Architecture):Java EE用于連接異種數據源的API。

● JTS(Java Transaction Service):Java EE用于處理交易的API。

● JTA(Java Transaction API):Java事務API。

● RMI/IIOP(Java Remote Method Invocation):Java EE的分布式對象的通信API,提供了和CORBA交互的能力。

● JPA(Java Persistence API):Java持久化API。

● JDBC(Java Database Connection):Java EE數據庫訪問。

● IDL(Java Interface Definition Language):Java接口定義語言。

以上Java EE框架中的技術,并不是每項技術都依賴于其他技術。單獨的規范文檔指出每項技術的相關性。例如,Enterprise JavaBean規范1.0發行版就指明了在定位各個組件時與JNDI的相關性,以及在編程中啟動和停止事務處理時與JTA的相關性。

EJB規范的第一版以初稿形式于1997年12月公布,并于1998年3月作為1.0版發行。到現在為止,EJB已經成功地發布到了EJB 3.0版本了。每一次發布都會具有不同的特性。下面我們簡單回顧一下EJB的發展歷史。

1)EJB 1.0

最初的版本1.0開始支持有狀態和無狀態的服務器對象(稱為會話Bean),以及可選支持持久化域對象(稱為實體Bean)。在可移植性方面,EJB通過提供可移植性和遠程特性的專門遠程接口達到訪問的目的,但是受到了遠程基礎結構和按值傳遞的語義的開銷的影響。

2)EJB 1.1

其后的版本1.1要求廠商支持實體Bean,并且引入XML部署描述文件來替換存儲在專門的串行化類文件中的數據。

3)EJB 2.0

EJB 2.0通過引入本地接口彌補遠程接口造成的開銷和按值傳遞的缺陷。只有運行在Java EE容器內的客戶才能通過其本地接口訪問EJB,但是按引用傳遞的方法調用允許組件之間更加有效地進行交換操作。EJB 2.0還引入了新型的EJB消息驅動Bean(Message-Drive Bean,MDB),能夠參與異步消息系統。實體Bean得到了容器管理的關系的支持,允許Bean的開發者聲明式地指定由EJB容器管理的實體Bean之間的持久化關系。另外還引入了EJB查詢語言EJB QL,它使開發者具有了使用類似于SQL那樣的語言來查詢實體Bean實例的功能。

4)EJB 2.1

EJB 2.1添加了Web服務的支持,允許會話Bean暴露端點接口,添加了允許按照指定的時間或者時間間隔調用EJB的計時器服務。EJB 2.1還提供了擴展EJB QL的功能,并且引入XML Schema來替換定義了ejb-jar.xml部署描述文件的DTD。

5)EJB 3.0

EJB 3.0最重要的改動是實體Bean被替換為POJO,現在被稱為實體,可以運行在EJB容器的外部,因此在實體類本身中不需要專門的接口或者EJB專有的代碼。會話Bean不再需要主接口或者EJB專有的組件接口。在邏輯上它們仍然支持遠程和非遠程接口。這兩個改動和很多其他改動都符合EJB 3.0以簡化的開發模型為中心的新的設計理念。

從以上的5個版本的發布可以看出,各個版本分別為EJB注入了不同的功能。

● EJB 1.0:會話Bean(有狀態和無狀態)、實體Bean。

● EJB 1.1:XML部署描述符。

● EJB 2.0:消息驅動Bean(支持JMS)、EJB查詢語言EJB QL。

● EJB 2.1:支持Web服務、計時器服務。

● EJB 3.0:簡化開發模型。

以上的各個關鍵字涵蓋了EJB的主體功能和技術特性,本書將以最新的EJB 3.0為主進行講解,后面的章節也將循序漸進地講解各種技術的開發應用過程。

3.1.6 EJB 3.0新特性

EJB技術是服務器端企業開發的標準。與Java本身一樣,EJB改變了開發的方式并且激發了很多創新。EJB 3.0作為最新的版本,更具有下面顯而易見的特性。

1)簡單易用

EJB 3.0可能是最簡單的服務器端開發平臺。最值得注意的是POJO程序設計、使用注解而少用冗長的XML、大量使用有意義的默認值,以及JPA。雖然EJB服務的數量眾多,但是會發現它們非常直觀。在很大程度上,EJB 3.0具有實用的外觀并且不要求開發人員了解錯綜復雜的理論。實際上,大多數EJB服務的目的都是使開發人員脫離這種思維模式,以便集中精力完成工作。

2)方便集成

EJB 3.0提供服務器解決方案的各種集成方案,包括持久化、消息、輕量型計劃、遠程處理、Web服務、依賴注入(Dependency Injection,DI)和攔截器。因此,開發人員不必花費很多時間尋找第三方工具并將其集成到應用程序中。此外,EJB 3.0提供與其他Java EE技術的無縫集成,比如JDBC、JavaMail、Java事務API(Java Transaction API,JTA)、Java消息服務(Java Messaging Service,JMS)、Java驗證和授權服務(Java Authentication and Authorization Service,JAAS)、Java命名和目錄接口(Java Naming and Directory Interface,JNDI)、Java遠程方法調用(Java Remote Method Invocation,RMI)等。EJB也保證與表現層技術的無縫集成,比如Java Server Page(JSP)、Servlet、Java Server Face(JSF)和Swing。

3)開放的Java EE標準

EJB是Java EE標準的關鍵部分。EJB 3.0有開放的、公共的API規范,組織機構鼓勵使用它創建容器或持久化提供器實現。EJB 3.0標準是Java Community Process(JCP)開發的,開放標準使更多的廠商支持EJB 3.0,這就意味著不必依賴專有的解決方案。

4)廣泛的廠商支持

EJB被數量眾多的各種各樣的獨立機構支持,包括技術領域中最大、最受尊重的和財力最雄厚的大公司,比如Oracle和IBM,以及充滿熱情和活力的開源組織,比如JBoss和Geronimo。

廣泛的廠商支持帶來3大重要優勢。首先,我們不會受到個別公司或組織的興衰的影響。其次,大量人員的長期投入使這種技術盡可能保持競爭力。從本質上講,在這個充滿競爭的時代,可以充分利用Java和Java以外的各種技術的優勢。另外,廠商在過去的相互競爭中提供了具有附加值的非標準特性。所有這些因素讓EJB繼續健康向前發展。

5)穩定的系統基礎

雖然EJB 3.0是開創性的一步,但是大多數應用程序服務器實現仍然受益于相對穩定的代碼基礎。長期以來,這些代碼基礎經受了一些要求最為苛刻的企業環境的考驗。大多數持久化解決方案(比如JDO、Hibernate和TopLink)也是穩定的產品,在很多任務關鍵型的產品型環境中使用過。這就是說,雖然EJB 3.0非常新,但是我們可以期望較快地得到穩定的實現。此外,由于基于標準的開發的本質,廠商一般會重視EJB 3.0容器實現的質量。在某種意義上,它有利于保證內在的實現質量。

6)易于集群、負載平衡和故障轉移

大多數應用程序服務器廠商增加的特性對集群、負載平衡和故障轉移提供了有力的支持。歷史證明,EJB應用程序服務器支持一些最大型的支持高性能計算(High-Performance Computing,HPC)的服務器集群環境。更重要的是,不必修改代碼,不需要集成第三方工具,通過相對簡單的配置(在創建硬件集群的固有工作之外),我們就可以利用這樣的支持。這就是說,如果有需要,我們可以依靠硬件集群使用EJB3.0擴展我們的應用程序。

主站蜘蛛池模板: 称多县| 西青区| 桐柏县| 孟津县| 绿春县| 屏东县| 获嘉县| 洱源县| 体育| 安顺市| 德钦县| 日土县| 区。| 金昌市| 湘西| 怀来县| 中宁县| 梓潼县| 定南县| 如皋市| 太谷县| 荔波县| 荆州市| 临江市| 南平市| 定州市| 延长县| 邹平县| 千阳县| 郸城县| 肃宁县| 自治县| 铅山县| 长兴县| 吉木萨尔县| 岚皋县| 南安市| 比如县| 贡山| 涞源县| 浦东新区|