Java EE啓示錄

Java EE啓示錄

2010-02-03 02:24 by hyddd, 5228 閱讀, 18 評論, 收藏編輯html

前言java

    最近的這段時間一直在學習Java EE,剛剛完成了從0到1的蛻變,因此順便整理一下我所瞭解到的Java EE,給剛入門學習的新人一些頭緒,而所謂「啓示錄」,就是這個意思。程序員

一.Java EE是什麼?web

   Java EE(Java Enterprise Edition)是一種企業級應用的軟件架構,同時是一種思想,一套規範。編程

二.Java EE的發展史json

histroy

    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架構圖看看:

arch_2

從上圖看到,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這兩項技術。

arch_2_1

(2)EJB(Enterprise JavaBean)

    以前說過,分佈式應用是Java EE一個基礎的需求,額……那在不一樣機器上的「分佈式」的應用到底會以一個什麼樣的形態出現呢?答案就是:EJB。EJB屬於業務邏輯層上的東東。

    所謂Bean,實際上是「組件」的意思。EJB可讓你像搭積木同樣,經過本地/分佈式調用組裝不一樣應用到大型應用中,使你能集中精力來處理企業的業務邏輯,而像事務、網絡、安全等等這些底層服務則通通留給EJB服務器開發商來解決。

    利用基於組件的開發,能夠把代碼重用上升到一個新的高度。利用面向對象開發,重用的是類,而基於組件時,重用的則是更大的功能塊。

    【1】EJB vs Java Bean

    我我的認爲,Java Bean至關因而數據存儲類(不涉及具體業務邏輯),專門用來存數數據,提供getter,setter方法,而且在JVM上可直接運行。EJB則至關於一個功能模塊,提供業務邏輯的服務,而運行時,則須要EJB容器的幫助。

    EJB是業務邏輯層最重要的技術哦!

arch_2_2

(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」運行。

WebContainer

【2】Servlet容器

    其實,上圖中的Servlet指的就是Servlet容器。而Servlet的設計初衷,實際是基於線程池的更好的線程容器,見下圖:

servletContainer 

【3】EJB容器

     EJB容器主要負責管理「EJB」的運行。

 

    而EJB的設計其實是基於對象池的思想,你能夠認爲EJB=對象池+遠程對象池。見下圖:

ejbContainer

【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架構仍是比較簡單的):

JAVAEE1.3

4.J2EE 1.4 以及 Java EE 5體系結構

(1)J2EE 1.4 體系結構

JAVAEE1.4

    J2EE 1.4加入了一個重要的主題:「Web Service」,包括:JAX-RPC,SAAJ,Web Srvcs,JAXR都屬於這一塊的東西。

(2)Java EE 5體系結構

javaee5

 

    關於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/本文版權歸做者全部,歡迎轉載,演繹或用於商業目的,可是必須說明本文出處(包含連接)。

相關文章
相關標籤/搜索