前言
你好,我是方同学(YourBatman)
若你还不太清楚Java EE是什么,可先移步这里:什么是Java EE?
技术的发展日新月异,沧海桑田,一不留神的掉队,可能就是永远。就连稳得一批的Spring技术栈也受到了基于GraalVM的QUARKUS等框架的挑战,好在Spring社区迅速推出了Spring Native予以回应。
作为一枚Javaer,不可能没有听过Java EE。比如至少听过这句广为流传的话“Java EE的13种核心技术”,而其实Java EE远不止13种技术。
通过此图你领略到了Java EE的“大而全”。从1999年出现到已有20余年,风云变幻,现在早已不是Java EE的天下,Spring技术栈已接管成为实际标准。本文就盘点盘点Java EE这几十种技术规范,依旧坚挺的还要哪些?
Tips:推荐学习指数获得3颗??的可认为依旧坚挺,4颗??认为知识点还比较重要,5颗??认为依旧是主流技术
所属专栏
BATutopia-Java EE
相关下载
- 工程源代码:https://github.com/yourbatman/BATutopia-java-ee
- 【女娲Knife-Initializr工程】访问地址:http://152.136.106.14:8761
- Java开发软件包(Mac):https://wangpan.yourbatman.cn/s/rEH0 提取码:javakit
- 程序员专用网盘上线啦,开放注册送1G超小容量,帮你实践做减法:https://wangpan.yourbatman.cn
版本约定
- Java EE:6、7、8
- Jakarta EE:8、9、9.1
另外说明:下面所有API的GAV坐标均使用Jakarta EE的方式给出,原因是它的GAV命名、归类相较于旧的Java EE更加规范,对开发者而言规律性更强、理解起来更方便些。版本号方面全部采用javax.*命名空间对于的版本,若想升级到jakarta.*命名空间的话仅需大版本号 + 1即可(GAV不变),非常方便。
另外还有一个小约定:同是javax.*命名空间的话,Jakarta EE的GAV大版本号与Java EE 8的保持一致,若发现大版本号比后者大了,那么说明命名空间已是新的jakarta.*。
从Java EE 8(及以后)版本推荐使用Jakarta EE的GAV,因为摒弃掉Java EE元素已是大势所趋
正文
Java EE技术总览
以Java EE 8/Jakarta EE 8为例,主要包含这些技术:
划分为五大类:
其中,Web应用技术是现在Java最最最重要的使用场景。因此本文就聚焦在这块,来聊聊它有哪些技术,有哪些技术现今依旧坚挺。
Part1: Web应用技术
Web Application Technologies,共8个规范。
把该part放在首位,因为它对开发者是最重要、使用得最多的,也是开发者最熟悉的部分。这“一切”可能权由Servlet承担着...
1. Servlet
推荐学习指数5
Servlet规范绝对是作为一枚Javaer必知必会的技术。
Java Servlet是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。
Servlet现今依旧是Java Web应用开发的主流技术,即使以Spring WebFlux为代表的响应式编程技术出现了且很多,但基于Servlet的Spring MVC依旧热度不减,是业务开发的首选。
API的GAV:
- @lt;dependency@gt;
- @lt;groupId@gt;jakarta.servlet@lt;/groupId@gt;
- @lt;artifactId@gt;jakarta.servlet-api@lt;/artifactId@gt;
- @lt;version@gt;4.0.4@lt;/version@gt;
- @lt;scope@gt;provided@lt;/scope@gt;
- @lt;/dependency@gt;
代表API:
- ServletContext
- HttpServlet
- HttpFilter
- RequestDispatcher
Servlet由Web容器(如Tomcat)提供实现,因此只有你的工程在编译期强依赖于Servlet的API参与编译时才需导入此库(scope=provided,表示参与编译但并不会打包进去)。
2. JSP
推荐学习指数2
虽说JSP技术早已out,但由于其浓厚的历史原因,所以我认为每一个Java Web开发人员对此门技术都应该有一定了解。不为使用,只为谈资。
JSP用全称Java Server Pages,是一种动态网页开发技术。之所以说动态是因为它使用JSP标签在HTML网页中插入Java代码,Java代码放在标签@lt;% %@gt;里。
JSP本质是一种Servlet(编译后均变为Servlet),主要用于实现Java web应用程序的用户界面部分。那么为何有了Servlet还需要JSP呢?与纯Servlet相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println()/writer.write()语句,可读性可维护性更高。
API的GAV:
- @lt;dependency@gt;
- @lt;groupId@gt;jakarta.servlet@lt;/groupId@gt;
- @lt;artifactId@gt;jakarta.servlet-api@lt;/artifactId@gt;
- @lt;version@gt;4.0.4@lt;/version@gt;
- @lt;scope@gt;provided@lt;/scope@gt;
- @lt;/dependency@gt;
代表API:
- JspContext、PageContext
- JspPage、HttpJspPage(public interface JspPage extends Servlet { ... })
- JspTag
显然,JSP规范的具体实现亦由Web容器提供,并且99.99%的情况下开发者并不需要它的API,所以该GAV了解下即可。
3. EL表达式
推荐学习指数3
EL因JSP而生,但又独立于JSP。虽说JSP已死,但EL作为一门独立的表达式语言,是可以单独存在的。
Expression Language表达式语言,一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据),目的是简化开发且提高可维护性,替代开发者在JSP页面上写的Java代码。
EL表达式是在JSP2.0开始新引入概念,所以有时候也叫它JSP表达式语言。它由JSP提出而出现,但并不必须依托于它而存在,而是可作为一门独立的表达式语言技术提供使用,生命周期并不与JSP对等。
著名的校验框架Hibernate Validator强依赖了EL表达式语言技术,所以这就是为何我认为它的学习指数比其“父亲”JSP要高的原因。
API的GAV:
- @lt;dependency@gt;
- @lt;groupId@gt;jakarta.el@lt;/groupId@gt;
- @lt;artifactId@gt;jakarta.el-api@lt;/artifactId@gt;
- @lt;version@gt;3.0.3@lt;/version@gt;
- @lt;scope@gt;provided@lt;/scope@gt;
- @lt;/dependency@gt;
代表API:
- ELContext
- ELManager
- ExpressionFactory
- Expression、ValueExpression、MethodExpression
EL一般也由Web容器提供实现。当然喽,Web容器也将其实现拆开来了可单独使用,如嵌入式tomcat的实现模块为:org.apache.tomcat.embed:tomcat-embed-el
4. JSTL标准标签库
推荐学习指数1
强依托于JSP的存在而存在。
JavaServer Pages Standard Tag Library,JSP标准标签库。他是一个JSP标签集合,封装了JSP应用的通用核心功能。目的同EL有点类似:简化开发且提高可维护性,替代开发者在JSP页面上写的Java代码。
和EL一起它哥俩的出现目的都是为了让开发者不要再在JSP上写Java代码啦,不同的是JSTL必须依托于JSP的存在而存在。
API的GAV:
- @lt;dependency@gt;
- @lt;groupId@gt;jakarta.servlet.jsp.jstl@lt;/groupId@gt;
- @lt;artifactId@gt;jakarta.servlet.jsp.jstl-api@lt;/artifactId@gt;
- @lt;version@gt;1.2.7@lt;/version@gt;
- @lt;scope@gt;provided@lt;/scope@gt;
- @lt;/dependency@gt;
代表API:
- LoopTag(public interface LoopTag extends Tag { ... })
- SQLExecutionTag
- LocaleSupport(fmt标签)
用过JSTL的同学可能对standard.jar和jstl.jar这两个Jar印象最深,这里做下简单说明:
- GAV只是api,一般不包含实现(符合Java EE只做规范的理念)
- standard.jar和jstl.jar属于具体实现(web容器一般自己有提供)。如还有Apache的标准实现:org.apache.taglibs:taglibs-standard-impl
5. WebScoket
推荐学习指数4
一门2011年才出现的“新”技术,Java亦提供了实现。
WebSocket是HTML5开始提供的一种在单个TCP 连接上进行全双工通讯的协议。而这里聊的WebSocket是Java对其的支持,制定的编码规范。
WebSocket大大改进了服务器/浏览器的交互方式,作为一门新新技术,生命力还是很强的,推荐学习。
API的GAV:
- @lt;dependency@gt;
- @lt;groupId@gt;jakarta.websocket@lt;/groupId@gt;
- @lt;artifactId@gt;jakarta.websocket-api@lt;/artifactId@gt;
- @lt;version@gt;1.1.2@lt;/version@gt;
- @lt;scope@gt;provided@lt;/scope@gt;
- @lt;/dependency@gt;
代表API:
- @ServerEndpoint、ServerApplicationConfig、HandshakeRequest
- @OnOpen、@OnMessage、@OnError、@OnClose
它是构建在http协议之上的全双工通信协议,相较于TCP更加方面,是和Html页面搭建长链接通讯的首选。
6. JSF
推荐学习指数1
JavaServer Faces,一种用于构建 Web 应用程序的标准Java框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化了开发。
MVC设计模式 (Model-View-Controller)出自于它,使用Facelets声明语言构建视图,并且模型由CDI托管bean表示,控制器由JSF引擎本身负责。
API的GAV:
- @lt;dependency@gt;
- @lt;groupId@gt;jakarta.faces@lt;/groupId@gt;
- @lt;artifactId@gt;jakarta.faces-api@lt;/artifactId@gt;
- @lt;version@gt;2.3.2@lt;/version@gt;
- @lt;/dependency@gt;
代表API:
- Facelet、FaceletContext(public abstract class FaceletContext extends ELContext { ... })
- FacesWrapper
- FacesRenderer
- @RequestMap、@ApplicationMap、@ApplicationMap、@RequestCookieMap、RequestParameterMap
总而言之,JSF算是被Struts、Spring MVC这类框架吊打。
7. JSON-P
推荐学习指数2
Java API for JSON Processing,专门用于处理JSON数据的API被纳入JavaEE规范体系。用于使用生成和解析JSON数据中描述的对象模型或流模型来解析,转换和查询JSON数据。看看它的API:
- Json:所有JSON对象的工厂类(如创建JsonParser、JsonGenerator),提供大量静态方法
- JsonParser:从流或对象模型中读取JSON数据的基于事件的解析器,如getInt()、getLong()
- JsonGenerator:一次将JSON数据写入流中一个元素,如write(xxx)、writeNull()
看过我写的Jackson专栏的同学能发现,这和Jackson简直一毛一样,甚至API很大一部分相同或相似。这便就是Java EE提供的用于处理Json的底层API。
API的GAV:
- @lt;dependency@gt;
- @lt;groupId@gt;jakarta.json@lt;/groupId@gt;
- @lt;artifactId@gt;jakarta.json-api@lt;/artifactId@gt;
- @lt;version@gt;1.1.6@lt;/version@gt;
- @lt;/dependency@gt;
代表API:
- JsonReader、JsonWriter、JsonReaderFactory、JsonWriterFactory
- JsonValue、JsonString、JsonNumber、JsonArray
他是Java EE抽象出来处理JSON的底层 API,对标Jackson-core。
8. JSON-B
推荐学习指数2
Java EE 7提供了JSON-P让Java具有了处理Json的能力,但是这么底层的API谁会用?就像Jackson一样如果没有提供ObjectMapper这种自动绑定能力的API的话估计也很少人会用。直到Java EE 8官方貌似才恍然大悟意识到了这一点。
Java API for JSON Binding,实现JSON数据与Java对象之间的绑定。常见的Java primitive types和String类都能够自动绑定,很明显它底层走的JSON-P。
给几个JSON-B的注解你瞧瞧:
- @JsonbDateFormat
- @JsonbNumberFormat
- @JsonbProperty
- @JsonbVisibility
这套路面熟吧(阅读过我Jackson专栏的同学会觉得很面熟)。
API的GAV:
- @lt;dependency@gt;
- @lt;groupId@gt;jakarta.json.bind@lt;/groupId@gt;
- @lt;artifactId@gt;jakarta.json.bind-api@lt;/artifactId@gt;
- @lt;version@gt;1.0.2@lt;/version@gt;
- @lt;/dependency@gt;
代表API:
- Jsonb、JsonbBuilder
- JsonbSerializer、JsonbDeserializer
- JsonbProvider
Java EE新增的JSON技术,只能说起晚了也赶晚了。想要“夺回市场”基本没戏。
总结
Web应用技术作为Java EE最最最重要的部分,共包含8项具体技术,其中:
- 1个仍为主流:Servlet
- 1个还比较重要:WebScoket
- 1个还在坚挺:EL表达式
- 其它的5个存在感已非常之弱,连学习的必要性也没有了。相信随着时间的推移,被遗忘就是它们的归宿
本文介绍完了最为重要的Web技术的情况,下文继续为你介绍“非Web相关的技术”情况,那才真叫一个一片狼藉,“哀鸿遍野”。
原文链接:https://mp.weixin.qq.com/s/Qt3xIQMmdjv5iBBEjfkPxA