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

1.4 J2EE核心技術

J2EE定義了一個框架和相關的規范,而實現這個框架的具體工具需要第三方廠商來完成,不同的廠商可能實現的方式也不一樣,部分廠商可能專注于J2EE架構中的特定組件,比如Tomcat只提供了對JSP和Servlet的支持,而WebSphere和WebLogic應用服務器為整個J2EE規范提供了一個比較完整的實現,它們包含了J2EE定義的多種技術規范。

通常,初學者在學習Java時,會遇到諸如JDBC,JNDI,EJB,JSP和Servlet等技術,這些技術主要應用在哪些方面呢?J2EE核心技術應用的示意圖如圖1.7所示。

圖1.7 J2EE核心技術應用示意圖

注:EIS的英文全稱是“Enterprise Information System”,中文意思即企業信息系統。

下面將對J2EE所涉及的核心技術進行大概的講解,目的是使讀者了解J2EE的構成和掌握相關的技術。

1.4.1 Servlet

Servlet采用請求響應的工作方式。Servlet技術作為Web服務器功能的增強器,其功能涵蓋了從客戶端請求相應動態生成文檔到保證會話安全,訪問后臺數據庫服務器等。Servlet有自己的生命周期,一般作為Servlet容器或者Web容器中的組件進行管理,每個Servlet都需要實現Servlet接口,其主要的邏輯將集中在service方法中。

Servlet是用Java Servlet API開發的,主要體現在javax.servlet和javax.servlet.http這兩個程序包里。這兩個程序包里包括了類、接口及框架,它們所封裝的功能和屬性能為所有Http協議的請求、回應提供通信服務,包括對話處理、post請求和get請求。Servlet是運行在服務器端,用來響應客戶端請求的Java代碼模塊。

注意

每個Servlet請求是由同一個線程而不是由一個全新的進程來處理的。

一個Servlet的生命周期由部署Servlet的容器來控制。當一個請求映射到一個Servlet時,該容器執行下列步驟。

● 如果一個Servlet的實例并不存在,Web容器將加載Servlet類,創建一個Servlet類的實例,調用init初始化Servlet實例。

● 調用service方法,傳遞一個請求和響應對象。

● 如果該容器要移除這個Servlet,可調用Servlet的destroy方法來結束該Servlet。

Servlet的生存期包括加載、實例化、初始化、處理請求及服務結束。

(1)加載和實例化

容器必須先定位Servlet類,在必要的情況下,容器使用通常的Java類加載工具加載該Servlet,可以是從本機文件系統,也可以是從遠程文件系統甚至其他的網絡服務。容器加載Servlet類后,會實例化該類的一個實例。實例化和加載可以發生在引擎啟動的時候,也可以推遲到容器需要該Servlet為客戶請求服務的時候。

(2)初始化

Servlet加載并實例化后,容器必須在它能夠處理客戶端請求前將其初始化。初始化的過程主要是讀取配置信息、數據庫連接池及其他僅僅需要執行一次的任務。通過調用它的init方法并給它傳遞唯一的一個ServletConfig對象來完成這個過程。

(3)處理請求

在Servlet被適當地初始化后,容器就可以使用它去處理請求了。每一個請求由Servlet Request類型的對象代表,而Servlet使用ServletResponse返回該請求。這些對象被作為service方法的參數傳遞給Servlet。在Http請求的情況下,容器必須提供代表請求和響應的HttpServletRequest和HttpServletResponse的具體實現。

(4)服務結束

當service方法中執行的線程執行完或者在服務器定義的一段時間內執行完成后,容器才能夠調用destroy方法。因為一旦destroy方法被調用,容器就不會再向該實例發送任何請求。如果容器需要再使用該Servlet,必須創建新的實例。

Servlet 2.5版本增加了對XSD(Xml Schema Definition)的支持,增加了ServletRequest相關的Listener機制,增強了RequestDispatcher和Filter的結合功能,使得RequestDispatcher的功能更加容易實現。

Servlet最新版本是Servlet 3.0,Servlet 3.0在Servlet 2.5基礎上增加了若干新特性用于簡化Web應用的開發和部署,如:異步處理支持、新增的注解支持、可插性支持。

● 異步處理支持:有了該特性,Servlet線程不再需要一直阻塞,直到業務處理完畢才能再輸出響應,最后才結束該Servlet線程。在接收到請求之后,Servlet線程可以將耗時的操作委派給另一個線程來完成,自己在不生成響應的情況下返回至容器。針對業務處理較耗時的情況,這將大大減少服務器資源的占用,并且提高并發處理速度。

● 新增的注解支持:用于簡化Servlet、過濾器(Filter)和監聽器(Listener)的聲明,這使得web.xml部署描述文件從該版本開始不再是必選的了。

● 可插性支持:熟悉Struts 2的開發者一定會對其通過插件的方式與包括Spring在內的各種常用框架的整合特性記憶猶新。將相應的插件封裝成JAR包并放在類路徑下,Struts 2運行時便能自動加載這些插件。現在Servlet 3.0提供了類似的特性,開發者可以通過插件的方式很方便地擴充已有Web應用的功能,而不需要修改原有的應用。

1.4.2 JSP(Java服務頁面)

JSP是對HTML的一種擴展,JSP提供的功能大多與Java Servlet類似。Servlet全部是由Java寫成并且生成HTML;而JSP通常是大多數HTML代碼中嵌入少量的Java代碼,JSP的擴展機制還允許開發人員編寫自己的標簽和相應的實現方法。JSP作為Servlet技術的擴展,簡化動態Web內容的傳輸,由4個關鍵的組件組成:指令、動作、腳本和標簽庫。

● 指令是指Web程序員通過編程方式通知支持JSP的Web容器進行定制,比如錯誤網頁或者是定制的標簽庫或者其他資源。

● 動作則是對網頁的動態包含資源或者插件,提交轉發,使用JavaBean實例等進行定義與操作。

● 腳本則是支持Java語言的邏輯流,通過特定的標記隔離。

● 標簽庫包括標準標簽庫和定制標簽庫,主要是用于對Web內容顯示的一種組件方式的定制。標簽庫的定義主要由標簽句柄類和標簽庫描述文檔組成,句柄類是對定制標簽的內容進行定義的一個類,一般要實現Tag接口,標簽庫描述符則對標簽庫進行描述,并且與某個句柄類進行相關聯。

JSP的運行方式如下。

當瀏覽器向服務器發出請求時,被請求的JSP首先被Web應用服務器編譯成Servlet并執行,然后將所產生的結果作為一個HTML文件傳給瀏覽器。只要在JSP文件中加入一些控制,便可輕易地實現對數據的動態顯示。如果該JSP文件沒有被修改過,當瀏覽器再向服務器發出請求時,JSP文件將不會再被編譯,而是直接執行已編譯好的Servlet。

1.4.3 EJB(企業JavaBean)

EJB組件由容器來管理EJB組件的事務、安全和資源連接問題。前面講過,EJB主要由三種Bean組成:會話Bean、實體Bean和消息Bean。從EJB 2.0開始,實體Bean就以全新的模型出現,而消息Bean也是在EJB 2.0才引入的。會話Bean主要有有狀態與無狀態之分,兩者的區別僅僅在會話狀態的維護上,會話Bean可以作為客戶端的狀態來理解,客戶端是操作與狀態的集合。

實體Bean就是對持久化的管理,當然實體Bean可以分為BMP(Bean Managed Persistence)和CMP(Container Managed Persistence),其分歧也就在對持久化的管理方面,這兩種實體Bean各有各的好處。BMP由于直接對底層數據庫進行持久化操作,所以編碼的代價比較高;而CMP則是通過EJB 2.0中引入的EJB QL提供標準接口,屏蔽掉了JDBC驅動的操作,以此通過EJB容器來對持久化進行管理。EJB的調用過程大致上可分為以下幾步。

● 根據傳入的屬性,初始化上下文InitialContext。

● 獲取遠程的或者本地的Home接口。

● 進行Home.create(),獲取遠程EJB對象。

● 通過EJB對象調用業務方法,這些業務方法會被EJB實現。

1.4.4 JDBC(Java數據庫連接)

Java數據庫連接的英文全稱是Java Database Connectivity,簡稱JDBC。與ODBC一樣,JDBC對開發者屏蔽了一些細節問題,另外,JDBC對數據庫的訪問也具有平臺無關性,它使用已有的SQL標準并支持與其他數據庫連接標準。JDBC實現了所有這些面向標準的目標并且具有簡單、嚴格類型定義且高性能實現的接口。JDBC有如下3種產品組件。

(1)JDBC驅動程序管理器:JDBC驅動程序管理器是JDBC體系結構的支柱。它實際上很小,也很簡單,其主要作用是把Java應用程序連接到正確的JDBC驅動程序上,然后退出。

(2)JDBC驅動程序測試工具包:JDBC驅動程序測試工具包為使JDBC驅動程序運行開發人員的程序提供一定的可信度。只有通過JDBC驅動程序測試的驅動程序才被認為是符合JDBC標準的。

(3)JDBC-ODBC橋:JDBC-ODBC橋使ODBC驅動程序可被用作JDBC驅動程序。它的實現為JDBC的快速發展提供了一條途徑,其長遠目標是提供一種訪問某些不常見的DBMS的方法。

目前,比較常見的JDBC驅動程序可分為以下幾種。

(1)JDBC-ODBC橋+ODBC驅動程序:JDBC橋利用ODBC驅動程序提供JDBC訪問。這種類型的驅動程序最適合于企業網或者是用Java編寫的三層結構的應用程序服務器。

(2)本地API:這種類型的驅動程序把客戶機API上的JDBC調用轉換為Oracle,Sybase,Informix,DB2或其他DBMS的調用。

(3)JDBC網絡純Java驅動程序:這種驅動程序將JDBC轉換為與DBMS無關的網絡協議,之后這種協議又被某個服務器轉換為一種DBMS協議。這種網絡服務器中間件能夠將它的純Java客戶機連接到多種不同的數據庫上,所用的具體協議取決于提供者。這是最為靈活的JDBC驅動程序,有可能所有這種解決方案的提供者都提供適合于Intranet用的產品。

(4)本地協議純Java驅動程序:這種類型的驅動程序將JDBC調用直接轉換為DBMS所使用的網絡協議。這將允許從客戶機機器上直接調用DBMS服務器,是Intranet訪問的一個很實用的解決方法。由于許多這樣的協議都是專用的,因此數據庫提供者自己將是主要來源。

這里要說明一點:盡管幾乎每一個J2EE分布式應用程序都不可能離開數據庫與JDBC,但JDBC其實只是J2SE規范中的一部分。

1.4.5 JTA/JTS(Java事務)

為了使應用系統可以訪問各種事務監控,JTA定義了一種標準的API,它指定事務管理器與分布式事務中涉及的其他系統組件之間的各種高級接口,這些系統組件有應用程序、應用程序服務器和資源管理器等。JTA功能允許事務由應用程序本身、應用程序服務器或一個外部事務管理器來管理。JTA接口包含在javax.transaction和javax.transaction.xa這兩個包中。

JTS事務管理器主要在以下幾個地方提供了事務服務:應用服務器、資源管理器、獨立應用及通信資源管理器。JTS是CORBA OTS事務監控的基本實現。JTS規定了事務管理器的實現方式,該事務管理器既在高層支持JTA規范,又在底層實現OMG OTS specification的Java映像。

1.4.6 JNDI(Java命名和目錄服務)

Java命名和目錄服務的英文全稱是Java Naming and Directory Interface,簡稱JNDI。為了便于查找、掛載、卸載及其他操作,JNDI將各個被命名的信元組成樹狀的目錄。JNDI為定位用戶、資源與服務提供了一個標準的接口。JNDI作為客戶端與命名和目錄服務的訪問接口,屏蔽了各種命名和目錄服務的細節,使得開發人員可以在各種服務之間進行訪問。

JNDI由兩部分組成:應用程序編程接口和服務供應商接口。應用程序編程接口提供了Java應用程序訪問各種命名和目錄服務的功能,服務供應商接口提供了供任意一種服務的供應商使用的功能。

JNDI的API主要有javax.naming,javax.naming.directory,javax.naming.event,javax.naming.ldap;JNDI的SPI在javax.naming.spi中。javax.naming提供了訪問命名服務的接口,javax.naming.directory提供了對目錄服務的接口,javax.najming.event則是提供對服務的事件機制的支持。

1.4.7 JavaMail(Java郵件服務)

JavaMail使得開發人員可以實現自己的郵件服務,它可以用來建立基于標準的電子郵件客戶機,它配置了各種因特網郵件協議,包括SMTP,POP,IMAP和MIME,還包括相關的NNTP,S/MIME及其他協議。JavaMail提供了一套郵件服務器的抽象類,不僅支持SMTP服務器,也支持IMAP服務器。

JavaMail接口包含在javax.mail及其子包中,JavaBeans Activation Framework接口包含在javax.activation包中,核心JavaMail API由7個類組成:Session,Message,Address,Authenticator,Transport,Store及Folder。通過上述類,可以完成發送消息、檢索消息、刪除消息、認證、回復消息、轉發消息、管理附件、處理基于HTML文件格式的消息及搜索或過濾郵件列表等功能,也就是說,常見的電子郵件任務都可以通過JavaMail來實現。

1.4.8 RMI(遠程方法調用)

遠程方法調用的英文全稱是Remote Method Invocation,簡稱RMI。RMI是一種被EJB使用的更低層的協議,它為分布式計算提供了一種高級的通用解決方案。為了使開發者可以用本地對象調用的語法進行遠程調用,它使用了連續序列方式在客戶端和服務器端傳遞數據,將面向對象編程模型擴展到了客戶機/服務器系統。RMI在java.rmi及其子包中實現。為了實現位置透明性,RMI使用標準機制——存根和框架。存根是代表遠程對象的客戶機端對象,它具有和遠程對象相同的接口或方法列表。

當客戶機調用存根方法時,將執行下列操作。

● 初始化與包含遠程對象的服務器端虛擬機的連接。

● 對服務器端虛擬機的參數進行列集(Marshal)并通過RMI基礎結構將請求轉發到遠程對象。

● 等待方法調用結果。

● 散集(Unmarshal)返回值或返回的異常。

● 將值返回給調用程序。

利用RMI編寫分布式對象應用程序,開發人員必須完成如下工作。

(1)定位遠程對象。

(2)與遠程對象通信。

(3)給作為參數或返回值傳遞的對象加載類字節碼。

1.4.9 JMS(Java消息服務)

Java消息服務的英文全稱是Java Message Service,簡稱JMS。JMS是用于和企業消息傳遞系統相互通信的應用程序接口,其消息傳遞機制分為兩種:發布訂閱式(P/S)和點對點式(P2P)。這兩種消息的傳遞機制都實現了異步傳遞模式,其區別在于前者通過Topic的形式,使得多個Consumer都可以使用,主要是進行了Subscribe;后者則是通過Queue的形式,將Consumer和Producer之間進行了安全連接,使得消息傳遞只在這兩者之間進行。

以前,為了讓客戶程序訪問它們的產品,每個MOM(Message Oriented MiddleWare)供應商都提供專有的API。而現在,用JMS編寫的程序能夠在任何實現了JMS標準的MOM上運行,這樣MOM供應商就不需要再提供專有的API了。

1.4.10 JMX(Java分布式管理)

Java分布式管理的英文全稱是Java Management Extensions,簡稱JMX。它是一種應用編程接口、可擴展對象和方法的集合體,因為它主要是為了解決分布式問題,所以在設計上,它可以跨越各種異構操作系統平臺、系統體系結構和網絡傳輸協議,開發無縫集成的面向系統、網絡和服務的管理應用。

1.4.11 JACC(Java容器授權合同)

Java容器授權合同的英文全稱是Java Authorization Service Provider Contract for Containers,簡稱JACC。為了將各種授權認證服務器置入J2EE產品中去,它在J2EE應用服務器和特定的授權認證服務器之間定義了一個連接的協約。

1.4.12 JCA(Java連接器體系)

Java連接器體系的英文全稱是Java Connector Architecture,簡稱JCA。它幫助開發者進行不同種類的EIS之間的無縫集成,用一種安全的、事務性的方法連接J2EE應用程序和非J2EE環境。JCA連接器一方面與J2EE應用服務器建立系統級連接,另一方面與訪問EIS資源的應用組件建立應用級連接。

JCA規范定義了應用程序和EIS各種級別的接口,描述了如何在應用程序服務器和后端應用程序間部署資源適配器。資源適配器存在于應用程序服務器的地址空間內,實現了允許應用程序服務器和EIS間交互的編程接口。JCA規范可以在同一次消息交換或同一個事務中把消息的發送和處理結合起來,因此利用JCA API的解決方案比利用基于JMS的解決方案在與后端結合方面耦合性要高。

JCA規范中定義了兩種級別的編程接口:

● 一種接口是公共客戶機接口,任何J2EE組件都可以用這種接口與EIS進行交互。

● 一種接口是系統編程接口,它們只在應用程序服務器內部使用。

主站蜘蛛池模板: 靖边县| 娄烦县| 上栗县| 龙口市| 体育| 武鸣县| 横峰县| 洛南县| 海宁市| 江口县| 祁门县| 弥渡县| 奉贤区| 若尔盖县| 阿拉善盟| 仙游县| 沙洋县| 大竹县| 搜索| 方山县| 永定县| 邳州市| 阳曲县| 阿坝| 阿鲁科尔沁旗| 金沙县| 桂林市| 万安县| 东安县| 宁阳县| 赞皇县| 寿宁县| 买车| 商丘市| 罗源县| 哈密市| 金沙县| 分宜县| 昂仁县| 周口市| 凤庆县|