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