【寫(xiě)在前面的一點(diǎn)廢話】
企業(yè)如今生活在一個(gè)全球化競(jìng)爭(zhēng)的世界,他們需要應(yīng)用系統(tǒng)來(lái)滿足他們的業(yè)務(wù)需求,這些需求越來(lái)越復(fù)雜。 在這個(gè)全球化時(shí)代,公司分布不同區(qū)域,他們通過(guò)互聯(lián)網(wǎng)實(shí)現(xiàn)24*7的全天侯模式下跟不同國(guó)家進(jìn)行業(yè)務(wù)往來(lái)。基于多個(gè)數(shù)據(jù)中心以及必須處理不同貨幣和時(shí)區(qū)的國(guó)際化系統(tǒng),這樣以便降低成本和降低服務(wù)的響應(yīng)時(shí)間,并將業(yè)務(wù)數(shù)據(jù)存儲(chǔ)在可靠和安全的存儲(chǔ)上,同時(shí)為其客戶、員工和供應(yīng)商提供移動(dòng)和Web方式的多種交互形式。
大多數(shù)公司必須將這些復(fù)雜的挑戰(zhàn)與其現(xiàn)有的企業(yè)信息系統(tǒng)(EIS)相結(jié)合,同時(shí)開(kāi)發(fā)企業(yè)對(duì)企業(yè)(Business to Business)應(yīng)用程序,以便基于移動(dòng)和地理定位模式的應(yīng)用程序與合作伙伴或企業(yè)對(duì)客戶系統(tǒng)進(jìn)行通信溝通。 這樣,公司不得不協(xié)調(diào)存儲(chǔ)在不同位置的內(nèi)部數(shù)據(jù),由多種編程語(yǔ)言處理,并通過(guò)不同的協(xié)議進(jìn)行路由。 當(dāng)然,在無(wú)損失的情況下,企業(yè)必須這樣做,這意味著分布系統(tǒng)具有防止系統(tǒng)崩潰、高可用性、可擴(kuò)展性和安全性等特性,同時(shí),企業(yè)應(yīng)用必須面對(duì)變化和復(fù)雜性,并且應(yīng)該系統(tǒng)必須是健壯的。 這正是Java企業(yè)版(Java EE)創(chuàng)建的原因所在。
于1999年發(fā)布的Java EE的第一個(gè)版本(最初稱為J2EE)側(cè)重于企業(yè)面臨的問(wèn)題:分布式組件。 從那時(shí)起,軟件應(yīng)用程序不得不適應(yīng)新的技術(shù)解決方案,如SOAP或RESTful Web服務(wù)。Java EE平臺(tái)已經(jīng)發(fā)展到通過(guò)提供各種標(biāo)準(zhǔn)規(guī)范的方法來(lái)滿足這些技術(shù)需求。 多年來(lái),Java EE已經(jīng)發(fā)生變化,變得更加豐富、更簡(jiǎn)單、更易于使用、更便攜和更加集成化。
那么,在本學(xué)習(xí)教程中,我將給出一個(gè)Java EE的總體概述,介紹其內(nèi)部架構(gòu),組件和服務(wù)后等,并介紹Java EE 7中的新功能特性。
圖1-0總結(jié)了14年的Java EE演進(jìn)。 Java EE以前稱為J2EE。 J2EE 1.2是由Sun開(kāi)發(fā)的,并于1999年發(fā)布,包含10個(gè)JSR的總括規(guī)范。 當(dāng)時(shí)人們總在在談?wù)揅ORBA,所以J2EE 1.2是在分布式系統(tǒng)的基礎(chǔ)上創(chuàng)建的。引入了企業(yè)Java Bean(EJB),支持遠(yuǎn)程狀態(tài)和無(wú)狀態(tài)服務(wù)對(duì)象,并支持持久對(duì)象(實(shí)體bean)。 它們基于使用RMI-IIOP(遠(yuǎn)程方法調(diào)用 - Internet Inter-ORB協(xié)議)作為底層協(xié)議的事務(wù)和分布式組件模型構(gòu)建。Web層有servlet和JavaServer Pages(JSP)技術(shù),JMS用于發(fā)送消息之用。
圖1-0 Java EE簡(jiǎn)史
由J2EE 1.3開(kāi)始,該規(guī)范是由Java社區(qū)進(jìn)程(JCP)根據(jù)JSR 58開(kāi)發(fā)的。實(shí)體bean的支持是強(qiáng)制性的,EJB引入了XML部署描述符來(lái)存儲(chǔ)元數(shù)據(jù)(在EJB 1.0中的一個(gè)文件中被序列化)。 該版本解決了使用遠(yuǎn)程接口通過(guò)值傳遞參數(shù)的開(kāi)銷,即通過(guò)引用本地接口并通過(guò)引用傳遞參數(shù)。 引入了J2EE連接器架構(gòu)(JCA)來(lái)實(shí)現(xiàn)Java EE連接到EIS(企業(yè)信息系統(tǒng))。
2003年發(fā)布的J2EE 1.4(JSR 151)在包含20個(gè)規(guī)范,并增加了對(duì)Web服務(wù)的支持。 EJB 2.1允許通過(guò)SOAP / HTTP調(diào)用會(huì)話bean。 創(chuàng)建定時(shí)服務(wù)以允許在指定的時(shí)間或間隔調(diào)用EJB。該版本為應(yīng)用程序的裝配和部署提供了更好的支持。 雖然它的支持者預(yù)測(cè)了它的偉大未來(lái),但并不是所有的J2EE的承諾都實(shí)現(xiàn)了。使用它創(chuàng)建的系統(tǒng)太復(fù)雜,開(kāi)發(fā)時(shí)間常常與用戶需求的復(fù)雜性成正比。 J2EE被視為重量級(jí)組件模型:難以測(cè)試,難以部署,難以運(yùn)行。 就在那時(shí), Struts,Spring或Hibernate等框架出現(xiàn)并導(dǎo)引出開(kāi)發(fā)企業(yè)應(yīng)用程序的新方法。
幸運(yùn)的是,2006年第二季度發(fā)布了Java EE 5(JSR 244),帶來(lái)了顯著的進(jìn)步。 通過(guò)從開(kāi)源框架中獲得了一些靈感,引入POJO編程模型??梢允褂米⑨尪x元數(shù)據(jù),并且XML描述符成為可選的。 從開(kāi)發(fā)人員的角度來(lái)看,EJB 3和新的JPA比平臺(tái)的演變更具有飛躍性。JavaServer Faces(JSF)作為標(biāo)準(zhǔn)的表示層框架被引入,JAX-WS 2.0將JAX-RPC替換為 SOAP Web服務(wù)API。
在2009年,Java EE 6(JSR 316)遵循開(kāi)發(fā)的方便之路,在整個(gè)平臺(tái)(包括Web層)中擁抱含注解、POJO編程和例外配置機(jī)制的概念。 它擁有豐富的創(chuàng)新,如全新的JAX-RS 1.1,Bean Validation 1.0和CDI 1.0; 它簡(jiǎn)化了成熟的API,如EJB 3.1,并豐富了其他的,如JPA 2.0或EJB定時(shí)器服務(wù)。 但是Java EE 6的主要主題是可移植性(例如通過(guò)標(biāo)準(zhǔn)化全局JNDI命名),某些規(guī)范(通過(guò)修剪)的棄用,以及通過(guò)配置文件創(chuàng)建平臺(tái)的子集。
今天,Java EE 7帶來(lái)了許多新的規(guī)范(批量處理,websockets,JSON處理)以及改進(jìn)其他規(guī)范。 Java EE 7還通過(guò)在大多數(shù)規(guī)范中采用CDI來(lái)提高技術(shù)之間的集成。 有機(jī)會(huì),將在教程中,我想向您展示這些改進(jìn),以及Java Enterprise Edition已經(jīng)變得更加容易和豐富開(kāi)發(fā)模式。
當(dāng)想處理對(duì)的集合時(shí),無(wú)需從開(kāi)發(fā)自己的哈希表開(kāi)始——集合API(應(yīng)用程序編程接口)就完全滿足需要了。 同樣,如果您需要一個(gè)簡(jiǎn)單的Web應(yīng)用程序或支持事務(wù)、安全、可互操作和分布式的應(yīng)用程序,則不需要開(kāi)發(fā)所有低級(jí)API:企業(yè)版Java就滿足需要。 正如Java標(biāo)準(zhǔn)版(Java SE)提供的處理集合的API一樣,Java EE提供了一種標(biāo)準(zhǔn)的事務(wù)API方法來(lái)處理Java 事務(wù),使用Java消息服務(wù)(JMS)進(jìn)行消息傳遞,或者使用持久化 API(JPA)進(jìn)行數(shù)據(jù)持久化。Java EE是針對(duì)企業(yè)應(yīng)用程序的一組規(guī)范,它可以被看作是Java SE的擴(kuò)展,以便于開(kāi)發(fā)分布式、健壯的、強(qiáng)大的和高可用性的應(yīng)用程序。
Java EE 7是一個(gè)重要的里程碑。不僅僅是遵循Java EE 6關(guān)注一個(gè)更簡(jiǎn)單的開(kāi)發(fā)模式,而且還增加了新的規(guī)范,并為現(xiàn)有特性增加了新的功能。另外,上下文依賴注入(CDI)正在成為所有這些新規(guī)范之間的集成點(diǎn)。 Java EE 7的發(fā)布與企業(yè)平臺(tái)發(fā)布十三周年緊密相連,將Java語(yǔ)言的優(yōu)勢(shì)與過(guò)去13年所獲得的經(jīng)驗(yàn)結(jié)合起來(lái).Java EE從開(kāi)源社區(qū)的活力中獲益,同時(shí)也得益于嚴(yán)格的 JCP(Java Community Process)標(biāo)準(zhǔn)化進(jìn)程。
今天,Java EE早已成為經(jīng)過(guò)驗(yàn)證的優(yōu)秀平臺(tái),其擁有經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員、大型社區(qū)以及部署在公司服務(wù)器上運(yùn)行著的諸多應(yīng)用系統(tǒng)。Java EE是一套規(guī)范的APIs,可用于構(gòu)建基于標(biāo)準(zhǔn)組件的多層應(yīng)用程序,這些組件部署在提供一系列服務(wù)的不同容器中。
接下來(lái),我們從不同層面理解掌握J(rèn)ava EE 7的不同總體構(gòu)成。
2.1Java EE總體架構(gòu)
Java EE是由不同容器實(shí)現(xiàn)的一組規(guī)范。容器是為其所托管的組件提供某些服務(wù)的Java EE運(yùn)行時(shí)環(huán)境,例如生命周期管理,依賴注入,并發(fā)等。這些組件使用定義良好的規(guī)約與Java EE基礎(chǔ)架構(gòu)以及其他組件進(jìn)行通信。在部署之前,需要以標(biāo)準(zhǔn)方式打包(按照定義的目錄結(jié)構(gòu),可壓縮到歸檔文件中)。注意,Java EE是Java SE平臺(tái)的超集,這意味著Java SE API可以由任何Java EE組件使用。
圖1-1顯示了容器之間的邏輯關(guān)系。箭頭表示一個(gè)容器訪問(wèn)另一個(gè)容器所使用的協(xié)議。 例如,Web容器托管可以通過(guò)RMI-IIOP訪問(wèn)EJB的servlet。
圖1-1 標(biāo)準(zhǔn)Java EE容器架構(gòu)關(guān)系
2.2Java EE構(gòu)件組成
Java EE運(yùn)行時(shí)環(huán)境規(guī)范定義了Java EE“實(shí)現(xiàn)”(可以看作為中間件)必須支持的四種類型的構(gòu)件:
2Applets:瀏覽器小程序是在Web瀏覽器中執(zhí)行的GUI(圖形用戶界面)應(yīng)用程序。它們使用豐富的Swing API來(lái)提供強(qiáng)大的用戶界面。
2Applications:應(yīng)用程序(PC獨(dú)立應(yīng)用程序)是在客戶端上執(zhí)行的程序。它們通常是可以訪問(wèn)Java EE中間層所有設(shè)施的GUI或批處理程序。
2Web Applications:Web應(yīng)用程序(由servlet、servlet過(guò)濾器、Web事件偵聽(tīng)器、JSP和JSF頁(yè)面組成)在Web容器中執(zhí)行,并響應(yīng)來(lái)自Web客戶端的HTTP請(qǐng)求。 Servlet還支持SOAP和RESTful Web服務(wù),Web應(yīng)用程序還可以包含EJB精簡(jiǎn)版(EJBs Lite).
2Enterprise Applications:企業(yè)應(yīng)用程序(由企業(yè)Java Bean、Java消息服務(wù)、Java事務(wù)API、異步調(diào)用、定時(shí)服務(wù)、RMI / IIOP等構(gòu)成)在EJB容器中執(zhí)行。EJBs是用于處理事務(wù)性業(yè)務(wù)邏輯的容器管理組件。它們可以被本地化訪問(wèn)和通過(guò)RMI(或SOAP for SOAP和RESTful Web服務(wù))遠(yuǎn)程訪問(wèn)。
2.3Java EE容器
Java EE基礎(chǔ)架構(gòu)被劃分為稱為容器的邏輯域(見(jiàn)圖1-1)。每個(gè)容器都有一個(gè)特定的角色,支持一組API,并為組件提供服務(wù)(如安全性,數(shù)據(jù)庫(kù)訪問(wèn),事務(wù)處理,命名目錄,資源注入等)。容器隱藏技術(shù)復(fù)雜性并增強(qiáng)可移植性。根據(jù)要構(gòu)建的應(yīng)用程序的類型,將須了解每個(gè)容器的功能和約束,以便使用一個(gè)或多個(gè)。例如,如果您需要開(kāi)發(fā)一個(gè)Web應(yīng)用,將開(kāi)發(fā)具有EJB Lite層的JSF層,并將其部署到Web容器中。但是,如果您希望Web應(yīng)用程序能遠(yuǎn)程調(diào)用業(yè)務(wù)層并使用消息傳遞和異步調(diào)用,那么您將需要Web和EJB容器。
Java EE標(biāo)準(zhǔn)定義了四種不同的容器:
2Applet containers:大多數(shù)Web瀏覽器提供Applet容器來(lái)執(zhí)行applet組件。 當(dāng)開(kāi)發(fā)applets時(shí),在容器提供安全的環(huán)境中,可以集中精力在應(yīng)用程序的可視化方面。 小應(yīng)用程序容器使用沙盒安全模型,其中“沙箱”中執(zhí)行的代碼不允許“在沙箱外活動(dòng)”。這意味著該容器可防止下載到本地計(jì)算機(jī)的任何代碼訪問(wèn)自由本地系統(tǒng)資源,例如進(jìn)程或文件。
2Application client container:應(yīng)用程序客戶機(jī)容器(ACC)包括一組Java類、庫(kù)和其他文件等,用于為Java SE應(yīng)用程序提供注入、完全管理、命名服務(wù)(這樣的應(yīng)用包括Swing應(yīng)用、批處理或僅使用main()方法的類等)。ACC使用RMI-IIOP和具有HTTP的Web容器(例如,用于Web服務(wù))與EJB容器進(jìn)行通信。
2Web container:Web容器提供用于管理和執(zhí)行Web組件(servlet,EJB Lite,JSP,過(guò)濾器,偵聽(tīng)器,JSF頁(yè)面和Web服務(wù))的底層服務(wù)。它負(fù)責(zé)實(shí)例化,初始化和調(diào)用servlet并支持HTTP和HTTPS 協(xié)議。它是用于將網(wǎng)頁(yè)反饋到客戶端瀏覽器。
2EJB container:EJB容器負(fù)責(zé)管理包含Java EE應(yīng)用程序的業(yè)務(wù)邏輯層的企業(yè)bean(會(huì)話bean和消息驅(qū)動(dòng)的bean)的執(zhí)行。它創(chuàng)建EJB的新實(shí)例,管理其生命周期,并提供諸如 事務(wù),安全性,并發(fā)性,分發(fā),命名服務(wù)或異步調(diào)用的可能性。
2.4Java EE服務(wù)
容器為其部署的組件提供基礎(chǔ)服務(wù)。 作為開(kāi)發(fā)人員,容器允許您集中精力實(shí)施業(yè)務(wù)邏輯,而不是解決企業(yè)應(yīng)用程序中面臨的技術(shù)問(wèn)題。圖1-2顯示了每個(gè)容器提供的服務(wù)。 例如,Web和EJB容器提供連接器來(lái)訪問(wèn)EIS,但不提供applet容器或ACC。Java EE提供以下服務(wù):
2Java Transaction API:此服務(wù)提供容器和應(yīng)用程序使用的事務(wù)分界API。 它還提供事務(wù)管理器和服務(wù)提供者接口(SPI)級(jí)別的資源管理器之間的接口。
2Java Persistence API:用于對(duì)象關(guān)系映射(ORM)的標(biāo)準(zhǔn)API。使用其持久性查詢語(yǔ)言(JPQL),可以查詢存儲(chǔ)在底層數(shù)據(jù)庫(kù)中的對(duì)象。
2Validation: Bean驗(yàn)證提供類和方法級(jí)約束聲明和驗(yàn)證功能。
2Java消息服務(wù):這允許組件通過(guò)消息異步通信。它支持可靠的點(diǎn)對(duì)點(diǎn)(P2P)消息傳遞以及發(fā)布訂閱(pub-sub)模型。
2Java命名和目錄接口:此API包含在Java SE中,用于訪問(wèn)命名和目錄系統(tǒng)。應(yīng)用程序使用此技術(shù)將名稱與對(duì)象進(jìn)行關(guān)聯(lián)(綁定),然后在目錄中查找這些對(duì)象(以lookup方式查找)。其可以查找對(duì)象包括數(shù)據(jù)源、JMS工廠、EJB和其他資源等。直到J2EE 1.4,無(wú)所不在的JNDI可以更透明的方式通過(guò)注入使用。
2JavaMail:許多應(yīng)用程序需要發(fā)送電子郵件的功能,可以通過(guò)使用JavaMail API來(lái)實(shí)現(xiàn)。
2JavaBeans激活框架:Java SE中包含的JAF API提供了一種處理不同MIME類型的數(shù)據(jù)的框架。 它被JavaMail使用。
2XML處理:大多數(shù)Java EE組件可以部署可選的XML部署描述符,應(yīng)用程序通常必須處理XML文檔。 Java XML處理API(JAXP)提供了對(duì)使用SAX和DOM以及XSLT解析文檔的支持。XML流化API(StAX)為XML提供了一個(gè)”pull-parsing”(拉式)解析API。
2JSON處理:Java EE 7中新增的JSON 處理API(JSON-P)允許應(yīng)用程序解析、生成、轉(zhuǎn)換和查詢JSON。
2Java EE連接器體系結(jié)構(gòu):連接器允許您從Java EE訪問(wèn)EIS,EIS可以是數(shù)據(jù)庫(kù),大型機(jī)或企業(yè)資源計(jì)劃(ERP)程序等。
2安全服務(wù):Java認(rèn)證和授權(quán)服務(wù)(JAAS)使服務(wù)能夠?qū)τ脩暨M(jìn)行身份驗(yàn)證和強(qiáng)制訪問(wèn)控制。 Java授權(quán)服務(wù)提供商規(guī)約(JACC)定義了Java EE應(yīng)用程序服務(wù)器和授權(quán)服務(wù)提供商之間的約束,允許將自定義授權(quán)服務(wù)提供商插入到任何Java EE產(chǎn)品中。 容器的Java認(rèn)證服務(wù)提供程序接口(JASPIC)定義了一個(gè)標(biāo)準(zhǔn)接口,通過(guò)該標(biāo)準(zhǔn)接口可以將認(rèn)證模塊集成到容器中,以便這些模塊可以建立容器使用的認(rèn)證標(biāo)識(shí)。
2Web服務(wù):Java EE為SOAP和RESTful Web服務(wù)提供支持。用于XML Web服務(wù)的Java API(JAX-WS),提供了支持SOAP/HTTP協(xié)議的web服務(wù)(用于替代基于XML的RPC即JAX-RPC的API)。 RESTful服務(wù)API(JAX-RS)提供了對(duì)使用REST風(fēng)格的Web服務(wù)的支持。
2依賴注入:自Java EE 5以來(lái),可以將一些資源(數(shù)據(jù)源,JMS工廠,持久性單元,EJBs ...)注入到托管組件中。 Java EE 7通過(guò)使用CDI以及DI(Java的依賴注入)規(guī)范實(shí)現(xiàn)了對(duì)依賴注入的進(jìn)一步應(yīng)用擴(kuò)展。
2管理:Java EE使用特殊的管理企業(yè)bean定義用于管理容器和服務(wù)器的API。 Java管理擴(kuò)展(JMX)API也用于提供一些管理支持。
2部署:Java EE部署規(guī)范定義了部署工具和Java EE產(chǎn)品之間的規(guī)約,以標(biāo)準(zhǔn)化應(yīng)用程序部署。
圖1-2 容器提供服務(wù)支持及關(guān)系圖
2.5Java EE網(wǎng)絡(luò)協(xié)議
如圖1-2所示,部署在容器中的組件可以通過(guò)不同的協(xié)議進(jìn)行調(diào)用。 例如,部署在Web容器中的servlet可以使用HTTP以及在EJB容器中部署EJB端點(diǎn)的Web服務(wù)來(lái)調(diào)用。 以下是Java EE支持的協(xié)議列表:
2HTTP:HTTP是Web協(xié)議,在現(xiàn)代應(yīng)用程序中是普遍存在的。客戶端API由Java SE中的java.net包定義。HTTP服務(wù)器端API由servlet、JSP和JSF接口定義,就像SOAP和RESTful Web服務(wù)一樣。
2HTTPS:HTTPS是HTTP和安全套接字層(SSL)協(xié)議的組合。
2RMI-IIOP:遠(yuǎn)程方法調(diào)用(RMI)允許您獨(dú)立于底層協(xié)議調(diào)用遠(yuǎn)程對(duì)象。Java SE本機(jī)RMI協(xié)議是Java遠(yuǎn)程方法協(xié)議(JRMP).RMI-IIOP是用于與CORBA集成的RMI的擴(kuò)展 .Java界面描述語(yǔ)言(IDL)允許Java EE應(yīng)用程序組件使用IIOP協(xié)議調(diào)用外部CORBA對(duì)象。 CORBA對(duì)象可以用許多語(yǔ)言(Ada,C,C ++,Cobol等)以及Java編寫(xiě)。
2.6Java EE 打包
要部署在容器中,組件首先要封裝在標(biāo)準(zhǔn)的格式化存檔中。 Java SE定義了Java Archive(jar)文件,用于將多個(gè)文件(Java類,部署描述符,資源或外部庫(kù))聚合到一個(gè)壓縮文件(基于ZIP格式)中。 如圖1-3所示,Java EE定義了基于通用jar格式的具有自己的打包格式的不同類型的模塊。
圖1-3 容器中打包歸檔格式
針對(duì)上述歸檔模式,說(shuō)明如下:
其一,應(yīng)用程序客戶端模塊包含打包在jar文件中的Java類和其他資源文件。 該jar文件可以在Java SE環(huán)境或應(yīng)用程序客戶端容器中執(zhí)行。 像任何其他存檔格式一樣,jar文件包含一個(gè)可選的META-INF目錄,用于描述歸檔的元信息。 META-INF / MANIFEST.MF文件用于定義擴(kuò)展和包相關(guān)數(shù)據(jù)。 如果部署在ACC中,則部署描述符可以可選地位于META-INF / application-client.xml。
其二,EJB模塊包含打包在jar文件(通常稱為EJB jar文件)中的一個(gè)或多個(gè)會(huì)話和/或消息驅(qū)動(dòng)的bean(MDB)。 它包含一個(gè)可選的META-INF / ejb-jar.xml部署描述符,并且只能部署在EJB容器中。
其三,Web應(yīng)用程序模塊包含servlet,JSP,JSF頁(yè)面和Web服務(wù),以及任何其他Web相關(guān)文件(HTML和XHTML頁(yè)面,級(jí)聯(lián)樣式表(CSS),Java腳本,圖像,視頻等)。 從Java EE 6以來(lái),Web應(yīng)用程序模塊還可以包含EJB Lite bean(EJB API的一個(gè)子集)。所有這些工件都封裝在帶有.war擴(kuò)展名(通常稱為war文件或Web Archive)的jar文件中。可選Web部署描述符在WEB-INF / web.xml文件中定義。 如果war包含EJB Lite bean,則可以在WEB-INF / ejb-jar.xml中設(shè)置可選的部署描述符。 Java.class文件放置在WEB-INF / classes目錄和依賴的jar文件的WEB-INF / lib目錄下。
其四,企業(yè)模塊可以包含零個(gè)或多個(gè)Web應(yīng)用程序模塊,零個(gè)或多個(gè)EJB模塊以及其他常用或外部庫(kù)。所有這些都被打包成企業(yè)歸檔(具有.ear擴(kuò)展名的jar文件),以便各種部署模塊協(xié)同進(jìn)行并發(fā)。 可選的企業(yè)模塊部署描述符在META-INF / application.xml文件中定義。特殊的lib目錄用于在模塊之間共享公共庫(kù)。
2.7注解和部署描述符
在編程范例中,有兩種方法:命令式編程和聲明式編程。語(yǔ)法編程規(guī)定了實(shí)現(xiàn)目標(biāo)的算法(必須做的事情),而聲明式編程規(guī)定了如何實(shí)現(xiàn)這一目標(biāo)(如何完成)。 在Java EE中,通過(guò)使用元數(shù)據(jù)(即注釋或/和部署描述符)完成聲明式編程。
如圖1-2所示,組件在容器中運(yùn)行,此容器為組件提供了一組服務(wù).Metadata用于聲明和自定義這些服務(wù),并將附加信息與Java類、接口、構(gòu)造函數(shù)、方法、字段或參數(shù)相關(guān)聯(lián) 。
自從Java EE 5以來(lái),注釋在企業(yè)平臺(tái)上一直在增長(zhǎng)。它們使用元數(shù)據(jù)信息來(lái)修飾代碼(Java類,接口,字段,方法...)。 清單1-1顯示了一個(gè)POJO(普通Java對(duì)象),它使用類和屬性上的注釋來(lái)聲明某些行為。
@Stateless
@Remote(ItemRemote.class)
@Local(ItemLocal.class)
@LocalBean
public class ItemEJB implements ItemLocal, ItemRemote {
@PersistenceContext(unitName = 'chapter01PU')
private EntityManager em;
public Book findBookById(Long id) {
return em.find(Book.class, id);
}
}
代碼清單1-1:注解式EJB
聲明元數(shù)據(jù)的另一種方式是使用部署描述符。部署描述符(DD)是指與容器中組件一起部署的XML配置文件.Listing 1-2顯示了一個(gè)EJB部署描述符。 像大多數(shù)Java EE 7部署描述符一樣,它定義了http://xmlns.jcp.org/xml/ns/javaee命名空間,并包含版本屬性
規(guī)范。
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' ?
xsi:schemaLocation='http://xmlns.jcp.org/xml/ns/javaee ?
http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd' ?
version='3.2'>
代碼清單1-2:EJB部署描述符
部署描述符需要與特殊的META-INF或WEB-INF目錄中的組件打包在一起,以備參考。 表1-1顯示了Java EE部署描述符和相關(guān)規(guī)范的列表
表1-1:JavaEE部署描述列表
文件 | 規(guī)范 | 路徑 |
application.xml | Java EE | META-INF |
application-client.xml | Java EE | META-INF |
beans.xml | CDI | META-INF or WEB-INF |
ra.xml | JCA | META-INF |
ejb-jar.xml | EJB | META-INF or WEB-INF |
faces-config.xml | JSF | WEB -INF |
persistence.xml | JPA | META-INF |
validation.xml | Bean Validation | META-INF or WEB-INF |
web.xml | Servlet | WEB-INF |
web-fragment.xml | Servlet | WEB-INF |
webservices.xml | SOAP Web Services | META-INF or WEB-INF |
由于Java EE 5大多數(shù)部署描述符是可選的,應(yīng)用可以使用注釋?;蚴褂脙烧咧袑?duì)應(yīng)用程序最好的方式即可。 注釋的最大優(yōu)點(diǎn)是它們顯著減少了開(kāi)發(fā)人員編寫(xiě)的代碼量,并且通過(guò)使用注釋可以避免編寫(xiě)部署描述符的需要。 另一方面,部署描述符是可以更改的外部XML文件,而不需要修改源代碼和重新編譯。 如果您同時(shí)使用這兩者,當(dāng)部署應(yīng)用程序或組件時(shí)則元數(shù)據(jù)將被部署描述符覆蓋(即XML優(yōu)先于注釋)。
2.8編程模型
大多數(shù)Java EE 7規(guī)范使用相同的編程模型。 它通常是一個(gè)POJO,它將一些元數(shù)據(jù)(注釋或XML)部署到容器中。 大多數(shù)時(shí)候,POJO甚至沒(méi)有實(shí)現(xiàn)一個(gè)接口或者擴(kuò)展一個(gè)超類。 由于元數(shù)據(jù),容器知道應(yīng)用于此已部署組件的每一個(gè)服務(wù)。
在Java EE 7中,servlet,JSF支持bean,EJB,實(shí)體,SOAP和REST Web服務(wù)是帶可選XML部署描述符的注釋類。 清單1-3顯示了一個(gè)JSF支持bean,證明是具有單個(gè)CDI注釋的Java類。
清單1-3:JSF后端Bean
@Named
public class BookController {
@Inject
private BookEJB bookEJB;
private Book book = new Book();
private List
public String doCreateBook() {
book = bookEJB.createBook(book);
bookList = bookEJB.findBooks();
return 'listBooks.xhtml';
}
// Getters, setters
}
EJB也遵循相同的模式。 如清單1-4所示,如果您需要在本地訪問(wèn)EJB,則沒(méi)有接口的簡(jiǎn)單注釋類就足夠了。 EJB也可以直接部署在war文件中,而不會(huì)先前封裝在jar文件中。 這使EJB成為可以從簡(jiǎn)單的Web應(yīng)用程序到復(fù)雜的企業(yè)應(yīng)用程序使用的最簡(jiǎn)單的事務(wù)組件。
代碼清單1-4:無(wú)狀態(tài)EJB
@Stateless
public class BookEJB {
@Inject
private EntityManager em;
public Book findBookById(Long id) {
return em.find(Book.class, id);
}
public Book createBook(Book book) {
em.persist(book);
return book;
}
}
RESTful Web服務(wù)已經(jīng)進(jìn)入現(xiàn)代應(yīng)用程序。 Java EE 7通過(guò)改進(jìn)JAX-RS規(guī)范來(lái)滿足企業(yè)的需求。 如清單1-5所示,一個(gè)RESTful Web服務(wù)是一個(gè)響應(yīng)HTTP操作的帶有注釋的Java類。
代碼清單1-5:RESTFUL web服務(wù)
@Path('books')
public class BookResource {
@Inject
private EntityManager em;
@GET
@Produces({'application/xml', 'application/json'})
public List
Query query = em.createNamedQuery('findAllBooks');
List
return books;
}
聯(lián)系客服