什么是Java EE?


作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。
本文已被https://yourbatman.cn收录;注册即享1G超小容量的程序员专用网盘https://wangpan.yourbatman.cn;公号后台回复“专栏列表”获取全部小而美的原创技术专栏

✍前言

你好,我是A哥(YourBatman)

作为Java EE专栏的文章,怎能连概念都不予以解释呢?有了前面的铺垫,感觉尝试为你解释的时机已到:

我想了很久怎么定义,其实还蛮难的。所以本文会根据自己的理解,画几了张图,作为经验的沉淀,期待可以帮助到你。

所属专栏

相关下载

版本约定

  • Java EE 8

✍正文


本专栏第一篇文章就介绍了从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的区别


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

Tomcat有且仅是一个Web服务器,并且也没有对Java EE中web技术全部实现,而是只有Servlet、JSP等实现,所以非常的轻量级,对标Jetty、Undertow等。因为现在是Spring技术栈大行其道,所以采用Tomcat + Spring的开发、部署方式成为了现在的主流。

TomEE扩展了Apache Tomcat,经过Apache Jakartaee9.1认证的应用服务器。不过值得注意的是:它不是一个Full全功能的应用服务器,而是个Web Profile的

曾经以为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个,岂乃国货之光?这种一种规范 + 多种实现是咱们程序员的老套路了,该方式对企业非常友好,当遇到某供应商产品服务不靠谱的话迁移起来就不用太费劲了。

本专栏文章

推荐阅读

System.out.println("写得可还行?收藏再看吧,点个赞吧,分享下吧");
echo("关注【BAT的乌托邦】 https://yourbatman.cn");
console.log("私聊YourBatman:fsx1056342982");

我是YourBatman:一个早在2013年就已毕业的大龄程序员。网瘾失足、清考、延期毕业、房产中介、送外卖、销售…是我不可抹灭的标签。现在是一个纯粹技术工。

  • 2013.08-2014.07宁夏银川中介公司卖二手房1年,毕业后第1份工作
  • 2014.07-2015.05荆州/武汉/北京,从事炸鸡排、卖保险、直销、送外卖工作,这是第2,3,4,5份工作
  • 2015.08开始从事Java开发,做过兼职,闯过外包,呆过大厂!现为我司基础架构团队负责人
  • Java架构师、Spring开源贡献者,CSDN 2019博客之星Top 10,博客专家,领域建模专家。热衷写代码,有代码洁癖;重视基础和基建,相信效率为王
  • 现在写纯粹技术专栏(公号后台回复专栏列表获取全部),不哗众取宠。如果你也有共鸣,可加我好友(fsx1056342982)一起进步哈(备注:java)

作者: YourBatman
声明: 本站文章均采用 CC BY 4.0 许可协议。你懂的!
  目录