Java EE幾十種技術(shù),“活著的”還剩幾何(Web應(yīng)用技術(shù)篇)
前言
你好,我是方同學(xué)(YourBatman)
若你還不太清楚Java EE是什么,可先移步這里:什么是Java EE?
技術(shù)的發(fā)展日新月異,滄海桑田,一不留神的掉隊,可能就是永遠(yuǎn)。就連穩(wěn)得一批的Spring技術(shù)棧也受到了基于GraalVM的QUARKUS等框架的挑戰(zhàn),好在Spring社區(qū)迅速推出了Spring Native予以回應(yīng)。
作為一枚Javaer,不可能沒有聽過Java EE。比如至少聽過這句廣為流傳的話“Java EE的13種核心技術(shù)”,而其實Java EE遠(yuǎn)不止13種技術(shù)。
通過此圖你領(lǐng)略到了Java EE的“大而全”。從1999年出現(xiàn)到已有20余年,風(fēng)云變幻,現(xiàn)在早已不是Java EE的天下,Spring技術(shù)棧已接管成為實際標(biāo)準(zhǔn)。本文就盤點盤點Java EE這幾十種技術(shù)規(guī)范,依舊堅挺的還要哪些?
Tips:推薦學(xué)習(xí)指數(shù)獲得3顆??的可認(rèn)為依舊堅挺,4顆??認(rèn)為知識點還比較重要,5顆??認(rèn)為依舊是主流技術(shù)
所屬專欄
BATutopia-Java EE
相關(guān)下載
- 工程源代碼:https://github.com/yourbatman/BATutopia-java-ee
- 【女媧Knife-Initializr工程】訪問地址:http://152.136.106.14:8761
- Java開發(fā)軟件包(Mac):https://wangpan.yourbatman.cn/s/rEH0 提取碼:javakit
- 程序員專用網(wǎng)盤上線啦,開放注冊送1G超小容量,幫你實踐做減法:https://wangpan.yourbatman.cn
版本約定
- Java EE:6、7、8
- Jakarta EE:8、9、9.1
另外說明:下面所有API的GAV坐標(biāo)均使用Jakarta EE的方式給出,原因是它的GAV命名、歸類相較于舊的Java EE更加規(guī)范,對開發(fā)者而言規(guī)律性更強、理解起來更方便些。版本號方面全部采用javax.*命名空間對于的版本,若想升級到j(luò)akarta.*命名空間的話僅需大版本號 + 1即可(GAV不變),非常方便。
另外還有一個小約定:同是javax.*命名空間的話,Jakarta EE的GAV大版本號與Java EE 8的保持一致,若發(fā)現(xiàn)大版本號比后者大了,那么說明命名空間已是新的jakarta.*。
從Java EE 8(及以后)版本推薦使用Jakarta EE的GAV,因為摒棄掉Java EE元素已是大勢所趨
正文
Java EE技術(shù)總覽
以Java EE 8/Jakarta EE 8為例,主要包含這些技術(shù):
劃分為五大類:
其中,Web應(yīng)用技術(shù)是現(xiàn)在Java最最最重要的使用場景。因此本文就聚焦在這塊,來聊聊它有哪些技術(shù),有哪些技術(shù)現(xiàn)今依舊堅挺。
Part1: Web應(yīng)用技術(shù)
Web Application Technologies,共8個規(guī)范。
把該part放在首位,因為它對開發(fā)者是最重要、使用得最多的,也是開發(fā)者最熟悉的部分。這“一切”可能權(quán)由Servlet承擔(dān)著...
1. Servlet
推薦學(xué)習(xí)指數(shù)5
Servlet規(guī)范絕對是作為一枚Javaer必知必會的技術(shù)。
Java Servlet是運行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務(wù)器上的數(shù)據(jù)庫或應(yīng)用程序之間的中間層。
Java Servlet 是運行在帶有支持 Java Servlet 規(guī)范的解釋器的 web 服務(wù)器上的 Java 類。
Servlet現(xiàn)今依舊是Java Web應(yīng)用開發(fā)的主流技術(shù),即使以Spring WebFlux為代表的響應(yīng)式編程技術(shù)出現(xiàn)了且很多,但基于Servlet的Spring MVC依舊熱度不減,是業(yè)務(wù)開發(fā)的首選。
API的GAV:
- <dependency>
- <groupId>jakarta.servlet</groupId>
- <artifactId>jakarta.servlet-api</artifactId>
- <version>4.0.4</version>
- <scope>provided</scope>
- </dependency>
代表API:
- ServletContext
- HttpServlet
- HttpFilter
- RequestDispatcher
Servlet由Web容器(如Tomcat)提供實現(xiàn),因此只有你的工程在編譯期強依賴于Servlet的API參與編譯時才需導(dǎo)入此庫(scope=provided,表示參與編譯但并不會打包進(jìn)去)。
2. JSP
推薦學(xué)習(xí)指數(shù)2
雖說JSP技術(shù)早已out,但由于其濃厚的歷史原因,所以我認(rèn)為每一個Java Web開發(fā)人員對此門技術(shù)都應(yīng)該有一定了解。不為使用,只為談資。
JSP用全稱Java Server Pages,是一種動態(tài)網(wǎng)頁開發(fā)技術(shù)。之所以說動態(tài)是因為它使用JSP標(biāo)簽在HTML網(wǎng)頁中插入Java代碼,Java代碼放在標(biāo)簽<% %>里。
JSP本質(zhì)是一種Servlet(編譯后均變?yōu)镾ervlet),主要用于實現(xiàn)Java web應(yīng)用程序的用戶界面部分。那么為何有了Servlet還需要JSP呢?與純Servlet相比:JSP可以很方便的編寫或者修改HTML網(wǎng)頁而不用去面對大量的println()/writer.write()語句,可讀性可維護(hù)性更高。
API的GAV:
- <dependency>
- <groupId>jakarta.servlet</groupId>
- <artifactId>jakarta.servlet-api</artifactId>
- <version>4.0.4</version>
- <scope>provided</scope>
- </dependency>
代表API:
- JspContext、PageContext
- JspPage、HttpJspPage(public interface JspPage extends Servlet { ... })
- JspTag
顯然,JSP規(guī)范的具體實現(xiàn)亦由Web容器提供,并且99.99%的情況下開發(fā)者并不需要它的API,所以該GAV了解下即可。
3. EL表達(dá)式
推薦學(xué)習(xí)指數(shù)3
EL因JSP而生,但又獨立于JSP。雖說JSP已死,但EL作為一門獨立的表達(dá)式語言,是可以單獨存在的。
Expression Language表達(dá)式語言,一種在JSP頁面獲取數(shù)據(jù)的簡單方式(只能獲取數(shù)據(jù),不能設(shè)置數(shù)據(jù)),目的是簡化開發(fā)且提高可維護(hù)性,替代開發(fā)者在JSP頁面上寫的Java代碼。
EL表達(dá)式是在JSP2.0開始新引入概念,所以有時候也叫它JSP表達(dá)式語言。它由JSP提出而出現(xiàn),但并不必須依托于它而存在,而是可作為一門獨立的表達(dá)式語言技術(shù)提供使用,生命周期并不與JSP對等。
著名的校驗框架Hibernate Validator強依賴了EL表達(dá)式語言技術(shù),所以這就是為何我認(rèn)為它的學(xué)習(xí)指數(shù)比其“父親”JSP要高的原因。
API的GAV:
- <dependency>
- <groupId>jakarta.el</groupId>
- <artifactId>jakarta.el-api</artifactId>
- <version>3.0.3</version>
- <scope>provided</scope>
- </dependency>
代表API:
- ELContext
- ELManager
- ExpressionFactory
- Expression、ValueExpression、MethodExpression
EL一般也由Web容器提供實現(xiàn)。當(dāng)然嘍,Web容器也將其實現(xiàn)拆開來了可單獨使用,如嵌入式tomcat的實現(xiàn)模塊為:org.apache.tomcat.embed:tomcat-embed-el
4. JSTL標(biāo)準(zhǔn)標(biāo)簽庫
推薦學(xué)習(xí)指數(shù)1
強依托于JSP的存在而存在。
JavaServer Pages Standard Tag Library,JSP標(biāo)準(zhǔn)標(biāo)簽庫。他是一個JSP標(biāo)簽集合,封裝了JSP應(yīng)用的通用核心功能。目的同EL有點類似:簡化開發(fā)且提高可維護(hù)性,替代開發(fā)者在JSP頁面上寫的Java代碼。
和EL一起它哥倆的出現(xiàn)目的都是為了讓開發(fā)者不要再在JSP上寫Java代碼啦,不同的是JSTL必須依托于JSP的存在而存在。
API的GAV:
- <dependency>
- <groupId>jakarta.servlet.jsp.jstl</groupId>
- <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
- <version>1.2.7</version>
- <scope>provided</scope>
- </dependency>
代表API:
- LoopTag(public interface LoopTag extends Tag { ... })
- SQLExecutionTag
- LocaleSupport(fmt標(biāo)簽)
用過JSTL的同學(xué)可能對standard.jar和jstl.jar這兩個Jar印象最深,這里做下簡單說明:
- GAV只是api,一般不包含實現(xiàn)(符合Java EE只做規(guī)范的理念)
- standard.jar和jstl.jar屬于具體實現(xiàn)(web容器一般自己有提供)。如還有Apache的標(biāo)準(zhǔn)實現(xiàn):org.apache.taglibs:taglibs-standard-impl
5. WebScoket
推薦學(xué)習(xí)指數(shù)4
一門2011年才出現(xiàn)的“新”技術(shù),Java亦提供了實現(xiàn)。
WebSocket是HTML5開始提供的一種在單個TCP 連接上進(jìn)行全雙工通訊的協(xié)議。而這里聊的WebSocket是Java對其的支持,制定的編碼規(guī)范。
WebSocket大大改進(jìn)了服務(wù)器/瀏覽器的交互方式,作為一門新新技術(shù),生命力還是很強的,推薦學(xué)習(xí)。
API的GAV:
- <dependency>
- <groupId>jakarta.websocket</groupId>
- <artifactId>jakarta.websocket-api</artifactId>
- <version>1.1.2</version>
- <scope>provided</scope>
- </dependency>
代表API:
- @ServerEndpoint、ServerApplicationConfig、HandshakeRequest
- @OnOpen、@OnMessage、@OnError、@OnClose
它是構(gòu)建在http協(xié)議之上的全雙工通信協(xié)議,相較于TCP更加方面,是和Html頁面搭建長鏈接通訊的首選。
6. JSF
推薦學(xué)習(xí)指數(shù)1
JavaServer Faces,一種用于構(gòu)建 Web 應(yīng)用程序的標(biāo)準(zhǔn)Java框架。它提供了一種以組件為中心來開發(fā) Java Web 用戶界面的方法,從而簡化了開發(fā)。
MVC設(shè)計模式 (Model-View-Controller)出自于它,使用Facelets聲明語言構(gòu)建視圖,并且模型由CDI托管bean表示,控制器由JSF引擎本身負(fù)責(zé)。
API的GAV:
- <dependency>
- <groupId>jakarta.faces</groupId>
- <artifactId>jakarta.faces-api</artifactId>
- <version>2.3.2</version>
- </dependency>
代表API:
- Facelet、FaceletContext(public abstract class FaceletContext extends ELContext { ... })
- FacesWrapper
- FacesRenderer
- @RequestMap、@ApplicationMap、@ApplicationMap、@RequestCookieMap、RequestParameterMap
總而言之,JSF算是被Struts、Spring MVC這類框架吊打。
7. JSON-P
推薦學(xué)習(xí)指數(shù)2
Java API for JSON Processing,專門用于處理JSON數(shù)據(jù)的API被納入JavaEE規(guī)范體系。用于使用生成和解析JSON數(shù)據(jù)中描述的對象模型或流模型來解析,轉(zhuǎn)換和查詢JSON數(shù)據(jù)??纯此腁PI:
- Json:所有JSON對象的工廠類(如創(chuàng)建JsonParser、JsonGenerator),提供大量靜態(tài)方法
- JsonParser:從流或?qū)ο竽P椭凶x取JSON數(shù)據(jù)的基于事件的解析器,如getInt()、getLong()
- JsonGenerator:一次將JSON數(shù)據(jù)寫入流中一個元素,如write(xxx)、writeNull()
看過我寫的Jackson專欄的同學(xué)能發(fā)現(xiàn),這和Jackson簡直一毛一樣,甚至API很大一部分相同或相似。這便就是Java EE提供的用于處理Json的底層API。
API的GAV:
- <dependency>
- <groupId>jakarta.json</groupId>
- <artifactId>jakarta.json-api</artifactId>
- <version>1.1.6</version>
- </dependency>
代表API:
- JsonReader、JsonWriter、JsonReaderFactory、JsonWriterFactory
- JsonValue、JsonString、JsonNumber、JsonArray
他是Java EE抽象出來處理JSON的底層 API,對標(biāo)Jackson-core。
8. JSON-B
推薦學(xué)習(xí)指數(shù)2
Java EE 7提供了JSON-P讓Java具有了處理Json的能力,但是這么底層的API誰會用?就像Jackson一樣如果沒有提供ObjectMapper這種自動綁定能力的API的話估計也很少人會用。直到Java EE 8官方貌似才恍然大悟意識到了這一點。
Java API for JSON Binding,實現(xiàn)JSON數(shù)據(jù)與Java對象之間的綁定。常見的Java primitive types和String類都能夠自動綁定,很明顯它底層走的JSON-P。
給幾個JSON-B的注解你瞧瞧:
- @JsonbDateFormat
- @JsonbNumberFormat
- @JsonbProperty
- @JsonbVisibility
這套路面熟吧(閱讀過我Jackson專欄的同學(xué)會覺得很面熟)。
API的GAV:
- <dependency>
- <groupId>jakarta.json.bind</groupId>
- <artifactId>jakarta.json.bind-api</artifactId>
- <version>1.0.2</version>
- </dependency>
代表API:
- Jsonb、JsonbBuilder
- JsonbSerializer、JsonbDeserializer
- JsonbProvider
Java EE新增的JSON技術(shù),只能說起晚了也趕晚了。想要“奪回市場”基本沒戲。
總結(jié)
Web應(yīng)用技術(shù)作為Java EE最最最重要的部分,共包含8項具體技術(shù),其中:
- 1個仍為主流:Servlet
- 1個還比較重要:WebScoket
- 1個還在堅挺:EL表達(dá)式
- 其它的5個存在感已非常之弱,連學(xué)習(xí)的必要性也沒有了。相信隨著時間的推移,被遺忘就是它們的歸宿
本文介紹完了最為重要的Web技術(shù)的情況,下文繼續(xù)為你介紹“非Web相關(guān)的技術(shù)”情況,那才真叫一個一片狼藉,“哀鴻遍野”。