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