作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。本文已被https://yourbatman.cn收录;注册即享1G超小容量的程序员专用网盘https://wangpan.yourbatman.cn;公号后台回复“专栏列表”获取全部小而美的原创技术专栏
✍前言
你好,我是A哥(YourBatman)
作为Java EE专栏的文章,怎能连概念都不予以解释呢?有了前面的铺垫,感觉尝试为你解释的时机已到:
我想了很久怎么定义,其实还蛮难的。所以本文会根据自己的理解,画几了张图,作为经验的沉淀,期待可以帮助到你。
所属专栏
相关下载
Java EE工程源代码:https://github.com/yourbatman/BATutopia-java-ee JSR-JCP工程源代码:https://github.com/yourbatman/JSR-JCP JSR文件网盘下载:https://wangpan.yourbatman.cn/s/nRtq 密码:jsrjcp
版本约定
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):
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个,岂乃国货之光?这种一种规范 + 多种实现是咱们程序员的老套路了,该方式对企业非常友好,当遇到某供应商产品服务不靠谱的话迁移起来就不用太费劲了。
本专栏文章
推荐阅读

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全部原创技术专栏




