聊聊什么是Java EE?

开发 后端
本专栏第一篇文章就介绍了从Java EE到Jakarta EE的发展史,对它有了宏观的认识。现在就以现在最常用的Java EE 8为例,详细掰扯掰扯它到底是什么,在开发中扮演什么角色。

[[412897]]

本文转载自微信公众号「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):图片

  1. GlassFish
  2. WebSphere
  3. Wildfly
  4. JBoss
  5. Weblogic
  6. InforSuite AS(东方通,国产)
  7. TongWeb(中创软件,国产)
  8. 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的区别

[[412898]]

它俩是兄弟,技术上同宗。

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规范指导下并行开发,这就很容易实施分层结构。

我们一般在设计一个系统时会将其设计为三层:

  1. 表示层(Web层):用户界面
  2. 中间层(Service层):业务逻辑
  3. 数据层(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个,岂乃国货之光?这种一种规范 + 多种实现是咱们程序员的老套路了,该方式对企业非常友好,当遇到某供应商产品服务不靠谱的话迁移起来就不用太费劲了。

 

责任编辑:武晓燕 来源: BAT的乌托邦
相关推荐

2020-06-17 07:40:26

监控系统zabbix

2021-07-20 08:03:43

微服务应用程序

2022-02-15 19:50:18

加载器JAVAJDK

2021-02-05 08:42:21

云原生系统方式

2022-03-18 10:43:12

WebSocketHTML5TCP 连接

2022-10-28 08:46:57

变革型领导IT

2022-03-17 21:30:31

BRAS宽带服务器

2020-07-02 14:30:12

SDNSDON交换机

2023-05-14 19:18:07

2021-03-08 23:45:33

数字化转型5G

2015-05-12 11:04:42

Java EE学习Java EE

2020-06-19 08:04:23

监控系统

2023-09-13 07:02:23

2021-11-26 00:06:04

Go函数代码

2021-11-11 09:27:02

技术RedisMySQL

2020-11-03 07:09:31

5GCPEWi-Fi

2020-08-07 14:28:04

裸金属服务器云服务

2022-05-31 09:17:08

通信网络技术

2022-02-26 19:05:01

AI人工智能机器学习

2022-05-23 11:03:53

云原生技术DockerIstio
点赞
收藏

51CTO技术栈公众号