概念:Java 2 Platform Enterprise Edition(J2EE)概述
该指南提供了 J2EE 平台的完整概述。
关系
相关元素
主要描述

介绍

在如今快速发展的充满复杂分发式应用程序的电子商务领域,将您的企业应用程序迅速投向市场是很关键的。 这意味着您的项目团队无法负担在开发系统级别的服务上耗费时间,例如远程连接、命名、持久性、安全性或事务管理。 您的项目团队需要开发和利用可移植、可重用的组件;您不希望耗费任何时间重新创造已验证了真实性的体系结构。

Java™ 2 Platform, Enterprise Edition(J2EE™)解决了此需要,方法是提供明确记录的基于标准的框架,以开发和运行分发式、多层、基于组件的 Java 应用程序。此框架处理应用程序的许多低级复杂性,例如远程连接、命名、持久性、安全性和事务管理,使开发人员能将注意力集中于应用程序的业务逻辑。

J2EE 平台包括:

  • 用于 J2EE 组件和运行组件的 J2EE 平台的一组标准。
  • 应用程序开发蓝图,它详细描述 J2EE 平台,给出了关于如何开发 J2EE 应用程序的行业强度、最佳实践信息。
  • J2EE 平台的参考实现,由 Sun Microsystems Inc. 提供,作为度量商用 J2EE 产品所能对照的标准。该参考实现包括完全开发的样本应用程序。
  • 兼容性测试套件,用于对照 J2EE 标准测试和评估商用 J2EE 实现。

J2EE 平台类似于由计算机操作系统提供的服务 - 通过使用编程工具,操作系统提供 标准服务,在其上您能开发和执行应用程序,而无需关心磁盘访问、内存、视频输出、联网等的低级管理。 您应关心应用程序细节,而非底层系统的细节。 J2EE 平台为企业应用程序提供了一套成熟的操作系统

通过使用 J2EE 平台,您可以简化自己的开发工作,这样项目团队可以将他们的精力集中在应用程序的实际业务逻辑,而非耗费大量开发时间来解决系统级别的问题。 一个项目团队,如果能将精力集中于应用程序做什么,而非集中于如何交付应用程序所需的所有底层服务,那么该团队更有可能交付按时、无错误、满足用户需求的系统。

更多信息请参阅 Sun 的 J2EE 平台概述(http://java.sun.com/) 。请单击 Products & APIs > Java™ 2 Platform, Enterprise Edition (J2EE™) > Overview 链接。

J2EE 开发简述

从应用程序开发者的角度:

  • 您购买商用 J2EE 平台,该平台采用符合 J2EE 的服务器的形式。 J2EE 服务器的行为由 J2EE 标准指定。
  • 您开发或购买现成的 J2EE 组件
  • 您在符合 J2EE 的服务器上部署和执行 J2EE 组件,该服务器提供 J2EE 组件所需的所有服务。

示例

J2EE 应用程序的一个简单示例是电子商务站点,其中客户机(用户)使用 Web 浏览器远程访问 J2EE 服务器。 J2EE 服务器提供 Web 层业务层服务,并与提供 RDBMS 访问的企业信息系统(后端)层交互。

为什么使用 J2EE?

如果符合任何以下这些陈述,您将想要使用 J2EE 平台来开发 Java 电子商务或企业应用程序:

上述各点中的每一点均在本部分的剩余部分进一步作详细讨论。

标准化的、经过行业测试的

J2EE 组件运行在 J2EE 容器中,通常作为符合 J2EE 的服务器的一部分提供。 这些容器提供一组供 J2EE 组件使用的标准服务(API)。这些 API 为:

  • J2SE 1.4
    • JDBC
    • Java IDL
    • 带有 CORBA 的因特网 ORB 间协议(RMI-IIOP)的远程方法调用
    • Java 命名和目录接口(JNDI)
    • Java 认证和授权服务(JAAS)
  • Java 事务 API(JTA)
  • JavaMail
  • Java 消息服务(JMS)。
    关于 JMS 的更多信息,请参阅概念:Java 消息服务(JMS)
  • JavaBeans 激活框架(JAF)
  • Enterprise JavaBeans(EJB)
  • Java Servlet
  • Java API for XML Processing(JAXP)
  • Java 连接器(注意:对 J2EE 1.3 之前的版本不受支持)
  • JavaServer Page(JSP)
  • Web Services for J2EE(注意:对 J2EE 1.4 之前的版本不受支持)
  • Java API for XML-based RPC(JAX-RPC)(注意:对 J2EE 1.4 之前的版本不受支持)
  • SOAP with attachments API for Java(SAAJ)(注意:对 J2EE 1.4 之前的版本不受支持)
  • Java API for XML Registries(JAXR)(注意:对 J2EE 1.4 之前的版本不受支持)
  • J2EE 管理(注意:对 J2EE 1.4 之前的版本不受支持)
  • Java 管理扩展(JMX)(注意:对 J2EE 1.4 之前的版本不受支持)
  • J2EE 部署(注意:对 J2EE 1.4 之前的版本不受支持)
  • 针对容器的 Java 授权服务供应者合同(JACC)(注意:对 J2EE 1.4 之前的版本不受支持)

可移植性

J2EE 组件和应用程序可跨符合 J2EE 的服务器移植而不需要修改代码,因此您能将应用程序部署到您选择的符合 J2EE 的服务器上,只需更新包含在扩展标记语言(XML)部署描述符文件中的特定于服务器的部署信息。

J2EE 规范的标准化已导致了行业竞争 - 您可以根据自己的需要和预算选择符合 J2EE 的服务器。

可重用组件

因为这些 J2EE 组件符合 J2EE 标准,因此可以购买现成的这些组件,并按需要插入到 J2EE 应用程序,从而节省了开发(尤其是调试和测试)工作量。

如果您开发组件,您可以按需要在其他应用程序中重用它或将它部署到另一符合 J2EE 的服务器中。

已验证了真实性的体系结构和设计模式

J2EE 平台定义结构良好的多层应用程序体系结构。通过利用 J2EE 体系结构,您的开发人员可以很快地继续从事应用程序的实际业务逻辑的开发。

J2EE 文档包括:

  • 应用程序开发蓝图,它详细描述 J2EE 平台,给出了关于如何开发 J2EE 应用程序的最佳实践信息。
  • 明确记录的 J2EE 模式(行业最佳实践),它描述对常见 J2EE 体系结构和设计问题的解决方案。

关于 J2EE 平台的更多信息,请参阅 http://java.sun.com/。 请单击 J2EE > Blueprints 的链接。

可伸缩性

J2EE 通过以下几种方式支持可伸缩性,以增强性能或满足增加的负载:

  • J2EE 容器内的性能增强特性 - 这样的特性包括资源池(数据库连接池、会话 bean 实例池和线程池)、异步消息传递和高效的组件生命周期管理。 例如,打开数据库连接很慢。 而且,由于(例如)许可证发放限制,数据库连接可能是稀缺资源。 J2EE 平台使用数据库连接池对之进行管理;J2EE 容器用于容纳由打开的连接组成的一个连接池,这些连接可以按照需要分配给组件,从而实现快速高效的连接。
  • 可以通过群集达到负载均衡 - 将相同的组件部署到不同机器上的多个服务器。 然后可以按照需要平衡每个服务器的负载,例如,根据循环(round-robin)算法或根据服务器负载。 J2EE 平台规范不要求 J2EE 服务器内具有负载均衡能力,但建议高端服务器应具有该能力。 J2EE 服务器供应商提供各种负载均衡解决方案。
  • 应用程序分区 - 应用程序在逻辑上不同的各部分可以部署到不同的服务器,例如,将在线 邮购应用程序的库存和记帐子系统部署到不同的服务器。

开发和部署工具

通过在 Java 集成开发环境(IDE)中为 J2EE 开发提供优秀的支持,供应商已响应了对 J2EE 工具的需要,这些支持包括:

  • servlet 创建向导
  • EJB 创建和维护向导与对话框
  • 部署描述符生成与维护
  • EJB 对象到数据库的映射(包括为容器管理的关系生成部署描述符信息)
  • 与 Web 容器集成以测试 Web Service
  • EJB 的无缝 IDE 内部署、调试和测试,通过与 J2EE EJB 容器及其部署工具集成
  • J2EE 测试客户机的自动生成
  • 与 UML 建模工具集成

后端集成

后端是指应用程序的企业信息系统(EIS)层。 例如,后端系统可以是 RDBMS、旧系统或企业资源规划系统(ERP)。

J2EE 支持使用 JDBC 和 JTA API 对 RDBMS EIS 进行事务访问。另外,EJB 容器支持容器管理的持久性,其中事务 RDBMS 连接和访问是由容器自动处理的。

J2EE 的连接器体系结构服务提供程序接口(SPI)为将非 RDBMS EIS 资源连接到 J2EE 容器定义了标准。特定于 EIS 的资源适配器(由 EIS 供应商提供)插入到 J2EE 容器,对容器进行扩展,以便为该 EIS 提供事务安全支持。 然后容器内的组件可以通过 J2EE 连接器体系结构 SPI 访问该 EIS。

注意:J2EE 的连接器体系结构 SPI 在 J2EE 1.3 之前不受支持。

安全性

J2EE 提供简单强大的安全性特性。J2EE 组件的安全性信息在它们的部署描述符中定义。 此信息定义对哪些安全性角色进行了授权,使其能访问特定 URL 和/或组件的方法。 安全性角色仅仅是一组用户的逻辑名称,例如:组织的管理团队成员都可以被指定名为“管理员”的角色。

由于安全性信息在部署描述符中声明,因此不需要代价高昂的代码更新-调试-测试周期就能更改安全行为。

多层体系结构

J2EE 是多层分发式应用程序体系结构,由客户机层中间层EIS 或后端层组成。

图 1 显示 J2EE 平台的多层体系结构,以及支持 J2EE 组件的各种不同的 J2EE 容器。

在附带文本中描述的图。

图 1:J2EE 多层体系结构

客户机层

客户机层组件运行在客户机容器中。客户机层能通过以下这些方式实现:

  • 独立 Java 应用程序 - 通常是 GUI(也称为“厚客户机”)。 此类 Java 应用程序必须安装在每台客户机上。 Java 应用程序可以通过 API(例如 JDBC)访问 EIS 层或中间层。
  • 静态 HTML 页 - 为应用程序提供有限的 GUI。
  • 动态 HTML - 由 JSP 页面servlet 生成。
  • Applet - 运行在 Web 浏览器中。Applet 嵌入到 HTML 页面中,通常用于提供 GUI。

中间层

中间层由 Web 层业务层组成。Web 层组件运行于提供 Web 容器的 J2EE Web 服务器中。业务层组件运行于提供 EJB 容器J2EE 应用程序服务器中。

Web 层

Web 层组件包括 servletJSP 页面,它们管理与客户机层的交互,使客户机与业务和 EIS 层隔离。 客户机对 Web 层发出请求,Web 层处理这些请求,并将结果返回给客户机。 客户机对 Web 层中组件的请求通常导致 Web 层向业务层中的组件发出请求,随后,可能会导致业务层向 EIS 层发出请求。

业务层

业务层组件是 EJB

  • 它们包含应用程序业务逻辑。
  • 它们根据业务逻辑向 EIS 层发出请求,通常是为响应来自 Web 层的请求。

EIS 层

EIS 层代表应用程序的已存储数据,通常以 RDBMS 的形式。EIS 层还可能由旧系统或 ERP 组成,通过 J2EE 连接器体系结构 API 访问。

关于 J2EE 连接器体系结构 API 的更多信息,请参阅 http://java.sun.com/。请单击 Products & Technologies > J2EE > J2EE Connector Architecture 的链接。

关于 J2EE 的标准部署配置的更多信息,请参阅概念:J2EE 部署配置

J2EE 服务器

J2EE 服务器是实现 J2EE 平台的商用产品。商用 J2EE 服务器的示例有 BEA WebLogic、Borland Enterprise Server、IBM WebSphere 和 iPlanet。

术语“J2EE 服务器”的使用在某种程度上显得很宽松。通常,其意思是“同时支持 Web 容器和 EJB 容器的 J2EE 服务器”。通过使用更严格的术语,J2EE Web 服务器(例如 J2EE 参考 Web 服务器实现 Tomcat)支持 Web 容器,J2EE 应用程序(或 EJB)服务器支持 EJB 容器。

J2EE 容器

J2EE 组件在 J2EE 容器中运行,或者受 J2EE 容器的主管,其中 J2EE 容器通常作为商用 J2EE 服务器的一部分提供。 除了支持标准 J2EE API,容器还向运行在容器中的 J2EE 组件提供运行时环境和一组标准的服务(API)

J2EE 定义以下几种类型的容器:

应用程序客户机容器

J2EE 应用程序客户机运行在应用程序客户机容器内,容器支持以下这些 J2EE API:JDBC、JMS、JAXP、JAAS、JavaMail、JAF、JSR、JAX-RPC、SAAJ、J2EE Management 和 JMX。

实际上,应用程序客户机容器由标准 J2SE 安装组成。应用程序客户机容器必须支持 JAAS 回调处理程序接口,以满足 Web 容器和 EJB 容器内剩余企业应用程序的安全性约束。

Applet 容器

applet 运行在 applet 容器中,该容器 支持 applet 编程模型并支持标准 J2SE API。实际上,applet 容器是作为 Java 插件提供给 Web 浏览器的。

Web 容器

Web 组件JSP 页面servlet)运行在 Web容器中,其中 Web 容器作为 J2EE 服务器的一部分或作为独立 J2EE Web 服务器提供。Web 容器支持以下 J2EE API 和包:JDBC、JMS、JAXP、JAX-RPC、JAXR、JAAS、Java Mail、JAF、J2EE 连接器体系结构、JTA、JSR、SAAJ、J2EE Management、Java Servlet 和 JSP。

EJB 容器

EJB 组件运行在 EJB 容器中,该容器作为 J2EE 服务器的一部分提供。

EJB 容器支持以下 J2EE API 和 技术:EJB、JDBC、JMS、JAXP、JAX-RPC、JAXR、JAAS、Java Mail、JAF、JTA、 JSR、SAAJ、J2EE Management 和 J2EE 连接器体系结构。

以下子节总结了受 EJB 容器支持的关键功能:

远程通信

EJB 容器向开发人员隐藏了远程通信的复杂性,做法是使用实现 EJB 接口的、容器提供的类(由容器工具在编译 EJB 时生成,并伴随供客户机使用的 RMI 桩模块类)。 这些实施类是客户机可以使用 Java RMI 进行访问的远程 Java 对象。 从客户机的角度,客户机只是调用对 EJB 接口的方法,而不考虑远程通信。

并行

EJB 容器透明地管理来自多个客户机的并发请求。客户机的行为就像它们对 EJB 具有互斥存取。例如,如果两个客户机 请求相同的实体 EJB,那么容器向每一个客户机提供它们自己的实例,并在客户机不知道的情况下内部地管理同步。

命名

EJB 容器提供 JNDI 名称空间以定位在容器中部署的 EJB。 EJB 客户机可以查找 EJB 来获取主界面。EJB 的主界面提供了查找和创建 EJB 实例的方法。 只要 JNDI 命名环境从客户机的位置可用,客户机就能访问 EJB。

持久性

EJB 开发人员对实体 EJB 持久数据的存储可以从两种方案中进行选择:容器管理的持久性(CMP)和 Bean 管理的持久性(BMP)。 CMP 将实现数据访问代码的职责委派给容器,而 BMP 则将实现该代码的职责留给 EJB 开发人员。 只需在部署描述符中声明容器管理的字段,CMP 就能允许 EJB 开发人员使用标准实现以访问持久存储器。

事务管理

事务是以原子方式成功或失败的操作序列 - 因此如果该序列中的任何操作失败,均不会改变系统状态。 例如,假设您想要发放飞机票:您将验证客户的信用卡帐户、借记该帐户,然后发放机票。 这一操作序列应发生在单个事务中,以便如果任何操作失败,就不会更改客户的信用卡帐户,且不会发放机票。

EJB 可以使用 bean 管理的事务定界容器管理的事务定界,将在以下两个标题下进行描述。

Bean 管理的事务定界

在 bean 管理的事务定界中,您使用简单的 API 确定事务边界。 这是 Java Transaction API(JTA),您用它来程序地控制事务定界,例如,通过调用 JTA UserTransaction 接口的 begin()commit()rollback() 方法。 开发人员负责对事务异常条件的回滚逻辑进行编码,因为容器不自动处理该工作。

注意:实体 EJB 不能使用 bean 管理的事务定界 - 它们只能使用容器管理的事务定界。

容器管理的事务定界

在容器管理的事务定界中,您不提供用于开始和结束事务的代码。 而是在 EJB 部署描述符中,为 EJB 的每个方法提供事务属性信息。 事务属性(Required、RequiresNew、NotSupported、Supports、Mandatory 或 Never 之一)告诉容器什么事务范围用于该方法。例如,如果某个客户机在事务中运行,且它调用事务属性设置为“Required”的 EJB 的方法,然后 该方法将在现有事务范围内被调用。

只要有可能,请使用容器管理的事务定界,而非 bean 管理的事务定界,这样您就无需添加、调试和测试组件中的事务定界代码。 部署时在部署描述符中指定每个 EJB 方法的事务行为。 这意味着无需代价高昂的代码更新-调试-测试周期,就能更改事务行为。

分发式事务

分发式事务是必须跨多个数据库和/或多个应用程序进行协调的事务。 这和集中式事务形成对比,例如将事务提交给单个数据库的单个 J2EE 应用程序服务器。

在分发式事务中,两阶段落实是必须的,例如有多个数据库正在更新的场合。 一些 EJB 容器(例如 BEA WebLogic Server 6.0)使用 Open Group 的 XA 协议为两阶段落实提供支持。 应用程序员不需要编写任何处理两阶段落实的代码,由 EJB 容器来管理它。

安全管理

EJB 安全性由 EJB 容器通过使用部署描述符中的安全性信息进行处理。 在部署描述符中,您声明一组角色,并且对于每个 EJB 方法,您声明有权调用该方法的角色。

运行时,向 EJB 的每个客户机分配一个角色,EJB 容器通过检查客户机角色是否得到调用该方法的授权,来管理对 EJB 的方法的访问。

由于安全性信息在部署描述符中声明,因此不需要代价高昂的代码更新-调试-测试周期就能更改安全行为。

生命周期管理

EJB 在其生命周期内经过一系列状态,以响应客户机请求。 EJB 容器负责管理此生命周期。

在容器启动时,容器在资源池中创建 EJB 实例池(以在需要 EJB 资源的时候可以节省启动时间)。 当 EJB 客户机请求创建 EJB 时,从该池中分配一个实例。客户机现在可以对 EJB 发出请求。 当 EJB 客户机请求除去 EJB 时,该实例返回到池中。

容器向 EJB 实例通知 EJB 生命周期中各个事件,方法是使用一组标准的回调方法,例如:

  • ejbCreate() - 由容器在 EJB 实例创建之后调用
  • ejbRemove() - 由容器在 EJB 实例即将删除时调用
  • ejbActivate() - 由容器在 EJB 实例已从被动状态恢复之后调用
  • ejbPassivate() - 由容器在 EJB 实例即将钝化时调用
  • ejbStore() - 由容器在 EJB 实例就要被写到数据库时调用
  • ejbLoad() - 由容器在从数据库装入了 EJB 实例字段之后调用

尽管回调方法的 EJB 的实现常常为空,但每个 EJB 对于实现这些回调是必需的。 例如,容器调用 EJB 的 ejbRemove() 方法,以通知 EJB 即将要除去该 EJB(已经有要除去 EJB 的客户机请求)。 在 EJB 的 ejbRemove() 方法中,您将首先对所有必要操作进行编码,然后才能除去 EJB,例如通过释放由 EJB 持有的所有资源。

EJB 可以按照需要由容器进行钝化(即保存状态信息且释放 EJB 实例,以供资源池使用)。 如果接收到对特定 EJB 对象的客户机请求,那么容器会激活该钝化的 EJB(即恢复状态信息)。

数据库连接池

打开数据库连接的速度很慢。而且,由于(例如)许可证发放限制,数据库连接可能是稀缺资源。 EJB 容器通过数据库连接池管理此开销 - 容器保存一池打开的连接,这些连接可以按照需要分配到 EJB 和从 EJB 取消分配,从而导致快速高效的连接。

对于使用 CMP 的实体 EJB,数据库连接是自动处理的。不需要编写任何连接或 SQL 代码 - 您只要在 EJB 部署描述符中指定 JDBC 数据源的 JNDI 名称,并使用特定于容器的部署工具来为您生成连接例程。 容器管理数据库连接池。

对于使用 BMP 的实体 EJB 或对于会话 EJB,您需要编写连接代码以连接到 JDBC 数据源,并编写 SQL 代码以访问数据库。JDBC 数据源仍由容器管理 - JDBC 数据源实际使用由容器维护的数据库连接池。

消息传递

EJB 容器对于提供消息传递支持以进行消息的异步交换是必需的。 JMS 或其他消息传递类型可以由消息驱动的 EJB 流程传递的消息使用。 由于 JMS 涉及 EJB,它们必须支持来自 Web 和 EJB 容器组件(例如 servlet、JSP 页面和 EJB)的事务访问。

J2EE 组件

以下部分给出了所有类型的 J2EE 组件的简要讨论。 J2EE 组件包括 applet应用程序客户机Web 组件Enterprise JavaBeans。J2EE 组件运行在 J2EE 容器中。

Applet

Applet 是可随 Web 页面发送并在 Web 浏览器中执行的小程序。 它们还能在其他支持 applet 编程模型的环境中执行。

Applet 主要用于实现用户接口,并能大大扩展 HTML 页面的能力。

应用程序客户机

应用程序客户机是 Java 应用程序。它们可以访问 J2EE 中间层和 EIS 层的工具。 它们通常是提供用户界面的桌面应用程序。 它们可以用于实施“厚客户机”,如概念:分发模式中所述。

Web 组件

Java Servlet

Java Servlet 技术使得 Web 服务器能处理来自 Web 客户机的请求,并提供包含动态内容的响应。 Java servlet 可以与其他 Web 组件和 EJB 组件交互,以生成此动态内容。 所生成内容的格式可以是任何基于文本的文档,包括 HTML 和 XML。Java Servlet 还可以与 JAX-RPC API 协作,用作 Web Service 端点。

注意:Servlet 作为 Web Service 端点的用法是 J2EE 1.4(JAX-RPC 1.1)的新功能,因此在先前版本上不受支持。

关于 J2EE servlet 的更多信息,请参阅 http://java.sun.com/。 请单击 J2EE > Blueprints 的链接。

JavaServer Page

JavaServer Page(JSP)技术基于 Java Servlet,但它是基于文本的而非基于代码的。 JSP 页面像 servlet 那样处理请求和生成响应,但其逻辑主要是表示驱动的。 JSP 页面主要包含静态 HTML,后者定义从其他源(例如 JavaBeans 和 EJB)获取的数据表示的格式。 Web 组件开发人员可以创建定制标记库,以扩展 JSP 来添加新的能力。

关于 JSP 的更多信息,请参阅 http://java.sun.com/。请单击 J2EE > Blueprints 的链接。

HTML 页面

HTML 页面可用来支持用户界面。它们可以定义为静态 Web 页面,或者可以由 servlet 和 JSP 页面生成。J2EE 规范要求 J2EE Web 客户机支持 HTML 页面的显示。

JavaBeans

JavaBeans API 定义了一个用于创建简单可重用组件的体系结构。这些组件可以通过使用应用程序构建器工具进行编辑和组装。常规 Java 代码用来实现 JavaBeans,因此实现保持为对其他可能使用这些组件的程序员可读,以及对工具可读。

JavaBeans 不是 J2EE 技术,而是被 J2EE 技术所用。例如,EJB 可以使用 JavaBeans 作为值对象。 关于 JavaBeans 和 Enterprise JavaBeans 之间的差别,请参阅标题为比较 JavaBeans 和 EJB 的部分。

关于 JavaBeans 的更多信息,请参阅概念:JavaBeans

Enterprise JavaBeans

Enterprise JavaBeans 规范规定了用于开发和部署基于组件的、事务分发式业务应用程序的体系结构。

由 EJB 规范定义的组件称为 Enterprise JavaBeans(EJB)。 EJB 是服务器端的 Java 组件,其中您实现应用程序的业务规则。

EJB 部署到称为 EJB 容器的环境中并在其中运行,这先前已在标题 EJB 容器下描述,该容器提供诸如事务管理数据库连接安全性之类的服务。通过隐蔽这样的复杂性,EJB 体系结构可使得组件开发人员专注于业务逻辑。

Enterprise JavaBean(EJB)是 Java 接口、EJB 实施类和 XML 部署描述符的协作。 EJB 接口和实施类必须遵守 EJB 规范定义的规则,例如实现某些接口和提供某些回调方法。

EJB 接口包括提供查找和创建 EJB 实例的主接口,以及为特定的 EJB 实例提供业务方法的组件接口。 这些可以是远程接口,这意味着能在整个网络上调用它们,也可以是本地接口,这意味着调用者必须位于相同的进程中(或者更准确地说,在同一台 Java 虚拟机中)。EJB 接口由 EJB 容器类实现,该容器类将方法委托给 EJB 实施类。 容器管理的实体 EJB 的 finder 方法是一个例外,它由容器类处理。

有三类 EJB:会话 bean实体 bean消息驱动 bean

关于 EJB 的更多信息,请参阅 http://java.sun.com/。请单击 J2EE > Blueprints 的链接。

会话 bean

会话 bean 组件提供实现特定于客户机的业务逻辑的服务。 单个客户机可以通过本地或远程接口访问每个会话 bean 实例。 会话 bean 可以将数据保存到数据库中,但通常要求代表业务对象的实体 bean 保存数据。 会话 bean 实例可以维持瞬态会话式状态。

会话 bean 可以有一个 getAllCustomers() 方法,该方法返回数据库中所有客户的集合。 此 bean 将从 Customer 实体 bean 获取信息,并将结果交付给客户机。

无状态会话 bean 可以用作 Web Service 端点,如在 JSR 和 EJB 规范中所定义。

注意:无状态会话 bean 作为 Web Service 的用法是 J2EE 1.4(JSR 109 和 EJB 2.1)的新功能,因此在先前版本上不受支持。

关于会话 bean 的更多信息,请参阅 Enterprise JavaBeans Specification V2.1,位于 http://java.sun.com/。请单击 Products & Technologies > J2EE > Enterprise JavaBeans 的链接。

实体 bean

实体 bean 组件提供实现特定于业务对象的逻辑的服务。 多个客户机可以通过本地或远程接口同时访问一个实体 bean 实例。 实体 bean 将业务对象数据保存到数据库中,且持久的数据可以在容器或客户机崩溃的情况下存活下来。

实体 bean 可以代表客户,该客户可以作为一行存储在关系数据库的客户表中。 EJB 开发人员选择持久性方法,在这种情况下是关系数据库。

有两类实体 bean 持久性:bean 管理的持久性(BMP)和容器管理的持久性(CMP)。 BMP 实体 bean 必须实现数据访问代码,而 CMP 实体 bean 由容器实现此能力。 通常为关系数据库持久性提供 CMP 容器实现,尽管其他类型的持久性(对象数据库、基于文件的持久性等等)也是可能的。

关于实体 bean 的更多信息,请参阅 Enterprise JavaBeans Specification V2.1,位于 http://java.sun.com/。请单击 Products & Technologies > J2EE > Enterprise JavaBeans 的链接。

消息驱动 Bean

消息驱动 bean 组件提供实现特定于消息处理的业务逻辑的服务。 只有容器可以调用此服务,客户机不能通过远程或本地接口直接调用此服务。 而是当消息到达由 bean 提供服务的目标或端点时,容器调用作为 MessageListener 分配给目标的消息驱动 bean 的实例。 消息驱动 bean 实例不维护会话式状态,但能在方法调用之间维护实例变量与资源引用(例如,数据库连接)。

注意:消息驱动 bean 在 EJB 2.0 以前的版本上不受支持。 对不同于 JMS 的消息传递类型的支持是 EJB 2.1 规范的新特性,因此在先前版本中不受支持。

关于消息驱动 bean 的更多信息,请参阅 Enterprise JavaBeans Specification V2.0,位于 http://java.sun.com/。请单击 Products & Technologies > J2EE > Enterprise JavaBeans 的链接。

比较 JavaBeans 和 EJB

尽管在名称上类似,但 EJB 要比常规 JavaBeans 复杂得多。两者都定义可重用组件的体系结构,但 EJB 添加了必需的对创建分发式多层服务的支持。 两类组件均可使用应用程序构建器工具进行组装,但 EJB 需要 部署到 EJB 容器才能执行。

针对 J2EE 组件的服务(API)

J2EE 容器支持所有 J2SE 标准 API,以及依赖于容器类型的 J2EE API 子集。容器内的组件可以访问此可用的子集。 下表为每个 API 提供了简要描述,并在可用的场合列出了 J2EE 容器。

名称
描述
J2EE 容器,
其中 API 可用

EJB 2.1

EJB 规范为 EJB 定义组件模型 - 自动支持诸如远程通信、事务管理、安全性和持久性之类的服务的业务层组件。

关于 EJB 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > Enterprise JavaBeans 链接。

  • EJB
  • 应用程序客户机*
  • Web*

* 仅对客户机 API

JAAS

Java 认证和授权服务(JAAS)为用户的认证和授权提供服务,以确保他们具有执行操作的许可权。

关于 JAAS 的更多信息,请访问 http://java.sun.com/ 并单击 Products & Technologies > J2SE > Core Java > Java Authentication and Authorization Service (JAAS) 链接。

  • 应用程序客户机
  • Web
  • EJB

JAF 1.0

JavaBeans 激活框架(JAF) 提供服务来识别数据,并实例化 JavaBean 来操纵该数据。

关于 JAF 的更多信息,请访问 http://java.sun.com/ 并单击 Products & Technologies > J2SE > Desktop Java > JavaBeans > JavaBeans Activation Framework 链接。

  • 应用程序客户机
  • Web
  • EJB

JAXP 1.2

Java API for XML Processing(JAXP)为 XML 文档处理提供了一个抽象接口,可与使用 DOM SAX 或 XSLT 的兼容分析器和转换程序一起使用。

关于 JAXP 的更多信息,请访问 http://java.sun.com/ 并单击 Products & Technologies > J2EE > Java API for XML Processing (JAXP) 链接。

  • 应用程序客户机
  • Web
  • EJB

JAX-RPC 1.1

JAX-RPC 规范定义用于访问 Web Service 的客户机 API,以及用于实施 Web Service 端点的技术。

有关 JAX-RPC 的更多信息,请访问 JAX-RPC/font>

  • 应用程序客户机
  • Web
  • EJB

Web Services for J2EE 1.1

Web Services for J2EE 规范(JSR-109)定义 J2EE 应用程序
服务器为部署 Web Service 端点而必须支持的能力。

关于 Web Services for J2EE 的更多信息,请访问 http://jcp.org/aboutJava/communityprocess/final/jsr109/index.html

  • 应用程序客户机
  • Web
  • EJB

SAAJ 1.2

SSAJ API 提供 操纵 SOAP 消息的能力。.

关于 JAXP 的更多信息,请访问 http://java.sun.com/ 并单击 Products & Technologies > J2EE > SOAP with Attachments API for Java (SAAJ) 链接。

  • 应用程序客户机
  • Web
  • EJB

JAXR 1.0

JAXR 规范为到基于 XML 的注册表(例如 WebXML 注册表和 UDDI 注册表)的客户机访问定义 API。

关于 JAXP 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > Java API for XML Registries (JAXR) 链接。

  • 应用程序客户机
  • Web
  • EJB

JavaMail 1.3

JavaMail API 提供一个框架,该框架可以扩展以构建基于 Java 的邮件应用程序。

关于 JavaMail 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > JavaMail 链接。

  • 应用程序客户机
  • Web
  • EJB

JDBC 3.0

Java 数据库连接(JDBC)是用于访问表格式数据源(例如 SQL 数据库、电子表格和平面文件)的 API。

关于 JDBC 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > JDBC 链接。

  • 应用程序客户机
  • Web
  • EJB

JMS 1.1

Java 消息服务(JMS)提供异步消息传递服务,以用于数据的传送和事件的通知。 通过 JMS,可以使用消息驱动的 EJB 来异步地处理传递到 JMS 主题和队列的消息。

关于 JMS 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > Java Message Service 链接。

  • 应用程序客户机
  • Web
  • EJB

JNDI

Java 命名和目录接口规范(JNDI)提供命名和目录服务,以注册和查找分发式组件和资源。 客户机只需要知道组件或资源的注册 JNDI 名称,不需要知道它们实际的网络位置。

示例:EJB 在部署时使用部署描述符 ejb-name 字段注册在企业目录中。J2EE 客户机使用 JNDI 查找来查找 EJB - 客户机只需知道 EJB 注册在目录中的名字。 JNDI 查找返回一个对 EJB 的主对象的引用。

关于 JNDI 的更多信息,请访问 http://java.sun.com/ 并单击 Products & Technologies > J2SE > Core Java > Java Naming and Directory Interface (JNDI) 链接。

  • 应用程序客户机
  • Web
  • EJB

JTA 1.0

Java 事务 API(JTA)定义在事务管理器、资源管理器、应用程序服务器和应用程序之间管理分发式事务服务的接口。

关于 JTA 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > Transactions 链接。

  • Web
  • EJB

J2EE Connector 1.5

J2EE 连接器体系结构服务提供者接口(SPI)为将 EIS 资源连接到 J2EE 容器定义了标准 - 特定于 EIS 的资源适配器(由 EIS 供应商提供)插入到 J2EE 容器,对容器进行扩展,以便为该 EIS 提供事务安全支持。 然后容器内的组件可以通过 J2EE 连接器体系结构 SPI 访问该 EIS。

关于 J2EE 连接器的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > J2EE Connector Architecture 链接。

  • Web
  • EJB

JSP 2.0

JavaServer Page 技术向 Web 开发人员提供创建和维护动态 Web 页面的能力。 JSP 页面是基于文本的,并使用类似于 XML 的标记执行业务逻辑并生成定制内容。 JSP 技术允许业务逻辑委派给其他组件,以便只有表示逻辑需要嵌入到 JSP 页面中。

关于 JSP 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > JavaServer Pages 链接。

Web

Servlet 2.4

Java Servlets 扩展了 Web 服务器的能力来帮助构建基于 Web 的应用程序。 Servlet 常常用于交互的 Web 应用程序中,其中 Web 服务器通过从现有业务系统中获取的动态生成的内容来响应用户请求。

关于 Java Servlet 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > Java Servlet 链接。

Web

RMI-IIOP

运行于因特网 ORB 间协议(RMI-IIOP)之上的远程方法调用技术允许 Java 组件与旧 CORBA 组件(这些组件是用诸如 C++ 或 Smalltalk 之类的其他语言所编写的)通信。

关于 RMI-IIOP 的更多信息,请访问 http://java.sun.com/ 并单击 Products and APIs > RMI-IIOP 链接。

  • 应用程序客户机
  • Web
  • EJB

J2EE Management 1.0

J2EE 管理 API 向管理工具提供 API 以查询 J2EE
应用程序服务器,从而确定其当前状态、已部署的应用程序等等。

关于 RMI-IIOP 的更多信息,请访问 http://java.sun.com/ 并单击 Products & Technologies > J2EE > J2EE Management Specification 链接。

  • 应用程序客户机
  • Web
  • EJB

JMX 1.2

J2EE 管理 API 使用 JMX API 来为 J2EE 产品的管理提供一些必需的支持。

关于 RMI-IIOP 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2SE > Core Java > Java Management Extensions (JMX) 链接。

  • 应用程序客户机
  • Web
  • EJB

J2EE Deployment 1.1

J2EE 部署 API 定义部署工具的运行时环境和由 J2EE 应用程序服务器提供的插件组件
之间的接口。

关于 J2EE Deployment 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > J2EE Deployment Specification 链接。

JACC 1.0

JACC 规范定义 J2EE 应用程序服务器和授权策略供应者之间
的约定。

关于 JACC 的更多信息,请访问 http://java.sun.com/,并单击 Products & Technologies > J2EE > Java Authorization Contract for Containers 链接。

  • 应用程序客户机
  • Web
  • EJB

组合件和部署

J2EE 应用程序由应用程序部署描述符(application.xml)以及一个或多个组成应用程序的 J2EE 模块组成。模块是可重用、可移植的组件。 J2EE 应用程序封装在 .ear 归档中。

部署描述符

部署描述符是用在 J2EE 应用程序和 J2EE 模块中的 XML 文件。它们提供 J2EE 服务器在部署时读取的配置信息。 此配置信息允许服务器以公开声明方式定制 J2EE 应用程序或模块,而不更改源代码或类。

对于每个 J2EE 应用程序或模块,都有一个类属部署描述符类型。 类属部署描述符(例如 EJB 模块的 ejb-jar.xml),定义适用于 EJB 的信息,而与部署它的服务器无关。 特定于服务器的部署描述符指定只对于特定服务器有意义的信息。 特定于服务器的部署描述符具有反映它们所表示的服务器的名称。

J2EE 模块

J2EE 模块由模块的部署描述符以及组成该模块的众多元素组成,包括:

  • 部署在 Web 服务器的非 Java 元素(JSP 页面、图像文件、静态 HTML 页面),换言之,即虚拟目录元素
  • 部署在 Web 服务器上的 Java 元素(servlet、JavaBeans、Java 类)
  • 部署在 EJB 服务器上的元素(EJB 和支持的 Java 类)

有三种 J2EE 模块:

J2EE 应用程序客户机

J2EE 应用程序客户机模块封装在 .jar 归档中,并包含:

  • application-client.xml 部署描述符
  • 应用程序客户机实现 .class 文件
Web 组件

Web 组件模块封装在 .war 归档中,并包含:

  • web.xml 部署描述符和特定于服务器的部署描述符
  • JSP 页面
  • HTML 页面
  • 图像(例如 .gif 和 .jpg)
  • Servlet 类文件

如果模块是 Web Service,则 .war 归档包含:

  • webservices.xml 部署描述符
  • Servlet 类文件
  • WSDL 文件
Enterprise JavaBean

单个 Enterprise JavaBean JAR 归档可能包含许多 EJB,但它们的部署信息存储在一组部署描述符中(ejb-jar.xml 加上所有特定于服务器的部署描述符)。

标准 Enterprise JavaBean 模块包含:

  • ejb-jar.xml 和特定于服务器的部署描述符
  • EJB 实施类文件

Web Service Enterprise JavaBean 模块包含:

  • webservices.xml 部署描述符
  • EJB 实施类文件

关于 J2EE 封装和部署的更多信息,请参阅 http://java.sun.com/。单击 Docs & Training > J2EE Platform, Enterprise Edition > Java Blueprints Program 链接。

J2EE 应用程序开发

J2EE 应用程序开发流程定义了几个角色和阶段。以下部分定义由 J2EE 规范提供的开发角色以及这些角色参与的开发阶段

J2EE 应用程序开发角色

应用程序开发角色在此表中进行了总结。

角色名称 描述

J2EE 产品供应者

J2EE 产品供应者是 J2EE 平台实现(也称为 J2EE 产品)的供应商。 J2EE 产品供应者包括 BEA、IBM 和 Sun。 这些组织通常致力于交付 J2EE 平台的实现。 例如,BEA 实现构建在 BEA 的高度成功的 Tuxedo 事务处理监视器基础之上。 J2EE 产品供应者还提供对于支持应用程序部署和管理所必需的工具。

应用程序组件供应者

应用程序组件供应者实际包括多个角色,例如 EJB 开发人员和 HTML 文档设计员。这些角色负责使用提供的工具生成 J2EE 应用程序组件。

应用程序汇编员

应用程序汇编员使用提供的工具从 J2EE 应用程序组件创建 J2EE 应用程序。 J2EE 应用程序作为企业归档(EAR)文件交付。应用程序汇编员还描述 J2EE 应用程序的所有外部依赖关系。 部署员在实际部署 J2EE 应用程序时解析这些依赖关系。

部署员

部署员负责将 J2EE 应用程序以及组成应用程序的应用程序组件部署到操作环境中。 部署的第一阶段是在相关的 J2EE 容器内安装各种不同的应用程序组件。 部署的第二阶段是配置所有已声明的外部依赖关系,以便它们能得到解析。 例如,已定义的安全性角色映射到操作环境中的用户组和帐户。 部署的第三阶段是执行新的应用程序,以便可以开始接收请求。

系统管理员

系统管理员负责运行时基础结构,包括所有部署的 J2EE 应用程序。 此角色使用由 J2EE 产品供应者提供的适当工具来完成此任务。

工具供应者

工具供应者提供支持应用程序组件的开发和封装的工具。 这些工具通常对应于生成的不同类型的应用程序组件,并包括诸如 IBM VisualAge for Java 以及 Borland JBuilder 之类的 IDE。

系统组件供应者

系统组件供应者提供不同的系统级别组件,例如资源适配器或权限策略提供程序。


这些角色不是互斥的,一个人可以担当多个角色,尤其是在小型开发团队中或构造原型的情况下。

J2EE 应用程序开发阶段

此部分描述了 J2EE 应用程序开发的不同阶段,如 J2EE 规范中所规定。 这些开发阶段为:

  • 组件开发
  • J2EE 应用程序必须包含至少一个 J2EE 模块,因此至少需要一个组件开发阶段。 最后两个阶段总是必要的,因为所有 J2EE 应用程序必须进行组装和部署。

    下表总结了 J2EE 应用程序的开发阶段。

    J2EE 开发阶段 任务 由 J2EE 角色执行 结果(可交付件)

    J2EE 应用程序客户机创建

    • 编写客户机代码并编译类
    • 创建 application-client.xml 部署描述符
    • 创建包含 Class 文件和 XML 文件的 JAR 文件归档

    应用程序组件供应者(软件开发人员)

    包含 J2EE 应用程序客户机的 JAR 文件

    Web 组件创建

    • 编写 servlet 代码并编译类
    • 编写 JSP 和 HTML 页面
    • 创建 web.xml 部署描述符
    • 创建包含类、.jsp、.html 和 XML 文件的 Web 应用程序归档(WAR)文件归档

    应用程序组件供应者(软件开发人员:servlet;Web 设计人员:JSP 页面、HTML 页面)

    包含 Web 组件的 WAR 文件

    Enterprise JavaBean 创建

    • 编写 EJB 代码并编译类
    • 创建 ejb-jar.xml 和特定于服务器的部署描述符
    • 创建包含 Class 和 XML 文件的 JAR 文件归档

    应用程序组件供应者(软件开发人员)

    包含 Enterprise JavaBean 的 JAR 文件

    J2EE 应用程序组装

    • 创建 application.xml 部署描述符
    • 创建包含 EJB(JAR)、Web 组件(WAR)和 XML 文件的 EAR 文件归档

    应用程序汇编员

    包含 J2EE 应用程序的 EAR 文件

    J2EE 应用程序部署

    • 将 J2EE 应用程序(EAR)添加到 J2EE 服务器环境
    • 使用本地环境配置编辑 application.xml 部署描述符
    • 将 J2EE 应用程序部署到 J2EE 服务器

    部署员

    已安装和配置的 J2EE 应用程序


    开发流程的每个阶段均生成可交付件,它会用于下一阶段。 在“组件开发”阶段创建的组件用在“J2EE 应用程序组装”阶段,以生成 J2EE 应用程序 EAR 归档。 在“J2EE 应用程序部署”阶段,会将 EAR 归档部署到 J2EE 服务器。

    每个阶段的可交付件是可移植的,不需要由相同的人来执行,甚至也不需要在相同的环境中执行,只要环境满足 J2EE 平台需求。

    关于 J2EE 封装和部署的更多信息,请参阅 http://java.sun.com/。请单击 J2EE > Blueprints 的链接。

    更多信息

    关于 J2EE 的附加信息可以在 Sun J2EE Blueprints 中找到。可以在以下地址访问到它:http://java.sun.com/。请单击 J2EE > Blueprints > Guidelines: Designing Enterprise Applications with the J2EE Platform, Second Edition 链接。

    此文档的副本还包含在 Rational Unified Process 中。

    Sun J2EE Blueprints 中关于特定主题的信息的章节在此表中总结。

    J2EE 概念 J2EE Blueprints 章节

    J2EE 平台技术

    第 2 章

    Enterprise JavaBeans

    第 5 章

    事务

    第 8 章

    安全性

    第 9 章

    Servlet

    第 4 章

    JavaServer Page

    第 4 章

    部署和封装

    第 7 章