本文转载自微信公众号「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):图片
- 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个,岂乃国货之光?这种一种规范 + 多种实现是咱们程序员的老套路了,该方式对企业非常友好,当遇到某供应商产品服务不靠谱的话迁移起来就不用太费劲了。