聊聊什么是Java EE?
本文轉(zhuǎn)載自微信公眾號(hào)「BAT的烏托邦」,作者YourBatman。轉(zhuǎn)載本文請(qǐng)聯(lián)系BAT的烏托邦公眾號(hào)。
正文
本專(zhuān)欄第一篇文章就介紹了從Java EE到Jakarta EE的發(fā)展史,對(duì)它有了宏觀的認(rèn)識(shí)?,F(xiàn)在就以現(xiàn)在最常用的Java EE 8為例,詳細(xì)掰扯掰扯它到底是什么,在開(kāi)發(fā)中扮演什么角色。
什么是Java EE?
有了對(duì)JSR標(biāo)準(zhǔn)規(guī)范的認(rèn)識(shí),再來(lái)看Java EE就簡(jiǎn)單得多得多得多得多了。
JSR、JCP的詳解參見(jiàn):- 阿里巴巴入選的JCP最高執(zhí)行委員會(huì),何方神圣?
Java EE是由一系列抽象的標(biāo)準(zhǔn)規(guī)范所組成,是針對(duì)企業(yè)級(jí)軟件開(kāi)發(fā)中普遍面臨問(wèn)題的一套解決方案。簡(jiǎn)而言之:Java EE = N個(gè)JSR正式規(guī)范 + 一個(gè)運(yùn)行環(huán)境。Java EE是代碼的形式展現(xiàn)出來(lái),而JSR只是文檔。
下定義從來(lái)都不是理工科同學(xué)的長(zhǎng)項(xiàng),但理解性分析是的。這是我根據(jù)自己的理解畫(huà)的一張圖,用來(lái)嘗試解釋Java EE是什么這個(gè)問(wèn)題,如若對(duì)你有用你可保存、分享此圖。
上面的框框就代表著Java EE平臺(tái),開(kāi)發(fā)人員書(shū)寫(xiě)的所有Java代碼都在此容器內(nèi)運(yùn)行(Client端除外),所以也經(jīng)常能聽(tīng)到Java EE容器這樣的術(shù)語(yǔ)。容器是個(gè)非常抽象的概念,不要背誦概念而應(yīng)理解其作用。
既然是容器,那么就有能力攔截程序代碼之間的調(diào)用,實(shí)現(xiàn)AOP的效果。另外我們還可以隨時(shí)的向容器里加入新組件,如安全Security、消息系統(tǒng)JMS、分布式事務(wù)JTA...
值得關(guān)注的是,B/S模式只能通過(guò)協(xié)議與Java EE平臺(tái)交互,而Java Client(也就是C/S模式)有更強(qiáng)的能力:
- 可“繞過(guò)Web容器”直接調(diào)用Bean
- 可直接操作DB數(shù)據(jù)庫(kù)
怎么理解?舉個(gè)例子就明白了:Eclipse/IDEA都是使用Java語(yǔ)言寫(xiě)的客戶(hù)端,它們也基于Java EE平臺(tái)構(gòu)建,因?yàn)镃lient和Server同在一個(gè)JVM進(jìn)程內(nèi),所以直接調(diào)用Bean、數(shù)據(jù)庫(kù)是完全可以做到的。
Java EE的參考實(shí)現(xiàn)
Java EE包含有一組JSR規(guī)范 + 運(yùn)行環(huán)境,每個(gè)JSR是有一個(gè)參考實(shí)現(xiàn)的,單個(gè)的程序并不能跑起來(lái),需要有一個(gè)Java EE的實(shí)現(xiàn)進(jìn)行支撐,那么它是否有官方參考實(shí)現(xiàn)呢?
答案是:有的!Java EE的參考實(shí)現(xiàn)叫做Application Server,翻譯為應(yīng)用服務(wù)器,它是Java EE的完整實(shí)現(xiàn)(注意:是完整實(shí)現(xiàn)),可以將任意程序部署在此。Java EE的參考實(shí)現(xiàn)是:Glassfish Application Server。除此之外,流行的還有TomEE、WebSphere、WebLogic、JBoss等等。
Java EE企業(yè)版供應(yīng)商
所謂的供應(yīng)商,就是自己實(shí)現(xiàn)了Java EE規(guī)范,**并且得到官方認(rèn)證(也就是JCP)**的Application Server。
我在Oracle官網(wǎng)找來(lái)一張圖,顯示了支持Java EE 8的供應(yīng)商產(chǎn)品(完整實(shí)現(xiàn),并非只有web profile):圖片
- GlassFish
- WebSphere
- Wildfly
- JBoss
- Weblogic
- InforSuite AS(東方通,國(guó)產(chǎn))
- TongWeb(中創(chuàng)軟件,國(guó)產(chǎn))
- BES(寶蘭德,國(guó)產(chǎn))
共8個(gè),這個(gè)數(shù)字在Java EE 7時(shí)更多,為10個(gè)(國(guó)產(chǎn)的只占1個(gè))。
定義為JCP的整個(gè)過(guò)程好處是:多家公司能夠依賴(lài)符合規(guī)范的技術(shù)。這樣就能夠保證如果某個(gè)供應(yīng)商開(kāi)始提供不良服務(wù)或破產(chǎn),公司可以保證轉(zhuǎn)移到其他供應(yīng)商不會(huì)造成太多麻煩,比較平滑的遷移。
再回到上面那張Java EE的圖,從圖中可以看到Java EE自己其實(shí)就有兩個(gè)容器:Web容器和EJB容器。
Web容器
Web容器是Java EE環(huán)境的一部分,專(zhuān)用于運(yùn)行那些Web組件,如:pages網(wǎng)頁(yè)、JSP、Servlet、JSTL及其他Java EE Web組件。Web容器可通過(guò)標(biāo)準(zhǔn)Web連接到Java EE應(yīng)用程序的客戶(hù)端進(jìn)行交互協(xié)議,當(dāng)然更可以使用Http、WebSocket等公開(kāi)協(xié)議。
在Java EE中,純Web容器一般只有三種:Tomcat、Jetty、Undertow。其它的如Glassfish、Weblogic等屬于應(yīng)用服務(wù)器,包含了Web的功能。
Web容器/服務(wù)器有著比應(yīng)用服務(wù)器更加輕量級(jí)的特點(diǎn),隨著Spring成為主流技術(shù)也讓輕量級(jí)的Web容器更加受到青睞,最具代表性的當(dāng)屬Tomcat。
Tomcat是Apache軟件基金會(huì)的Jakarta 項(xiàng)目中的一個(gè)核心項(xiàng)目。由Apache、Sun 和其他一些公司及個(gè)人共同開(kāi)發(fā)而成,由于有了Sun的參與(現(xiàn)在Oracle)和支持,Tomcat總是能最及時(shí)的支持到最新版的Servlet/JSP技術(shù)規(guī)范。
EJB容器
EJB容器是Java EE環(huán)境的一部分,專(zhuān)用于運(yùn)行Java EE應(yīng)用程序的應(yīng)用程序邏輯部分。EJB是包含和操縱Java EE應(yīng)用程序的核心數(shù)據(jù)結(jié)構(gòu)的Java類(lèi)。
發(fā)現(xiàn)沒(méi),Spring容器的功能跟它很類(lèi)似。然后EJB容易由于它過(guò)重的設(shè)計(jì),現(xiàn)在已經(jīng)敗下陣來(lái),成為了Spring的天下。
值得強(qiáng)調(diào)的是:Tomcat是不包含EJB容器的(無(wú)Java EE運(yùn)行環(huán)境),不過(guò)他“哥哥”Tom EE有,是個(gè)完整的應(yīng)用服務(wù)器。
小插曲:TomEE和Tomcat的區(qū)別
它倆是兄弟,技術(shù)上同宗。
Tomcat有且僅是一個(gè)Web服務(wù)器,并且也沒(méi)有對(duì)Java EE中web技術(shù)全部實(shí)現(xiàn),而是只有Servlet、JSP等實(shí)現(xiàn),所以非常的輕量級(jí),對(duì)標(biāo)Jetty、Undertow等。因?yàn)楝F(xiàn)在是Spring技術(shù)棧大行其道,所以采用Tomcat + Spring的開(kāi)發(fā)、部署方式成為了現(xiàn)在的主流。
TomEE擴(kuò)展了Apache Tomcat,經(jīng)過(guò)Apache Jakartaee9.1認(rèn)證的應(yīng)用服務(wù)器。不過(guò)值得注意的是:它不是一個(gè)Full全功能的應(yīng)用服務(wù)器,而是個(gè)Web Profile的
TomEE官網(wǎng):https://openejb.apache.org
Tomcat官網(wǎng):https://tomcat.apache.org
曾經(jīng)以為T(mén)omcat不包含EJB運(yùn)行環(huán)境是不足走不遠(yuǎn),沒(méi)想反倒輕便成了最大發(fā)展優(yōu)勢(shì)。
Java EE三層技術(shù)結(jié)構(gòu)
首先,我們知道Java EE應(yīng)用程序是由組件構(gòu)成的,它是基于組件開(kāi)發(fā)的。每個(gè)組件都代表著一個(gè)獨(dú)立的功能單元,它們通過(guò)相關(guān)類(lèi)、容器組織在一起,和其它組件進(jìn)行交互。組件與組件之間是相互獨(dú)立的、可插拔的,互不影響。它們分工協(xié)作,在各自的JSR規(guī)范指導(dǎo)下并行開(kāi)發(fā),這就很容易實(shí)施分層結(jié)構(gòu)。
我們一般在設(shè)計(jì)一個(gè)系統(tǒng)時(shí)會(huì)將其設(shè)計(jì)為三層:
- 表示層(Web層):用戶(hù)界面
- 中間層(Service層):業(yè)務(wù)邏輯
- 數(shù)據(jù)層(Dao層):數(shù)據(jù)存儲(chǔ)、訪(fǎng)問(wèn)獲取
Java EE包含一系列組件(規(guī)范),在不同的層級(jí)中均有一個(gè)/多個(gè)組件應(yīng)用于此。
1、表示層
Java EE表示層使用的JSP技術(shù),通過(guò)Html + JavaScript + Java腳本方式展示頁(yè)面。相關(guān)的組件還有EL表達(dá)式、JSTL等。
2、中間層
Java EE中間層主要是Servlet技術(shù),用于接收客戶(hù)端(比如頁(yè)面)請(qǐng)求并且給與響應(yīng)。相關(guān)的組件還有EJB、JSF框架等。
3、數(shù)據(jù)層
Java EE數(shù)據(jù)層有JDBC、JNDI、JPA,用于對(duì)關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行訪(fǎng)問(wèn)。其中JDBC屬于傳統(tǒng)的數(shù)據(jù)庫(kù)連接方式,也是最為底層的技術(shù)。而JNDI、JPA等只是基于它做了擴(kuò)展、API對(duì)使用者更加友好。
除了三層涉及到的技術(shù)組件外,還有服務(wù)相關(guān)、系統(tǒng)集成、遠(yuǎn)程通信相關(guān)的,如:Web Service、JAX-WS技術(shù)等等。
附:Java EE 8新特性
Java EE 8在Java EE 7的基礎(chǔ)上繼續(xù)改進(jìn)應(yīng)用程序所需的API和編程模型,并添加了社區(qū)中反饋很多的特性。此版本持續(xù)簡(jiǎn)化API,新增的功能主要有:
- 支持HTTP/2的Java Servlet 4.0:與時(shí)俱進(jìn)支持到了http/2協(xié)議
- API增強(qiáng)的JSON支持:增加了類(lèi)似Jackson那樣的自動(dòng)綁定功能
- 新的REST反應(yīng)式客戶(hù)端API:jersey-rx-client-rxjava2提供實(shí)現(xiàn)
- SSE事件支持
- 支持Java 8的新特性:函數(shù)式編程、Stream流式編程、JSR 310日期時(shí)間等
you know,Java EE 8之后就沒(méi)有以后了,交給Eclipse基金會(huì)打理,改名為Jakarta EE。參考文章:從Java EE到Jakarta EE,企業(yè)版Java的發(fā)展歷程
接手過(guò)來(lái)的Jakarta EE發(fā)了三個(gè)版本(Jakarta EE 8、9、9.1),不過(guò)一直在炒冷飯,可認(rèn)為沒(méi)有增加任何新功能。
總結(jié)
Java EE作為“曾經(jīng)”的王者,設(shè)計(jì)上有非常多的可取之處,畢竟是那么多大師的智慧所得。
本文我嘗試為你介紹什么是Java EE這個(gè)原始問(wèn)題,通過(guò)圖示展示出Java EE所處的位置。Web容器和EJB容器均屬于Java EE技術(shù)體系,但是是有區(qū)別和側(cè)重點(diǎn)的。
Java EE作為一套技術(shù)規(guī)范,其商業(yè)實(shí)現(xiàn)產(chǎn)品有多種,單單咱們國(guó)產(chǎn)的Java EE應(yīng)用服務(wù)器實(shí)現(xiàn)就有3個(gè),豈乃國(guó)貨之光?這種一種規(guī)范 + 多種實(shí)現(xiàn)是咱們程序員的老套路了,該方式對(duì)企業(yè)非常友好,當(dāng)遇到某供應(yīng)商產(chǎn)品服務(wù)不靠譜的話(huà)遷移起來(lái)就不用太費(fèi)勁了。