前言java
最近的這段時間一直在學習Java EE,剛剛完成了從0到1的蛻變,因此順便整理一下我所瞭解到的Java EE,給剛入門學習的新人一些頭緒,而所謂「啓示錄」,就是這個意思。程序員
一.Java EE是什麼?web
Java EE(Java Enterprise Edition)是一種企業級應用的軟件架構,同時是一種思想,一套規範。編程
二.Java EE的發展史json
Java Enterprise Edition的發展不知不覺已經12年了,不知道你們有沒留意,一開始,Java Enterprise Edition簡稱「J2EE」,直到版本5才更名爲Java EE,而如今最新的版本則是Java EE 6。緩存
到這裏,或許有人會問,爲何會有這麼多套Java EE規範?這些版本的差異是什麼?安全
1.J2EE1.2的出現,主要是將以前各個單獨的規範綁定到一塊兒。服務器
2.J2EE1.3,則是繼續完善J2EE體系結構。網絡
3.J2EE1.4,主要是加入了一個重要主題:Web Service
4.而Java EE 5,主題則是「簡化」,簡化以前複雜的J2EE思想,改善開發體驗。
三.Java EE到底要解決什麼問題?
1.Java EE解決什麼問題?
從Java EE發展背景看,它與「分佈式應用」以及「互聯網應用」的關係密不可分,而這二者也正是Java EE要解決的問題!
其實,分佈式應用隨着90年代互聯網的興起逐漸開始普及。在90年代中,各類分佈式應用標準逐漸誕生,如:OMG的CORBA,MS的DCOM等,而Sun在推出Java的RMI(Remote Method Invocation)後,便以RMI做爲通訊基礎構建了Java EE。我認爲,Java EE最核心要解決的問題就是「分佈式應用」。而在接下來的競爭中,Java EE也不負所托,逐漸取代了CORBA,DCOM的地位。
2.分佈式應用與RPC
RPC(Remote Procedure Call),在聊到分佈式應用時不少人會第一時間想到它。所謂RPC,就是遠程調用一個服務,但效果和本地調用同樣。在最初的時候,RPC很相似C語言的函數調用,但隨着編程語言和技術的發展,特別是面向對象和麪向組件技術的普遍應用,便出現了「遠程對象/方法調用」。所謂「遠程對象/方法調用」其實就是把調用遠程對象和本地對象的區別隱藏起來,讓調用者能夠像使用本地對象那樣調用遠程對象。從本質上說,最初的RPC和後來的「遠程對象/方法調用」稍有不一樣,在「遠程對象/方法調用」中,被調的服務還須要考慮如:對象生命週期管理,事務處理……這些問題。但籠統地說,最初的RPC和「遠程對象/方法調用」都稱爲:RPC,因此以前提到的如:DCOM,CORBA,JAVA的RMI,.NET的Remoting都稱爲RPC。而我認爲,RPC的本質就是:應用協議 + 傳輸協議。而各類不一樣的RPC實現之間的區別亦在此。
而所謂的「分佈式應用」,實際上能夠說是用RPC方式,把各個分佈在不一樣機器的應用模塊聯合成一個系統。能夠說RPC是「分佈式應用」的基礎,因此就有「以RMI做爲通訊基礎構建了Java EE」這一說了:>
四.Java EE體系結構
這裏,我打算從分析「企業級應用」入手,並藉此逐步創建整個Java EE體系。
1.概述Java EE體系結構
爲了有印象,咱們先來個最簡單Java EE架構圖看看:
從上圖看到,Java EE通常分爲4層:
(1)客戶端
(2)web層
(3)業務邏輯層
(4)企業信息層(EIS:Enterprise Information System)
呵呵,不要覺得Java EE只是描述服務端規範,實際上,它仍是包含了一些客戶端相關東東,好比:Applet...不過,Java EE的重點仍是在服務端這方面,而本文重點也是介紹Java EE在服務端這方面的內容。
2.「企業級應用」分析
(1)分佈式應用
首先從總的來看,一個「企業級應用」表明着,這個系統確定是「很是大型的」,這麼大型的系統,這麼多的應用,是不可能把應用都部署在一臺機器上的,因此「分佈式應用」這個需求便瓜熟蒂落地出現。理想的「企業級應用」中,各類功能模塊應該分佈在不一樣的機器上,在須要某功能的時候,咱們能夠動態地進行調用。
(2)系統分層
企業應用中,業務的功能會很是複雜。此時,模塊間的解耦以及系統的分層開始顯得重要,解耦與分層會使得系統結構清晰,而且健壯。而傳統的分層模式是通常是:接入層,邏輯層,數據層。
(3)異步
設計分佈式應用時,你遇到的第一個問題就是:等待…..在企業級應用中,業務的處理時複雜的。若是把子模塊部署到不一樣機器後,要處理一個業務,極可能須要到多臺機器上進行調用;另外,子模塊的運算也須要必定的時間,此時,「等待」就出現了。因爲你沒法預計這個複雜的業務何時才能處理完,因此,「異步」這個概念也瓜熟蒂落地被引入。(其實,這也體現了軟件設計中「快慢分離」的原則)
(4)事務,安全
關於事務的重要性這裏就很少說了。
而安全,通常指對某個模塊的受權,身份驗證等等,在企業級應用中,安全絕對是重要的一塊。
(5)Java EE平臺與其餘已有資源、服務、系統的整合
在Java EE出來以前,不少公司極可能已經創建了比較完善的企業信息系統(EIS),顯然,和這些已有的系統整合,在企業級應用中顯得尤其重要。
3.Java EE體系結構詳述
OK,如今讓咱們來逐步瞭解,Java EE每一個部件的做用吧。
(1)Servlet,JSP
JSP,Servlet同屬「web層」,並都屬於「動態網頁技術」。所謂「動態網頁技術」和傳統的「靜態網頁技術」不同,傳統的「靜態網頁技術」說白就是把作好的html文件直接上傳到服務器並直接供客戶瀏覽,而「動態網頁技術」則是每次都根據用戶請求,動態生成響應頁面並返回。「動態網頁技術」的好處不言自明,不管從靈活性,數據保密性…等方面說都是「靜態網頁」所沒法媲美的。但「動態網頁技術」也是有缺點的,就是相對較慢,如今的解決方案通常是:把「動態網頁」中相對固定的部分作緩存,即所謂「靜態頁面」。(額.…..「靜態網頁」和「靜態頁面」本質上沒什麼區別,都是靜態頁面,但思想上卻有很大區別。而如今的程序員通常會對「靜態」這個詞賦予一個新的含義:「緩存」)
【1】Servlet
Servlet實際上就是按照Servlet規範編寫的一個java類,與傳統的命令行啓動的Java應用程序不一樣,Servlet位於Web服務器內部,並由Web服務器加載並調用。
【2】JSP
JSP全稱是:JavaServer Page。這項技術的推出目的其實很簡單,爲了彌補Servlet一個很重要的缺陷:「麻煩」。
先看看Servlet到底什麼地方讓人以爲麻煩,下面是一個Servlet處理Get請求例子:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("處理GET請求ing......"); response.setContentType("text/html;charset=GB2312"); PrintWriter out = response.getWriter(); out.println("<HTML>"); // 靜態內容 out.println("<BODY>"); // 靜態內容 out.println("Hyddd's Servlet Demo " + new Date().toString()); // 動態內容 out.println("</BODY>"); // 靜態內容 out.println("</HTML>"); // 靜態內容 }
從上面這個例子,相信你們已經發現問題了,Servlet主要是把動態內容混合到靜態內容中以產生html,這致使Servlet代碼中將會輸出大量的html標識,哇,地獄,簡直就是地獄,同時,這也很是不利於程序員和UI美工的配合(不要期望美工人員會和你一塊兒寫html標識)。爲了解決這些問題,JSP誕生了。
JSP是一種創建在Servlet規範之上的動態網頁技術,一般作法是:在html頁面中嵌入JSP標記和腳本代碼。JSP把靜態內容和動態內容的分離,實現了內容和表示的分離。
【3】Servlet與JSP的關係
上圖描述得比較清楚了,JSP文件先是轉換爲Servlet類,而後編譯,並啓動Servlet實例響應客戶端請求。爲何說JSP是創建在Servlet上的動態網頁技術,從這裏能夠看出來。
Web層主要就是JSP以及Sevlet這兩項技術。
(2)EJB(Enterprise JavaBean)
以前說過,分佈式應用是Java EE一個基礎的需求,額……那在不一樣機器上的「分佈式」的應用到底會以一個什麼樣的形態出現呢?答案就是:EJB。EJB屬於業務邏輯層上的東東。
所謂Bean,實際上是「組件」的意思。EJB可讓你像搭積木同樣,經過本地/分佈式調用組裝不一樣應用到大型應用中,使你能集中精力來處理企業的業務邏輯,而像事務、網絡、安全等等這些底層服務則通通留給EJB服務器開發商來解決。
利用基於組件的開發,能夠把代碼重用上升到一個新的高度。利用面向對象開發,重用的是類,而基於組件時,重用的則是更大的功能塊。
【1】EJB vs Java Bean
我我的認爲,Java Bean至關因而數據存儲類(不涉及具體業務邏輯),專門用來存數數據,提供getter,setter方法,而且在JVM上可直接運行。EJB則至關於一個功能模塊,提供業務邏輯的服務,而運行時,則須要EJB容器的幫助。
EJB是業務邏輯層最重要的技術哦!
(3)Container(容器)
Container這個概念常常在Java EE中出現,所謂Container,在Java EE 5 Tutorial中有這樣一段解釋:「Containers are the interface between a component and the low-level platform-specific functionality that supports the component.」,而Container的做用,我我的的認爲是:爲「應用程序」提供一個環境,使其能夠沒必要須關注某些問題,如:系統環境變量,事務,生命週期…….通俗地說,Container就像「祕書」,幫「應用程序」管理着各類雜亂的問題,爲其提供運行時支持。
其中,Java EE裏有兩個很重要的容器:Web容器和EJB容器
【1】Web容器
Web容器是用於託管「Web應用程序」的J2EE容器,主要負責管理「Servlet」和「JSP」運行。
【2】Servlet容器
其實,上圖中的Servlet指的就是Servlet容器。而Servlet的設計初衷,實際是基於線程池的更好的線程容器,見下圖:
【3】EJB容器
EJB容器主要負責管理「EJB」的運行。
而EJB的設計其實是基於對象池的思想,你能夠認爲EJB=對象池+遠程對象池。見下圖:
【4】Servlet與EJB
其實,根據Servlet和EJB的設計初衷,咱們已經能夠看出Java EE對二者角色的定義了。線程的本質決定了Servlet只適合一些比較簡單的輕量級應用;一旦問題複雜了,最好的就是使用EJB。
(4)RMI
RMI全稱:Java Remote Method Invocation,就是利用Java對象序列化的機制,實現遠程類對象的實例化以及調用的方法。
RMI在Java EE中的主要是負責解決通訊問題,特別是不一樣的EJB容器之間的通訊。你們知道,在分佈式應用中,各個功能模塊(EJB)之間通訊須要有統一的RPC協議,不然無法通訊,而RMI就是負責這方面的工做。
【1】RMI 與 CORB
能夠說,RMI就是CORBA的Java版實現。
【2】再談「遠程調用」
如今主流的遠程調用方式,無論是com/com+,soap,webservice,rmi,.net remoting,說白了都同樣的,就是序列化,網絡傳輸,反序列化。
序列化方式:同種runtime的,能夠native的二進制序列化,序列化的效率高。文本的序列化(xml/json/自定義格式)的方式,能夠跨平臺和語言,通常基於中間類型。但此序列化方式的效率低,數據量也偏大。
網絡傳輸:則可使socket/http或是自定義協議的。 socket數據冗餘最小,效率最高。RMI實際上是socket上的自定義協議。 http要走http的報文,文本的方式最合適,實現最簡單,開發和部署方便。
(5)JMS
JMS:Java Message Service。JMS提供一種消息機制,主要做用是提供異步通訊的支持,是Java EE的重要基礎模塊。值得注意,異步通訊,通常都採用消息機制,這種狀況在Windows中最多見。
(6)JTA
JTA:Java Transaction API,主要提供事務服務和分佈式事務管理功能,保證分佈式事務的一致性,是Java EE的重要的基礎模塊。
(7)JAAS
JAAS:Java Authentication Authorization Service(Java認證於受權服務),提供了對Java組件的安全保護,如哪些Servelt,JSP能被哪些用戶訪問,哪些EJB能被調用等。但須要注意的是,JAAS只提供了對JAVAEE組件的保護,對於企業應用業務的權限,它是作不到的。
(8)Connector
Connector主要做用就是把其餘已有的資源、服務、系統整合到Java EE系統中。不一樣的服務提供商和Java EE平臺會定義不一樣的協議,而Connector就是指這些協議的實現。
至此爲止,Java EE的核心模塊介紹完畢,讓咱們來看看J2EE 1.3的架構圖(當時的J2EE架構仍是比較簡單的):
4.J2EE 1.4 以及 Java EE 5體系結構
(1)J2EE 1.4 體系結構
J2EE 1.4加入了一個重要的主題:「Web Service」,包括:JAX-RPC,SAAJ,Web Srvcs,JAXR都屬於這一塊的東西。
(2)Java EE 5體系結構
關於Java EE 5這裏就不詳細介紹了:>,你們有興趣能夠參考《Java EE Tutorial 5》。
後記
這篇文章寫了我3天,同時也翻了N多資料,但願本文確實對各位初學者有所幫助,同時本文包含不少我的觀點,若有錯誤敬請指出:>
關於Java EE 5,若是後續有時間我會繼續整理。
重要參考資料
【1】《JAVA EE 5 的發展史》
【2】《Java程序員 上班那點兒事》
【3】《Java EE Tutorial 5》
【4】《J2EE究竟是什麼?》
做者:hyddd
出處:http://www.cnblogs.com/hyddd/本文版權歸做者全部,歡迎轉載,演繹或用於商業目的,可是必須說明本文出處(包含連接)。