天天看點

J2EE與EJB——Java Web(二)1、什麼是J2EE2、J2EE中常用的術語有哪些3、EJB有哪些不同的類别4、EJB與JavaBean有什麼異同5、Web 伺服器與Web應用伺服器有什麼差別6、SOAP與REST有什麼差別7、資料庫連接配接池的工作機制是怎樣的8、J2EE 開發有哪些調優的方法

1、什麼是J2EE

J2EE(Java2 Platform,Enterprise Edition)是Java平台企業版的簡稱,是用來開發與部署企業級應用的一個架構,它提供了一種統一的、開放标準的多層平台,該平台主要由構件、服務和通信3個子產品構成。

構件包含用戶端構件和伺服器端構件兩種類型,其中,用戶端構件主要包含兩類Applets和Application Clients,伺服器端構件分為兩類Web構件(Servlet與JSP)和EJBs(Enterprise Java Beans)兩種。服務由J2EE平台提供商實作,分為Service API(開發時使用)和運作時服務。通信由容器提供的支援協作構件之間的通信。

從本質上來講,J2EE隻是一個行業标準,主要用來通過Java開發伺服器端應用提供一個獨立的、可移植的、多使用者的企業級平台,進而能夠簡化應用程式的開發和部署。正是由于J2EE隻是一個标準而不是一個成熟的産品,是以目前有很多不同類型的J2EE伺服器。隻要開發的應用程式符合J2EE的标準,就都可以部署在遵循了J2EE開發标準的J2EE伺服器上。這種标準使得開發人員隻需要專注于各種應用系統的商業邏輯與架構設計,而不用過多地考慮底層繁瑣的程式編寫工作,系統的開發與部署效率大幅提升。

J2EE與EJB——Java Web(二)1、什麼是J2EE2、J2EE中常用的術語有哪些3、EJB有哪些不同的類别4、EJB與JavaBean有什麼異同5、Web 伺服器與Web應用伺服器有什麼差別6、SOAP與REST有什麼差別7、資料庫連接配接池的工作機制是怎樣的8、J2EE 開發有哪些調優的方法

2、J2EE中常用的術語有哪些

J2EE中常用的術語有Web伺服器、Web容器、EJB容器、Applet容器、Application Client容器、JNDI、JMS、JTA、JAF、RMI等。下面将分别對它們進行解釋。

(1)Web伺服器

Web伺服器是指駐留在Internet上的計算機程式。它是一種服務程式,其主要工作是接收來自于用戶端的請求,然後把對請求的處理結果傳回給用戶端。使用者可以通過浏覽器來請求所需資源,這些資源可以是HTML頁面、圖檔、音頻、視訊或者PDF文檔等,Web伺服器接收到請求後會去查找使用者請求的資源,然後把找到的資源傳回給使用者。需要注意的是,它是一個被動的程式,隻有當收到來自用戶端的請求後,才會發送響應。目前最流行的兩大Web 伺服器是:IIS(Internet Information Services)和Apache Htp Server(簡稱Apache)。

(2)Web容器

Web容器也被叫作Web應用伺服器,它是一種服務程式,用來給運作在其中的程式(例如Servlet、JSP等)提供一個運作的環境。由于Web容器的存在,Servlet 隻需要關注業務邏輯的處理而不用關注與用戶端的互動,因為這些互動都已經由Web容器來協助完成了。常見的Web 容器有Tomcat、JBoss、WebLogic和WebSphere等。下面以Tomcat為例介紹一下Web容器主要完成了哪些工作:當Web伺服器(例如Apache)接收到一個用戶端對Servlet的請求後,不是直接把這些請求交給Servlet來處理,而是交給Web容器來處理,由Web容器負責給Servlet提供HTTP請求與響應對象,同時容器調用Servlet的doGet()或doPost()方法來處理使用者的請求。

(3)EJB容器

EJB容器是一個伺服器端容器。EJB(Enterprise JavaBean)是J2EE應用的業務層的技術标準,隻要滿足J2EE規範的元件就能在EJB容器中運作,這個元件就會被EJB容器高效地管理。同時,EJB容器還給運作在其中的元件提供了安全而優越的服務環境,例如事務管理、郵件服務等。

需要注意的是,EJB元件不能顯式地使用EJB容器的API(Application Programming Interface,應用程式接口)來請求容器提供的中間件服務,但可以隐式地讓EJB容器知道它們的需求,例如在基于XML的部署描述符中制定所需的配置資訊,在Bean類中使用部署注釋請求中間件服務。EJB容器為EJB元件隐式地提供中間件服務。

(4)Applet容器

Applet容器是一個用戶端容器,包含的元件為Applet。Applet是一種嵌入在浏覽器中的輕量級用戶端,一般而言,隻有當使用Web頁面無法充分地表現資料或應用界面時,才會使用它。Applet是一種替代Web頁面的手段,開發人員隻能夠使用J2SE開發Applet,出于安全性的考慮,Applet 無法使用J2EE的各種 Service和API。

(5)Application Client容器

Application Client容器是一個用戶端容器,包含的元件為Application Client。相對Applet而言,Application Client是一種較重量級的用戶端,它能夠使用J2EE的大多數Service和API。

(6)JNDI JNDI全稱為Java Naming and Directory Interface,譯為Java命名和目錄接口。

它提供了一個目錄系統,并将服務名稱與對象關聯起來,進而使得開發人員在開發過程中可使用名稱來通路對象。

通過使用JNDI,一方面實作了快速查找和定位分布式應用程式的功能,另一方面使得程式有了更好的可擴充性。由于JNDI是獨立于目錄協定的,是以應用還可以使用JNDI通路各種特定的目錄服務,例如輕量級目錄通路協定(Lightweight Directory Access Protocol,LDAP)、網絡資料服務(Network Data Service,NDS)和域名系統(Domain Name System,DNS)等。

(7)JMS JMS全稱為Java Message Service,譯為Java消息服務。

它是一個Java平台中面向消息中間件的API,主要實作各個應用程式之間進行異步通信,包括建立、發送、接收、讀取消息等。通過使用JMS,能夠最大限度地提升消息應用的可移植性。JMS既支援點對點的消息通信,也支援釋出/訂閱式的消息通信。

(8)JTA JTA全稱為Java Transaction API,譯為Java事務服務。

它提供各種分布式事務服務(在多個網絡計算機上進行資料通路和更新),為J2EE實作分布式事務處理提供了重要的支撐。

(9)JAF JAF的全稱為JavaBeans Activation Framework,譯為JavaBeans 激活架構。

它是一個專用的資料處理架構,提供了一種統一處理不同資料格式的方法。

(10)RMI RMI全稱為Remote Method Invocation,

譯為遠端方法調用,它主要用于遠端調用服務,通過它,可以像調用本地函數一樣調用另外一台計算機上運作的程式,而不需要關心遠端計算機所使用的系統或所使用的語言,也就是說,隻要滿足一定的規範,就可以實作在不同的計算機上進行函數調用。

J2EE與EJB——Java Web(二)1、什麼是J2EE2、J2EE中常用的術語有哪些3、EJB有哪些不同的類别4、EJB與JavaBean有什麼異同5、Web 伺服器與Web應用伺服器有什麼差別6、SOAP與REST有什麼差別7、資料庫連接配接池的工作機制是怎樣的8、J2EE 開發有哪些調優的方法

3、EJB有哪些不同的類别

EJB是Enterprise JavaBean的簡稱,相當于分布式元件對象模型(Distributed Component Object Model,DCOM),它是一種伺服器端元件體系結構,用于開發和部署多層的、分布式的以及面向對象的應用系統的跨平台體系結構。EJB簡化了Java開發企業級的分布式元件應用程式的過程,它定義了一組可重用的元件——Enterprise Beans,開發人員可以利用這些元件,像搭積木一樣建立各種分布式應用。是以,使用EJB可以寫出可擴充的、健壯的、安全的應用程式,而不需要開發人員自己去編寫複雜的分布式元件架構。依據特性的不同,EJB可以分為以下3種類型:Session Bean(會話Bean),Entity Bean(實體Bean)和Message Driven Bean(消息驅動Bean)。下面将分别對這3種Bean進行介紹。

(1)Session Bean

Session Bean用來實作伺服器端的業務邏輯,同時協調Bean之間的互動。Session Bean僅存在于客戶應用與伺服器互動的時間段内,Session Bean中的資料是不儲存在資料庫中的。根據Session Bean 是否有狀态又可以分為兩種類型:Stateless Session Bean(無狀态的Session Bean)和Stateful Session Bean(有狀态的Session Bean)。

Stateless Session Bean 在方法調用期間不維護任何狀态,所有事務處理都是在一個方法中處理完成,是以一個Stateless Session Bean可以被多個客戶共享,即一個Stateless Session Bean可以同時處理多個客戶應用的請求;而Stateful Session Bean則不同,它可以記錄客戶應用請求的狀态,例如線上購物系統中,每個客戶都擁有購物車(StatefulBean),而裝載的貨物和貨物的數量在Session Bean中通過方法來操作,是以每個Stateful Session Bean隻能處理一個客戶的請求。與Stateless Session Bean相比,Stateful Session Bean的優點是能夠記錄客戶應用的狀态,其缺點是它不能被共享,開銷較大,性能遜于Stateless Bean,是以當請求使用者數量比較多時會消耗更多的記憶體。

(2)Entity Bean

Entity Bean 主要是資料元件,代表資料庫中的記錄,是以它與資料庫中的資料有着相同的生存周期,也就是說,隻要資料庫中的資料存在,Entity bean 就一直存在。此外,Entity Bean還可以被多個客戶應用共享。Entity有兩種對資料持久化的處理方式:①CMP(Container Managed Persistence,容器管理的持續性)。構件的相關資料庫操作由容器自動完成,不需要在bean 中編寫資料庫操作的代碼。②BMP(Bean Managed Persistence,Bean管理的持續性)。構件的相關資料庫操作由開發人員在代碼中通過JDBC程式設計來實作。這兩種Entity Bean的形态不同,但目的相同,二者的主要差別在于維護資料的角色,CMP是由EJBContainer來維護,而BMP則是由Bean自行維護資料的一緻性。

Entity Bean一共有3種狀态:no-state、pooled和ready。其中,no-state狀态表示Bean執行個體還沒有被建立;pooled狀态表示Bean執行個體已經被建立,但還沒有和一個EJBObject關聯起來;ready 狀态表示與EJB Object 關聯起來,若斷開關聯,則回到pooled 狀态。

(3)Message Driver Bean

Message Driver Bean用來處理異步消息,一般不是由使用者來調用的。它的調用方式為:當有異步消息發送到某個Message Driver Bean後,容器會負責調用Message Driver Bean的OnMes-sage()方法來處理這個異步請求。

4、EJB與JavaBean有什麼異同

EJB是基于Java的遠端方法調用(Remote Method Invocation,RMI)技術,可以被遠端通路(跨程序、跨計算機),但它必須被部署在Webspere、WebLogic等容器中。EJB客戶從不直接通路真正的EJB元件,而是通過其容器通路。EJB容器是EJB元件的代理,EJB元件由容器所建立和管理。

Java Bean是可複用的元件,理論上講,任何一個Java類都可以是一個Bean。但通常情況下,由于Java Bean是被容器(例如Tomcat)所建立的,是以Java Bean應具有一個無參的構造器,另外,通常Java Bean還要實作Serializable接口用于實作Bean的持久性。Java Bean實際上相當于微軟COM模型中的本地程序内COM元件,是不能被跨程序通路的。

EJB與JavaBean都是基于Java語言的構件模型。在開發應用時,既可以選擇使用EJB模型,也可以選擇使用JavaBean模型。盡管如此,二者也并非完全通用,其主要差別見表5-3。

J2EE與EJB——Java Web(二)1、什麼是J2EE2、J2EE中常用的術語有哪些3、EJB有哪些不同的類别4、EJB與JavaBean有什麼異同5、Web 伺服器與Web應用伺服器有什麼差別6、SOAP與REST有什麼差別7、資料庫連接配接池的工作機制是怎樣的8、J2EE 開發有哪些調優的方法

5、Web 伺服器與Web應用伺服器有什麼差別

Web伺服器是可以向送出請求的浏覽器提供文檔的程式。其主要功能是提供網上資訊浏覽服務;即接收浏覽器的請求并把處理結果傳回浏覽器進行顯示。Web伺服器支援以HTTP的方式來通路,當Web伺服器接收到一個HTTP請求時,它同樣會以HTTP格式傳回一個響應,這個響應可以是一個靜态的HTML頁面,也可以是結果處理的一個動态的頁面,還可以是音頻、視訊等資訊。為了處理一個請求,Web伺服器可以做出一個響應,并進行頁面跳轉,或者把動态響應的産生委托給一些其他程式,例如CGI腳本、JSP、Servlet或者一些其他的伺服器端程式。Web伺服器一般都使用了一些特有的機制(例如容錯機制)來保證Web伺服器有較好的擴充性,并能提供不間斷的服務。常見的Web伺服器有IS和Apache。

應用伺服器提供通路業務邏輯的途徑以供用戶端應用程式使用。具體而言,它通過HTTP、TCP/IP、IIOP(Internet Inter-ORB Protocol,網際網路内部對象請求代理協定)或JRMP(Java Remote Method Protocol,Java遠端方法協定)等協定來提供業務邏輯接口。為了系統的可靠性,同樣使用了一些可擴充性和容錯機制。除此之外,它還為應用的開發提供了許多服務,例如事務管理、安全管理、對象生命周期管理等。常見的應用伺服器有BEAWebLogic Server,IBM WebSphere Application Server,IPlanet Application Server,Oracle9i Application Server,JBoss和Tomcat等。

Web伺服器一般是通用的,而應用伺服器一般是專用的,例如Tomcat隻處理Java應用程式而不能處理ASPX或PHP。需要注意的是,Web伺服器與應用伺服器是并列關系,二者不存在互相包容關系。在使用時,如果通路的頁面隻有HTML,用Web伺服器就足夠了,但是如果是JSP,此時就需要應用伺服器了,因為隻有應用伺服器才能解析JSP裡的Java代碼,并将解析結果以HTML的格式傳回給使用者。

6、SOAP與REST有什麼差別

SOAP是一個嚴格定義的資訊交換協定,用于在Web Service中把遠端調用和傳回封裝成機器可讀的格式化資料,SOAP資料使用XML資料格式,定義了一整套複雜的标簽,來描述調用的遠端過程、參數、傳回值和出錯資訊等内容。

REST(Representational State Transfer,表述性狀态轉移)形式上為用戶端通過申請資源來實作狀态的轉換,可以被看作一台虛拟的狀态機。需要注意的是,它隻是一種軟體架構風格,而不是一個具體的協定或标準,而且,它是面向資源的,甚至連服務也會被抽象成資源。

表5-5為SOAP與REST的對比。

J2EE與EJB——Java Web(二)1、什麼是J2EE2、J2EE中常用的術語有哪些3、EJB有哪些不同的類别4、EJB與JavaBean有什麼異同5、Web 伺服器與Web應用伺服器有什麼差別6、SOAP與REST有什麼差別7、資料庫連接配接池的工作機制是怎樣的8、J2EE 開發有哪些調優的方法

7、資料庫連接配接池的工作機制是怎樣的

資料庫連接配接是一種非常珍貴且有限的資源,尤其在多使用者的網絡應用環境中更是如此。對資料庫連接配接管理的好壞會直接影響整個系統的性能:一是建立與資料庫的連接配接是一個耗時的操作,在頁面應用中,如果每次使用者的請求都需要建立新的資料庫連接配接,那麼響應時間就會很長,會嚴重影響使用者的體驗;二是資料庫的連接配接個數是有限制的,如果管理不好,使用者經常建立與資料庫的連接配接卻忘記釋放,運作時間久了,資料庫的連接配接資源就會耗盡,當再有新的使用者需要通路資料庫時,就需要等待很長一段時間,直到有使用者釋放連接配接資源才能通路資料,這對系統的可用性有着嚴重的影響。是以,管理好資料庫的連接配接資源對應用系統尤其是頁面應用系統是非常重要的。

資料庫連接配接池負責配置設定、管理并釋放資料庫連接配接,它允許應用程式重複使用一個現有的資料庫連接配接,而不再是重建立立一個新的資料庫連接配接,同時,它還負責釋放空閑時間超過最大空閑時間的資料庫連接配接,避免因為沒有釋放資料庫連接配接而引起的資料庫連接配接遺漏。

在J2EE中,伺服器在啟動時會建立一定數量的池連接配接,并一直維持不少于此數目的連接配接池。當客戶程式需要通路資料庫時,就可以直接從池中擷取與資料庫的連接配接(擷取一個空閑的連接配接),而不用去建立一個新的連接配接,同時将該連接配接标記為忙狀态。當使用完畢後再把該連接配接标記為空閑狀态,這樣其他使用者就可以使用這個連接配接了。如果目前沒有空閑的連接配接,那麼伺服器就會根據配置參數在池中建立一定數量的連接配接。采用這種方法對資料庫連接配接進行管理後可以大幅縮短使用者的響應時間,提高運作效率。另一方面,為了提高資料庫操作的性能,資料庫連接配接池會釋放空閑時間超過最大空閑時間的資料庫連接配接來避免因為沒有釋放資料庫連接配接而引起的資料庫連接配接遺漏。

8、J2EE 開發有哪些調優的方法

當使用J2EE開發Web應用程式時,若隻是考慮功能實作,一般都不存在什麼問題,但由于Web應用的分布式特性,在很多特定的場合下,并發資料量會變得非常大,如何能夠保證此時系統還能夠高效地運轉,而且能夠快速地響應使用者的請求呢?

下面介紹一些常用的方法。

1)優化設計,例如,小心使用繼承。

繼承會導緻遞歸,同時由于父類的構造器将會被周遊,繼承嵌套得過深,會産生巨大的建立開銷,是以推薦盡量使用組合方式來代替繼承方式。除此之外,還有很多其他的方法:封裝和重用常用的業務方法以及相關工具,避免在其他類中重複編寫;簡化類結構;面向接口程式設計;盡量使用主要類型;避免對象的過度使用,例如,不要為了使用一個方法就建立對象,應盡可能地使用靜态方法或是使用将業務元件執行個體化後共享的方法等。

2)盡可能使用資料庫連接配接池。

建立資料庫的連接配接是一項必須但又非常耗時的工作,如果頻繁地建立與資料庫的連接配接将會導緻系統性能的急劇下降。是以,在實際開發系統時,經常使用資料庫連接配接池來提高系統性能。具體而言,就是使應用伺服器維護着資料庫連接配接池,這樣就不需要在每個事務處理開始時就建立一個連接配接了。此外,由于PreparedStatement有緩存功能,這使其具有較高的效率,是以,在使用JDBC的方式通路資料庫時,應盡可能使用PreparedStatement。

3)給Web容器配置合理的線程數量來處理用戶端的HTTP請求。

一般而言,最小的線程數量設定為容器處理請求的平均數(平均負載),最大值設定為系統在高峰期處理的請求數,同時Web容器中線程的個數最好不要多于Web伺服器中線程的個數。

4)根據實際情況設定Java虛拟機中堆空間的大小。

合理地設定堆空間的大小能夠使得垃圾回收器運作的時間間隔被控制在一個合理的範圍内,進而減少許多不必要的系統開銷。具體設定堆空間大小的方法可參考專用資料。

5)使用架構(例如Hibernate)來提高系統的效率。

6)把一些經常被通路的Servlet或JSP緩存起來,能夠減少響應時間和提高系統的性能。

但需要注意的是,緩存并非越多越好,無規則地使用緩存也可能會導緻系統的崩潰。

7)當在系統中使用EJB時,由于對EJB的調用是采用對象請求代理(Object Request Bro-ker,ORB)的方式來完成,而ORB使用了線程來處理對EJB的請求,是以,應當合理配置線程池的大小以便它能夠在平均負載和高峰期都能夠很好地處理EJB的請求。

8)優化IV0性能。

IVO使用不當将會造成資源競争,降低系統性能。是以,在實際應用時,盡可能少使用System.out列印調試資訊,推薦使用緩沖。

9)優化查詢。

在模型設計時就應考慮備援相對不會變化的資料,如果設計大資料量,最好能夠考慮分區設計。

10)對sesion進行合理管理與設定。

根據實際情況對記憶體中可能存在的session的個數設定一個合适的值。注意:盡量減少session的大小,以降低其對記憶體的使用。而且,除非是在必須的情況下,否則盡量不要啟用對session的持久化。同時,通過對session設定一個合理的逾時時間來回收較長時間不使用的session,也可以有效地提高系統的效率。