Java EE启示录
前言
??? 最近的這段時(shí)間一直在學(xué)習(xí)Java EE,剛剛完成了從0到1的蛻變,所以順便整理一下我所了解到的Java EE,給剛?cè)腴T(mén)學(xué)習(xí)的新人一些頭緒,而所謂“啟示錄”,就是這個(gè)意思。
一.Java EE是什么?
?? Java EE(Java Enterprise Edition)是一種企業(yè)級(jí)應(yīng)用的軟件架構(gòu),同時(shí)是一種思想,一套規(guī)范。
二.Java EE的發(fā)展史
??? Java Enterprise Edition的發(fā)展不知不覺(jué)已經(jīng)12年了,不知道大家有沒(méi)留意,一開(kāi)始,Java Enterprise Edition簡(jiǎn)稱“J2EE”,直到版本5才改名為Java EE,而現(xiàn)在最新的版本則是Java EE 6。
??? 到這里,或許有人會(huì)問(wèn),為什么會(huì)有這么多套Java EE規(guī)范?這些版本的差別是什么?
1.J2EE1.2的出現(xiàn),主要是將之前各個(gè)單獨(dú)的規(guī)范綁定到一起。
2.J2EE1.3,則是繼續(xù)完善J2EE體系結(jié)構(gòu)。
3.J2EE1.4,主要是加入了一個(gè)重要主題:Web Service
4.而Java EE 5,主題則是“簡(jiǎn)化”,簡(jiǎn)化之前復(fù)雜的J2EE思想,改善開(kāi)發(fā)體驗(yàn)。
三.Java EE到底要解決什么問(wèn)題?
1.Java EE解決什么問(wèn)題?
??? 從Java EE發(fā)展背景看,它與“分布式應(yīng)用”以及“互聯(lián)網(wǎng)應(yīng)用”的關(guān)系密不可分,而這兩者也正是Java EE要解決的問(wèn)題!
??? 其實(shí),分布式應(yīng)用隨著90年代互聯(lián)網(wǎng)的興起逐漸開(kāi)始普及。在90年代中,各種分布式應(yīng)用標(biāo)準(zhǔn)逐漸誕生,如:OMG的CORBA,MS的DCOM等,而Sun在推出Java的RMI(Remote Method Invocation)后,便以RMI作為通信基礎(chǔ)構(gòu)建了Java EE。我認(rèn)為,Java EE最核心要解決的問(wèn)題就是“分布式應(yīng)用”。而在接下來(lái)的競(jìng)爭(zhēng)中,Java EE也不負(fù)所托,逐漸取代了CORBA,DCOM的地位。
2.分布式應(yīng)用與RPC
??? RPC(Remote Procedure Call),在聊到分布式應(yīng)用時(shí)很多人會(huì)第一時(shí)間想到它。所謂RPC,就是遠(yuǎn)程調(diào)用一個(gè)服務(wù),但效果和本地調(diào)用一樣。在最初的時(shí)候,RPC很類(lèi)似C語(yǔ)言的函數(shù)調(diào)用,但隨著編程語(yǔ)言和技術(shù)的發(fā)展,特別是面向?qū)ο蠛兔嫦蚪M件技術(shù)的廣泛應(yīng)用,便出現(xiàn)了“遠(yuǎn)程對(duì)象/方法調(diào)用”。所謂“遠(yuǎn)程對(duì)象/方法調(diào)用”其實(shí)就是把調(diào)用遠(yuǎn)程對(duì)象和本地對(duì)象的區(qū)別隱藏起來(lái),讓調(diào)用者可以像使用本地對(duì)象那樣調(diào)用遠(yuǎn)程對(duì)象。從本質(zhì)上說(shuō),最初的RPC和后來(lái)的“遠(yuǎn)程對(duì)象/方法調(diào)用”稍有不同,在“遠(yuǎn)程對(duì)象/方法調(diào)用”中,被調(diào)的服務(wù)還需要考慮如:對(duì)象生命周期管理,事務(wù)處理……這些問(wèn)題。但籠統(tǒng)地說(shuō),最初的RPC和“遠(yuǎn)程對(duì)象/方法調(diào)用”都稱為:RPC,所以之前提到的如:DCOM,CORBA,JAVA的RMI,.NET的Remoting都稱為RPC。而我認(rèn)為,RPC的本質(zhì)就是:應(yīng)用協(xié)議 + 傳輸協(xié)議。而各種不同的RPC實(shí)現(xiàn)之間的區(qū)別亦在此。
??? 而所謂的“分布式應(yīng)用”,實(shí)際上可以說(shuō)是用RPC方式,把各個(gè)分布在不同機(jī)器的應(yīng)用模塊聯(lián)合成一個(gè)系統(tǒng)。可以說(shuō)RPC是“分布式應(yīng)用”的基礎(chǔ),所以就有“以RMI作為通信基礎(chǔ)構(gòu)建了Java EE”這一說(shuō)了:>?
四.Java EE體系結(jié)構(gòu)
??? 這里,我打算從分析“企業(yè)級(jí)應(yīng)用”入手,并藉此逐步建立整個(gè)Java EE體系。
1.概述Java EE體系結(jié)構(gòu)
???? 為了有印象,我們先來(lái)個(gè)最簡(jiǎn)單Java EE架構(gòu)圖看看:
從上圖看到,Java EE一般分為4層:
(1)客戶端
(2)web層
(3)業(yè)務(wù)邏輯層
(4)企業(yè)信息層(EIS:Enterprise Information System)
??? 呵呵,不要以為Java EE只是描述服務(wù)端規(guī)范,實(shí)際上,它還是包含了一些客戶端相關(guān)東東,比如:Applet...不過(guò),Java EE的重點(diǎn)還是在服務(wù)端這方面,而本文重點(diǎn)也是介紹Java EE在服務(wù)端這方面的內(nèi)容。
2.“企業(yè)級(jí)應(yīng)用”分析
(1)分布式應(yīng)用
??? 首先從總的來(lái)看,一個(gè)“企業(yè)級(jí)應(yīng)用”代表著,這個(gè)系統(tǒng)肯定是“非常大型的”,這么大型的系統(tǒng),這么多的應(yīng)用,是不可能把應(yīng)用都部署在一臺(tái)機(jī)器上的,所以“分布式應(yīng)用”這個(gè)需求便順理成章地出現(xiàn)。理想的“企業(yè)級(jí)應(yīng)用”中,各種功能模塊應(yīng)該分布在不同的機(jī)器上,在需要某功能的時(shí)候,我們可以動(dòng)態(tài)地進(jìn)行調(diào)用。
(2)系統(tǒng)分層
??? 企業(yè)應(yīng)用中,業(yè)務(wù)的功能會(huì)非常復(fù)雜。此時(shí),模塊間的解耦以及系統(tǒng)的分層開(kāi)始顯得重要,解耦與分層會(huì)使得系統(tǒng)結(jié)構(gòu)清晰,并且健壯。而傳統(tǒng)的分層模式是一般是:接入層,邏輯層,數(shù)據(jù)層。
(3)異步
??? 設(shè)計(jì)分布式應(yīng)用時(shí),你遇到的第一個(gè)問(wèn)題就是:等待…..在企業(yè)級(jí)應(yīng)用中,業(yè)務(wù)的處理時(shí)復(fù)雜的。如果把子模塊部署到不同機(jī)器后,要處理一個(gè)業(yè)務(wù),很可能需要到多臺(tái)機(jī)器上進(jìn)行調(diào)用;另外,子模塊的運(yùn)算也需要一定的時(shí)間,此時(shí),“等待”就出現(xiàn)了。由于你無(wú)法預(yù)計(jì)這個(gè)復(fù)雜的業(yè)務(wù)什么時(shí)候才能處理完,所以,“異步”這個(gè)概念也順理成章地被引入。(其實(shí),這也體現(xiàn)了軟件設(shè)計(jì)中“快慢分離”的原則)
(4)事務(wù),安全
??? 關(guān)于事務(wù)的重要性這里就不多說(shuō)了。
??? 而安全,一般指對(duì)某個(gè)模塊的授權(quán),身份驗(yàn)證等等,在企業(yè)級(jí)應(yīng)用中,安全絕對(duì)是重要的一塊。
(5)Java EE平臺(tái)與其他已有資源、服務(wù)、系統(tǒng)的整合
??? 在Java EE出來(lái)之前,很多公司很可能已經(jīng)建立了比較完善的企業(yè)信息系統(tǒng)(EIS),顯然,和這些已有的系統(tǒng)整合,在企業(yè)級(jí)應(yīng)用中顯得尤為重要。
3.Java EE體系結(jié)構(gòu)詳述
??? OK,現(xiàn)在讓我們來(lái)逐步了解,Java EE每個(gè)部件的作用吧。
(1)Servlet,JSP
??? JSP,Servlet同屬“web層”,并都屬于“動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)”。所謂“動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)”和傳統(tǒng)的“靜態(tài)網(wǎng)頁(yè)技術(shù)”不一樣,傳統(tǒng)的“靜態(tài)網(wǎng)頁(yè)技術(shù)”說(shuō)白就是把做好的html文件直接上傳到服務(wù)器并直接供客戶瀏覽,而“動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)”則是每次都根據(jù)用戶請(qǐng)求,動(dòng)態(tài)生成響應(yīng)頁(yè)面并返回。“動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)”的好處不言自明,無(wú)論從靈活性,數(shù)據(jù)保密性…等方面說(shuō)都是“靜態(tài)網(wǎng)頁(yè)”所無(wú)法媲美的。但“動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)”也是有缺點(diǎn)的,就是相對(duì)較慢,現(xiàn)在的解決方案一般是:把“動(dòng)態(tài)網(wǎng)頁(yè)”中相對(duì)固定的部分做緩存,即所謂“靜態(tài)頁(yè)面”。(額.…..“靜態(tài)網(wǎng)頁(yè)”和“靜態(tài)頁(yè)面”本質(zhì)上沒(méi)什么區(qū)別,都是靜態(tài)頁(yè)面,但思想上卻有很大區(qū)別。而現(xiàn)在的程序員一般會(huì)對(duì)“靜態(tài)”這個(gè)詞賦予一個(gè)新的含義:“緩存”)
【1】Servlet
??? Servlet實(shí)際上就是按照Servlet規(guī)范編寫(xiě)的一個(gè)java類(lèi),與傳統(tǒng)的命令行啟動(dòng)的Java應(yīng)用程序不同,Servlet位于Web服務(wù)器內(nèi)部,并由Web服務(wù)器加載并調(diào)用。
【2】JSP
??? JSP全稱是:JavaServer Page。這項(xiàng)技術(shù)的推出目的其實(shí)很簡(jiǎn)單,為了彌補(bǔ)Servlet一個(gè)很重要的缺陷:“麻煩”。
??? 先看看Servlet到底什么地方讓人覺(jué)得麻煩,下面是一個(gè)Servlet處理Get請(qǐng)求例子:
從上面這個(gè)例子,相信大家已經(jīng)發(fā)現(xiàn)問(wèn)題了,Servlet主要是把動(dòng)態(tài)內(nèi)容混合到靜態(tài)內(nèi)容中以產(chǎn)生html,這導(dǎo)致Servlet代碼中將會(huì)輸出大量的html標(biāo)識(shí),哇,地獄,簡(jiǎn)直就是地獄,同時(shí),這也非常不利于程序員和UI美工的配合(不要指望美工人員會(huì)和你一起寫(xiě)html標(biāo)識(shí))。為了解決這些問(wèn)題,JSP誕生了。
??? JSP是一種建立在Servlet規(guī)范之上的動(dòng)態(tài)網(wǎng)頁(yè)技術(shù),通常做法是:在html頁(yè)面中嵌入JSP標(biāo)記和腳本代碼。JSP把靜態(tài)內(nèi)容和動(dòng)態(tài)內(nèi)容的分離,實(shí)現(xiàn)了內(nèi)容和表示的分離。
【3】Servlet與JSP的關(guān)系
?
??? 上圖描述得比較清楚了,JSP文件先是轉(zhuǎn)換為Servlet類(lèi),然后編譯,并啟動(dòng)Servlet實(shí)例響應(yīng)客戶端請(qǐng)求。為什么說(shuō)JSP是建立在Servlet上的動(dòng)態(tài)網(wǎng)頁(yè)技術(shù),從這里可以看出來(lái)。
??? Web層主要就是JSP以及Sevlet這兩項(xiàng)技術(shù)。
(2)EJB(Enterprise JavaBean)
??? 之前說(shuō)過(guò),分布式應(yīng)用是Java EE一個(gè)基礎(chǔ)的需求,額……那在不同機(jī)器上的“分布式”的應(yīng)用到底會(huì)以一個(gè)什么樣的形態(tài)出現(xiàn)呢?答案就是:EJB。EJB屬于業(yè)務(wù)邏輯層上的東東。
??? 所謂Bean,其實(shí)是“組件”的意思。EJB可以讓你像搭積木一樣,通過(guò)本地/分布式調(diào)用組裝不同應(yīng)用到大型應(yīng)用中,使你能集中精力來(lái)處理企業(yè)的業(yè)務(wù)邏輯,而像事務(wù)、網(wǎng)絡(luò)、安全等等這些底層服務(wù)則統(tǒng)統(tǒng)留給EJB服務(wù)器開(kāi)發(fā)商來(lái)解決。
??? 利用基于組件的開(kāi)發(fā),可以把代碼重用上升到一個(gè)新的高度。利用面向?qū)ο箝_(kāi)發(fā),重用的是類(lèi),而基于組件時(shí),重用的則是更大的功能塊。
????【1】EJB vs Java Bean
??? 我個(gè)人認(rèn)為,Java Bean相當(dāng)于是數(shù)據(jù)存儲(chǔ)類(lèi)(不涉及具體業(yè)務(wù)邏輯),專門(mén)用來(lái)存數(shù)數(shù)據(jù),提供getter,setter方法,并且在JVM上可直接運(yùn)行。EJB則相當(dāng)于一個(gè)功能模塊,提供業(yè)務(wù)邏輯的服務(wù),而運(yùn)行時(shí),則需要EJB容器的幫助。
??? EJB是業(yè)務(wù)邏輯層最重要的技術(shù)哦!
(3)Container(容器)
??? Container這個(gè)概念經(jīng)常在Java EE中出現(xiàn),所謂Container,在Java EE 5 Tutorial中有這樣一段解釋:“Containers?are the interface between a component and the low-level platform-specific functionality that supports the component.”,而Container的作用,我個(gè)人的認(rèn)為是:為“應(yīng)用程序”提供一個(gè)環(huán)境,使其可以不必須關(guān)注某些問(wèn)題,如:系統(tǒng)環(huán)境變量,事務(wù),生命周期…….通俗地說(shuō),Container就像“秘書(shū)”,幫“應(yīng)用程序”管理著各種雜亂的問(wèn)題,為其提供運(yùn)行時(shí)支持。
??? 其中,Java EE里有兩個(gè)很重要的容器:Web容器和EJB容器
【1】Web容器
??? Web容器是用于托管“Web應(yīng)用程序”的J2EE容器,主要負(fù)責(zé)管理“Servlet”和“JSP”運(yùn)行。
【2】Servlet容器
??? 其實(shí),上圖中的Servlet指的就是Servlet容器。而Servlet的設(shè)計(jì)初衷,實(shí)際是基于線程池的更好的線程容器,見(jiàn)下圖:
?
【3】EJB容器
???? EJB容器主要負(fù)責(zé)管理“EJB”的運(yùn)行。
?
??? 而EJB的設(shè)計(jì)實(shí)際上是基于對(duì)象池的思想,你可以認(rèn)為EJB=對(duì)象池+遠(yuǎn)程對(duì)象池。見(jiàn)下圖:
【4】Servlet與EJB
??? 其實(shí),根據(jù)Servlet和EJB的設(shè)計(jì)初衷,我們已經(jīng)可以看出Java EE對(duì)兩者角色的定義了。線程的本質(zhì)決定了Servlet只適合一些比較簡(jiǎn)單的輕量級(jí)應(yīng)用;一旦問(wèn)題復(fù)雜了,最好的就是使用EJB。
(4)RMI
??? RMI全稱:Java Remote Method Invocation,就是利用Java對(duì)象序列化的機(jī)制,實(shí)現(xiàn)遠(yuǎn)程類(lèi)對(duì)象的實(shí)例化以及調(diào)用的方法。
??? RMI在Java EE中的主要是負(fù)責(zé)解決通信問(wèn)題,特別是不同的EJB容器之間的通信。大家知道,在分布式應(yīng)用中,各個(gè)功能模塊(EJB)之間通信需要有統(tǒng)一的RPC協(xié)議,否則沒(méi)法通信,而RMI就是負(fù)責(zé)這方面的工作。
【1】RMI 與 CORB
??? 可以說(shuō),RMI就是CORBA的Java版實(shí)現(xiàn)。
【2】再談“遠(yuǎn)程調(diào)用”
??? 現(xiàn)在主流的遠(yuǎn)程調(diào)用方式,不管是com/com+,soap,webservice,rmi,.net remoting,說(shuō)白了都一樣的,就是序列化,網(wǎng)絡(luò)傳輸,反序列化。
??? 序列化方式:同種runtime的,可以native的二進(jìn)制序列化,序列化的效率高。文本的序列化(xml/json/自定義格式)的方式,可以跨平臺(tái)和語(yǔ)言,一般基于中間類(lèi)型。但此序列化方式的效率低,數(shù)據(jù)量也偏大。
??? 網(wǎng)絡(luò)傳輸:則可以使socket/http或是自定義協(xié)議的。 socket數(shù)據(jù)冗余最小,效率最高。RMI其實(shí)是socket上的自定義協(xié)議。 http要走h(yuǎn)ttp的報(bào)文,文本的方式最合適,實(shí)現(xiàn)最簡(jiǎn)單,開(kāi)發(fā)和部署方便。
?
(5)JMS
??? JMS:Java Message Service。JMS提供一種消息機(jī)制,主要作用是提供異步通信的支持,是Java EE的重要基礎(chǔ)模塊。值得注意,異步通信,一般都采用消息機(jī)制,這種情況在Windows中最常見(jiàn)。
(6)JTA
??? JTA:Java Transaction API,主要提供事務(wù)服務(wù)和分布式事務(wù)管理功能,保證分布式事務(wù)的一致性,是Java EE的重要的基礎(chǔ)模塊。
(7)JAAS
??? JAAS:Java Authentication Authorization Service(Java認(rèn)證于授權(quán)服務(wù)),提供了對(duì)Java組件的安全保護(hù),如哪些Servelt,JSP能被哪些用戶訪問(wèn),哪些EJB能被調(diào)用等。但需要注意的是,JAAS只提供了對(duì)JAVAEE組件的保護(hù),對(duì)于企業(yè)應(yīng)用業(yè)務(wù)的權(quán)限,它是做不到的。
(8)Connector
??? Connector主要作用就是把其他已有的資源、服務(wù)、系統(tǒng)整合到Java EE系統(tǒng)中。不同的服務(wù)提供商和Java EE平臺(tái)會(huì)定義不同的協(xié)議,而Connector就是指這些協(xié)議的實(shí)現(xiàn)。
??? 至此為止,Java EE的核心模塊介紹完畢,讓我們來(lái)看看J2EE 1.3的架構(gòu)圖(當(dāng)時(shí)的J2EE架構(gòu)還是比較簡(jiǎn)單的):
4.J2EE 1.4 以及 Java EE 5體系結(jié)構(gòu)
(1)J2EE 1.4 體系結(jié)構(gòu)
??? J2EE 1.4加入了一個(gè)重要的主題:“Web Service”,包括:JAX-RPC,SAAJ,Web Srvcs,JAXR都屬于這一塊的東西。
(2)Java EE 5體系結(jié)構(gòu)
??? 關(guān)于Java EE 5這里就不詳細(xì)介紹了:>,大家有興趣可以參考《Java EE Tutorial 5》。
后記
??? 這篇文章寫(xiě)了我3天,同時(shí)也翻了N多資料,希望本文確實(shí)對(duì)各位初學(xué)者有所幫助,同時(shí)本文包含很多個(gè)人觀點(diǎn),如有錯(cuò)誤敬請(qǐng)指出:>
??? 關(guān)于Java EE 5,如果后續(xù)有時(shí)間我會(huì)繼續(xù)整理。
重要參考資料
【1】《JAVA EE 5 的發(fā)展史》
【2】《Java程序員 上班那點(diǎn)兒事》
【3】《Java EE Tutorial 5》
【4】《J2EE到底是什么?》
本文轉(zhuǎn)自hyddd博客園博客,原文鏈接:http://www.cnblogs.com/hyddd/archive/2010/02/03/1662333.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者。
總結(jié)
以上是生活随笔為你收集整理的Java EE启示录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: tensorflow无法检测到GPU设备
- 下一篇: java美元兑换,(Java实现) 美元