大多数公司必须将这些繁芜的寻衅与其现有的企业信息系统(EIS)相结合,同时开拓企业对企业(Business to Business)运用程序,以便基于移动和地理定位模式的运用程序与互助伙伴或企业对客户系统进行通信沟通。
这样,公司不得不折衷存储在不同位置的内部数据,由多种编程措辞处理,并通过不同的协议进行路由。
当然,在无丢失的情形下,企业必须这样做,这意味着分布系统具有防止系统崩溃、高可用性、可扩展性和安全性等特性,同时,企业运用必须面对变革和繁芜性,并且该当系统必须是健壮的。
这正是Java企业版(Java EE)创建的缘故原由所在。

于1999年发布的Java EE的第一个版本(最初称为J2EE)侧重于企业面临的问题:分布式组件。
从那时起,软件运用程序不得不适应新的技能办理方案,如SOAP或RESTful Web做事。
Java EE平台已经发展到通过供应各种标准规范的方法来知足这些技能需求。
多年来,Java EE已经发生变革,变得更加丰富、更大略、更易于利用、更便携和更加集成化。

那么,在本学习教程中,我将给出一个Java EE的总体概述,先容其内部架构,组件和做事后等,并先容Java EE 7中的新功能特性。

jspjms企业级Java开辟从这里总览开启 GraphQL

1Java EE 简史

图1-0总结了14年的Java EE演进。
Java EE以前称为J2EE。
J2EE 1.2是由Sun开拓的,并于1999年发布,包含10个JSR的总括规范。
当时人们总在在评论辩论CORBA,以是J2EE 1.2是在分布式系统的根本上创建的。
引入了企业Java Bean(EJB),支持远程状态和无状态做事工具,并支持持久工具(实体bean)。
它们基于利用RMI-IIOP(远程方法调用 - Internet Inter-ORB协议)作为底层协议的事务和分布式组件模型构建。
Web层有servlet和JavaServer Pages(JSP)技能,JMS用于发送之用。

图1-0 Java EE简史

由J2EE 1.3开始,该规范是由Java社区进程(JCP)根据JSR 58开拓的。
实体bean的支持是逼迫性的,EJB引入了XML支配描述符来存储元数据(在EJB 1.0中的一个文件中被序列化)。
该版本办理了利用远程接口通过值通报参数的开销,即通过引用本地接口并通过引用通报参数。
引入了J2EE连接器架构(JCA)来实现Java EE连接到EIS(企业信息系统)。

2003年发布的J2EE 1.4(JSR 151)在包含20个规范,并增加了对Web做事的支持。
EJB 2.1许可通过SOAP / HTTP调用会话bean。
创建定时做事以许可在指定的韶光或间隔调用EJB。
该版本为运用程序的装置和支配供应了更好的支持。
虽然它的支持者预测了它的伟大未来,但并不是所有的J2EE的承诺都实现了。
利用它创建的系统太繁芜,开拓韶光常常与用户需求的繁芜性成正比。
J2EE被视为重量级组件模型:难以测试,难以支配,难以运行。
就在那时, Struts,Spring或Hibernate等框架涌现并导引出开拓企业运用程序的新方法。

幸运的是,2006年第二季度发布了Java EE 5(JSR 244),带来了显著的进步。
通过从开源框架中得到了一些灵感,引入POJO编程模型。
可以利用注释定义元数据,并且XML描述符成为可选的。
从开拓职员的角度来看,EJB 3和新的JPA比平台的演化更具有飞跃性。
JavaServer Faces(JSF)作为标准的表示层框架被引入,JAX-WS 2.0将JAX-RPC更换为 SOAP Web做事API。

在2009年,Java EE 6(JSR 316)遵照开拓的方便之路,在全体平台(包括Web层)中拥抱含表明、POJO编程和例外配置机制的观点。
它拥有丰富的创新,如全新的JAX-RS 1.1,Bean Validation 1.0和CDI 1.0; 它简化了成熟的API,如EJB 3.1,并丰富了其他的,如JPA 2.0或EJB定时器做事。
但是Java EE 6的紧张主题是可移植性(例如通过标准化全局JNDI命名),某些规范(通过修剪)的弃用,以及通过配置文件创建平台的子集。

本日,Java EE 7带来了许多新的规范(批量处理,websockets,JSON处理)以及改进其他规范。
Java EE 7还通过在大多数规范中采取CDI来提高技能之间的集成。
有机会,将在教程中,我想向您展示这些改进,以及Java Enterprise Edition已经变得更加随意马虎和丰富开拓模式。

尤其是从Java EE 7演进到 Java EE 8,终极又转交Eclipse基金管理,也就促进了现今新的企业级Java 规范的出身,即Jakarta EE8。
须要把稳的是Jakarta EE 8完备兼容Java EE8,而Java EE8是在7的根本上做到增量新特性添加和部分组件的完善,更弗成的变革不大,以是,我们还是基于Java EE 7来先容企业级Java。

2 全局理解Java EE 7

当想处理对的凑集时,无需从开拓自己的哈希表开始——凑集API(运用程序编程接口)就完备知足须要了。
同样,如果您须要一个大略的Web运用程序或支持事务、安全、可互操作和分布式的运用程序,则不须要开拓所有低级API:企业版Java就知足须要。
正如Java标准版(Java SE)供应的处理凑集的API一样,Java EE供应了一种标准的事务API方法来处理Java 事务,利用Java做事(JMS)进行通报,或者利用持久化 API(JPA)进行数据持久化。
Java EE是针对企业运用程序的一组规范,它可以被看作是Java SE的扩展,以便于开拓分布式、健壮的、强大的和高可用性的运用程序。

Java EE 7是一个主要的里程碑。
不仅仅是遵照Java EE 6关注一个更大略的开拓模式,而且还增加了新的规范,并为现有特性增加了新的功能。
其余,高下文依赖注入(CDI)正在成为所有这些新规范之间的集成点。
Java EE 7的发布与企业平台发布十三周年紧密相连,将Java措辞的上风与过去13年所得到的履历结合起来.Java EE从开源社区的活力中获益,同时也得益于严格的 JCP(Java Community Process)标准化进程。

本日,Java EE早已成为经由验证的精良平台,其拥有履历丰富的开拓职员、大型社区以及支配在公司做事器上运行着的诸多运用系统。
Java EE是一套规范的APIs,可用于构建基于标准组件的多层运用程序,这些组件支配在供应一系列做事的不同容器中。

接下来,我们从不同层面理解节制Java EE 7的不同总体构成。

2.1Java EE总体架构

Java EE是由不同容器实现的一组规范。
容器是为其所托管的组件供应某些做事的Java EE运行时环境,例如生命周期管理,依赖注入,并发等。
这些组件利用定义良好的规约与Java EE根本架构以及其他组件进行通信。
在支配之前,须要以标准办法打包(按照定义的目录构造,可压缩到归档文件中)。
把稳,Java EE是Java SE平台的超集,这意味着Java SE API可以由任何Java EE组件利用。

图1-1显示了容器之间的逻辑关系。
箭头表示一个容器访问另一个容器所利用的协议。
例如,Web容器托管可以通过RMI-IIOP访问EJB的servlet。

图1-1 标准Java EE容器架构关系

2.2Java EE构件组成

Java EE运行时环境规范定义了Java EE“实现”(可以看作为中间件)必须支持的四种类型的构件:

²Applets:浏览器小程序是在Web浏览器中实行的GUI(图形用户界面)运用程序。
它们利用丰富的Swing API来供应强大的用户界面。
²Applications:运用程序(PC独立运用程序)是在客户端上实行的程序。
它们常日是可以访问Java EE中间层所有举动步伐的GUI或批处理程序。
²Web Applications:Web运用程序(由servlet、servlet过滤器、Web事宜侦听器、JSP和JSF页面组成)在Web容器中实行,并相应来自Web客户真个HTTP要求。
Servlet还支持SOAP和RESTful Web做事,Web运用程序还可以包含EJB精简版(EJBs Lite).²Enterprise Applications:企业运用程序(由企业Java Bean、Java做事、Java事务API、异步调用、定时做事、RMI / IIOP等构成)在EJB容器中实行。
EJBs是用于处理事务性业务逻辑的容器管理组件。
它们可以被本地化访问和通过RMI(或SOAP for SOAP和RESTful Web做事)远程访问。
2.3Java EE容器

Java EE根本架构被划分为称为容器的逻辑域(见图1-1)。
每个容器都有一个特定的角色,支持一组API,并为组件供应做事(如安全性,数据库访问,事务处理,命名目录,资源注入等)。
容器隐蔽技能繁芜性并增强可移植性。
根据要构建的运用程序的类型,将须理解每个容器的功能和约束,以便利用一个或多个。
例如,如果您须要开拓一个Web运用,将开拓具有EJB Lite层的JSF层,并将其支配到Web容器中。
但是,如果您希望Web运用程序能远程调用业务层并利用通报和异步调用,那么您将须要Web和EJB容器。

Java EE标准定义了四种不同的容器:

²Applet containers:大多数Web浏览器供应Applet容器来实行applet组件。
当开拓applets时,在容器供应安全的环境中,可以集中精力在运用程序的可视化方面。
小运用程序容器利用沙盒安全模型,个中“沙箱”中实行的代码不许可“在沙箱外活动”。
这意味着该容器可防止下载到本地打算机的任何代码访问自由本地系统资源,例如进程或文件。
²Application client container:运用程序客户机容器(ACC)包括一组Java类、库和其他文件等,用于为Java SE运用程序供应注入、完备管理、命名做事(这样的运用包括Swing运用、批处理或仅利用main()方法的类等)。
ACC利用RMI-IIOP和具有HTTP的Web容器(例如,用于Web做事)与EJB容器进行通信。
²Web container:Web容器供应用于管理和实行Web组件(servlet,EJB Lite,JSP,过滤器,侦听器,JSF页面和Web做事)的底层做事。
它卖力实例化,初始化和调用servlet并支持HTTP和HTTPS 协议。
它是用于将网页反馈到客户端浏览器。
²EJB container:EJB容器卖力管理包含Java EE运用程序的业务逻辑层的企业bean(会话bean和驱动的bean)的实行。
它创建EJB的新实例,管理其生命周期,并供应诸如 事务,安全性,并发性,分发,命名做事或异步调用的可能性。
2.4Java EE做事

容器为其支配的组件供应根本做事。
作为开拓职员,容器许可您集中精力履行业务逻辑,而不是办理企业运用程序中面临的技能问题。
图1-2显示了每个容器供应的做事。
例如,Web和EJB容器供应连接器来访问EIS,但不供应applet容器或ACC。
Java EE供应以下做事:

²Java Transaction API:此做事供应容器和运用程序利用的事务分界API。
它还供应事务管理器和做事供应者接口(SPI)级别的资源管理器之间的接口。
²Java Persistence API:用于工具关系映射(ORM)的标准API。
利用其持久性查询措辞(JPQL),可以查询存储在底层数据库中的工具。
²Validation: Bean验证供应类和方法级约束声明和验证功能。
²Java做事:这许可组件通过异步通信。
它支持可靠的点对点(P2P)通报以及发布订阅(pub-sub)模型。
²Java命名和目录接口:此API包含在Java SE中,用于访问命名和目录系统。
运用程序利用此技能将名称与工具进行关联(绑定),然后在目录中查找这些工具(以lookup办法查找)。
其可以查找工具包括数据源、JMS工厂、EJB和其他资源等。
直到J2EE 1.4,无所不在的JNDI可以更透明的办法通过注入利用。
²JavaMail:许多运用程序须要发送电子邮件的功能,可以通过利用JavaMail API来实现。
²JavaBeans激活框架:Java SE中包含的JAF API供应了一种处理不同MIME类型的数据的框架。
它被JavaMail利用。
²XML处理:大多数Java EE组件可以支配可选的XML支配描述符,运用程序常日必须处理XML文档。
Java XML处理API(JAXP)供应了对利用SAX和DOM以及XSLT解析文档的支持。
XML流化API(StAX)为XML供应了一个”pull-parsing”(拉式)解析API。
²JSON处理:Java EE 7中新增的JSON 处理API(JSON-P)许可运用程序解析、天生、转换和查询JSON。
²Java EE连接器体系构造:连接器许可您从Java EE访问EIS,EIS可以是数据库,大型机或企业资源操持(ERP)程序等。
²安全做事:Java认证和授权做事(JAAS)使做事能够对用户进行身份验证和逼迫访问掌握。
Java授权做事供应商规约(JACC)定义了Java EE运用程序做事器和授权做事供应商之间的约束,许可将自定义授权做事供应商插入到任何Java EE产品中。
容器的Java认证做事供应程序接口(JASPIC)定义了一个标准接口,通过该标准接口可以将认证模块集成到容器中,以便这些模块可以建立容器利用的认证标识。
²Web做事:Java EE为SOAP和RESTful Web做事供应支持。
用于XML Web做事的Java API(JAX-WS),供应了支持SOAP/HTTP协议的web做事(用于替代基于XML的RPC即JAX-RPC的API)。
RESTful做事API(JAX-RS)供应了对利用REST风格的Web做事的支持。
²依赖注入:自Java EE 5以来,可以将一些资源(数据源,JMS工厂,持久性单元,EJBs ...)注入到托管组件中。
Java EE 7通过利用CDI以及DI(Java的依赖注入)规范实现了对依赖注入的进一步运用扩展。
²管理:Java EE利用分外的管理企业bean定义用于管理容器和做事器的API。
Java管理扩展(JMX)API也用于供应一些管理支持。
²支配:Java EE支配规范定义了支配工具和Java EE产品之间的规约,以标准化运用程序支配。

图1-2 容器供应做事支持及关系图

而在Jakarta EE 8(原Java EE 8)中,上述的构成关系如下图所示:

Jakarta EE 8架构图

上图简要描述如下:

如图上所示,它描述了Java EE平台架构元素之间的关系。
把稳,该图显示的是组件元素之间的逻辑关系,而并不虞味着将元素物理地划分为单独的机器、进程、地址空间或虚拟机等。

容器(用单独的矩形表示)是Java EE运行时环境,为矩形上半部分中表示的运用程序组件供应所需的做事。
所供应的做事由矩形下半部分的方框表示,一些由运用做事器实现的符合规范的组件。
例如,运用客户端容器向运用客户端供应Java做事(JMS) APIs以及所表示的其他做事。
下面将阐明所有这些做事。

箭头表示须要访问Java EE平台的其他部分。
运用客户端容器通过JDBC API与数据库系统连接,为运用客户端供应了对Java EE所需数据库的直接访问。
由Web容器为JSP页面、JSF运用和servlet供应类似的数据库访问,EJB容器为企业bean供应类似的访问。

如前所述,Java平台标准版(Java SE)的APIs由Java SE运行时环境为每种类型的运用组件供应支持。

2.5Java EE网络协议

如图1-2所示,支配在容器中的组件可以通过不同的协议进行调用。
例如,支配在Web容器中的servlet可以利用HTTP以及在EJB容器中支配EJB端点的Web做事来调用。
以下是Java EE支持的协议列表:

HTTP:HTTP是Web协议,在当代运用程序中是普遍存在的。
客户端API由Java SE中的java.net包定义。
HTTP做事器端API由servlet、JSP和JSF接口定义,就像SOAP和RESTful Web做事一样。
HTTPS:HTTPS是HTTP和安全套接字层(SSL)协议的组合。
RMI-IIOP:远程方法调用(RMI)许可您独立于底层协议调用远程工具。
Java SE本机RMI协议是Java远程方法协议(JRMP).RMI-IIOP是用于与CORBA集成的RMI的扩展 .Java界面描述措辞(IDL)许可Java EE运用程序组件利用IIOP协议调用外部CORBA工具。
CORBA工具可以用许多措辞(Ada,C,C ++,Cobol等)以及Java编写。
2.6Java EE 打包

要支配在容器中,组件首先要封装在标准的格式化存档中。
Java SE定义了Java Archive(jar)文件,用于将多个文件(Java类,支配描述符,资源或外部库)聚合到一个压缩文件(基于ZIP格式)中。
如图1-3所示,Java EE定义了基于通用jar格式的具有自己的打包格式的不同类型的模块。

图1-3 容器中打包归档格式

针对上述归档模式,解释如下:

其一,运用程序客户端模块包含打包在jar文件中的Java类和其他资源文件。
该jar文件可以在Java SE环境或运用程序客户端容器中实行。
像任何其他存档格式一样,jar文件包含一个可选的META-INF目录,用于描述归档的元信息。
META-INF / MANIFEST.MF文件用于定义扩展和包干系数据。
如果支配在ACC中,则支配描述符可以可选地位于META-INF / application-client.xml。

其二,EJB模块包含打包在jar文件(常日称为EJB jar文件)中的一个或多个会话和/或驱动的bean(MDB)。
它包含一个可选的META-INF / ejb-jar.xml支配描述符,并且只能支配在EJB容器中。

其三,Web运用程序模块包含servlet,JSP,JSF页面和Web做事,以及任何其他Web干系文件(HTML和XHTML页面,级联样式表(CSS),Java脚本,图像,视频等)。
从Java EE 6以来,Web运用程序模块还可以包含EJB Lite bean(EJB API的一个子集)。
所有这些工件都封装在带有.war扩展名(常日称为war文件或Web Archive)的jar文件中。
可选Web支配描述符在WEB-INF / web.xml文件中定义。
如果war包含EJB Lite bean,则可以在WEB-INF / ejb-jar.xml中设置可选的支配描述符。
Java.class文件放置在WEB-INF / classes目录和依赖的jar文件的WEB-INF / lib目录下。

其四,企业模块可以包含零个或多个Web运用程序模块,零个或多个EJB模块以及其他常用或外部库。
所有这些都被打包成企业归档(具有.ear扩展名的jar文件),以便各种支配模块协同进行并发。
可选的企业模块支配描述符在META-INF / application.xml文件中定义。
分外的lib目录用于在模块之间共享公共库。

2.7表明和支配描述符

在编程范例中,有两种方法:命令式编程和声明式编程。
语法编程规定了实现目标的算法(必须做的事情),而声明式编程规定了如何实现这一目标(如何完成)。
在Java EE中,通过利用元数据(即注释或/和支配描述符)完成声明式编程。

如图1-2所示,组件在容器中运行,此容器为组件供应了一组做事.Metadata用于声明和自定义这些做事,并将附加信息与Java类、接口、布局函数、方法、字段或参数干系联 。

自从Java EE 5以来,注释在企业平台上一贯在增长。
它们利用元数据信息来润色代码(Java类,接口,字段,方法...)。
清单1-1显示了一个POJO(普通Java工具),它利用类和属性上的注释来声明某些行为。

@Stateless

@Remote(ItemRemote.class)

@Local(ItemLocal.class)

@LocalBean

public class ItemEJB implements ItemLocal, ItemRemote {

@PersistenceContext(unitName = "chapter01PU")

private EntityManager em;

public Book findBookById(Long id) {

return em.find(Book.class, id);

}

}

代码清单1-1:表明式EJB

声明元数据的另一种办法是利用支配描述符。
支配描述符(DD)是指与容器中组件一起支配的XML配置文件.Listing 1-2显示了一个EJB支配描述符。
像大多数Java EE 7支配描述符一样,它定义了http://xmlns.jcp.org/xml/ns/javaee命名空间,并包含版本属性

规范。

<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 

http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd" 

version="3.2">

<enterprise-beans>

<session>

<ejb-name>ItemEJB</ejb-name>

<remote>org.agoncal.book.javaee7.ItemRemote</remote>

<local>org.agoncal.book.javaee7.ItemLocal</local>

<local-bean/>

<ejb-class>org.agoncal.book.javaee7.ItemEJB</ejb-class>

<session-type>Stateless</session-type>

<transaction-type>Container</transaction-type>

</session>

</enterprise-beans>

</ejb-jar>

代码清单1-2:EJB支配描述符

支配描述符须要与分外的META-INF或WEB-INF目录中的组件打包在一起,以备参考。
表1-1显示了Java EE支配描述符和干系规范的列表

表1-1:JavaEE支配描述列表

文件规范路径application.xmlJava EEMETA-INFapplication-client.xmlJava EEMETA-INFbeans.xmlCDIMETA-INF or WEB-INFra.xmlJCAMETA-INFejb-jar.xmlEJBMETA-INF or WEB-INFfaces-config.xmlJSFWEB -INFpersistence.xmlJPAMETA-INFvalidation.xmlBean ValidationMETA-INF or WEB-INFweb.xmlServletWEB-INFweb-fragment.xmlServletWEB-INFwebservices.xmlSOAP Web ServicesMETA-INF or WEB-INF

由于Java EE 5大多数支配描述符是可选的,运用可以利用注释。
或利用两者中对运用程序最好的办法即可。
注释的最大优点是它们显著减少了开拓职员编写的代码量,并且通过利用注释可以避免编写支配描述符的须要。
另一方面,支配描述符是可以变动的外部XML文件,而不须要修正源代码和重新编译。
如果您同时利用这两者,当支配运用程序或组件时则元数据将被支配描述符覆盖(即XML优先于注释)。

2.8编程模型

大多数Java EE 7规范利用相同的编程模型。
它常日是一个POJO,它将一些元数据(注释或XML)支配到容器中。
大多数时候,POJO乃至没有实现一个接口或者扩展一个超类。
由于元数据,容器知道运用于此已支配组件的每一个做事。

在Java EE 7中,servlet,JSF支持bean,EJB,实体,SOAP和REST Web做事是带可选XML支配描述符的注释类。
清单1-3显示了一个JSF支持bean,证明是具有单个CDI注释的Java类。

清单1-3:JSF后端Bean

@Named

public class BookController {

@Inject

private BookEJB bookEJB;

private Book book = new Book();

private List<Book> bookList = new ArrayList<Book>();

public String doCreateBook() {

book = bookEJB.createBook(book);

bookList = bookEJB.findBooks();

return "listBooks.xhtml";

}

// Getters, setters

}

EJB也遵照相同的模式。
如清单1-4所示,如果您须要在本地访问EJB,则没有接口的大略注释类就足够了。
EJB也可以直接支配在war文件中,而不会先前封装在jar文件中。
这使EJB成为可以从大略的Web运用程序到繁芜的企业运用程序利用的最大略的事务组件。

代码清单1-4:无状态EJB

@Stateless

public class BookEJB {

@Inject

private EntityManager em;

public Book findBookById(Long id) {

return em.find(Book.class, id);

}

public Book createBook(Book book) {

em.persist(book);

return book;

}

}

RESTful Web做事已经进入当代运用程序。
Java EE 7通过改进JAX-RS规范来知足企业的需求。
如清单1-5所示,一个RESTful Web做事是一个相应HTTP操作的带有注释的Java类。

代码清单1-5:RESTFUL web做事

@Path("books")

public class BookResource {

@Inject

private EntityManager em;

@GET

@Produces({"application/xml", "application/json"})

public List<Book> getAllBooks() {

Query query = em.createNamedQuery("findAllBooks");

List<Book> books = query.getResultList();

return books;

}

}

以上,希望对你总体把握和学习企业级Java (Jakarta EE 8)有更好的铺垫阐明和勾引帮助。
如果以为故意义,请点这个赞、转发和收藏。
感激^_^

另,这篇教程是在学习Java EE7时的理解和外文翻译,如有欠妥的可以给我留言。