第 2 章 Enterprise JavaBeans
2.2 EJB 体系结构(一)
第 2 章 Enterprise JavaBeans
注意 EJB 的客户并不直接访问 EJB 而是通过 Remote 接口来访问的 2.1.3 EJB 技术的未来
Sun 公司公布的 EJB1.0 规范是 EJB 规范的第一个版本 随着 J2EE 技术的发展以及建 立企业电子商务应用系统的迫切需求 EJB 技术还会进一步的完善与发展 EJB1.0 只规定 必须支持Session EJB EJB 2.0 规范中 Entity EJB 也必须支持 目前 很多厂商都宣布支 持EJB1.0 /EJB 1.1 规范 并同时提供了对 Session EJB/Entity EJB 的支持 如 IBM 的 San Francisco Project BEA 公司更是一马当先 推出的 WebLogic 6.0 Web 服务器系统是世界上 第一个宣布支持EJB 2.0 规范的运行平台 其实这就是一个 EJB Server/Container 目前 进程管理 线程池 并发控制和资源管理等功能未包含在 EJB 1.0 规范中 因此 对这些 服务的支持程度 也就决定了不同厂商的EJB 产品的差别与不同 大多数厂商都是将自己 原来的中间层解决方案移植到EJB Container 中 .EJB 技术的发展方向是要支持多种中间层 环境 包括
CORBA 平台 比较典型的如 Borland 公司的 VisiBroker for Java
DBMS(数据库管理系统) 如 Informix Oracle Sybase 等数据库服务器
Web 服务器 如 BEA WebLogic Netscape iPlanet Web Server Oracle Application Server 等 关于市场上流行的支持EJB 组件模型的开发工具和服务器的列表 请参考本书附录一
从企业应用多层结构的角度 EJB 是商业逻辑层的构件技术 与 JavaBean 不同 他提 供了事务处理的能力 自从三层结构提出 中间层 也就是商业逻辑层 是处理事务的核 心 由于从数据存储层分离 它就取代了存储进程的大部分地位 从分布式计算的角度 EJB 像 CORBA 一样 提供了分布式技术的基础 以及对象之间的通讯手段 从 Internet 技术应用的角度 EJB 和 Servlet JSP 一起成为新一代应用服务器的技术标准 EJB 中的 Bean 可以分为会话 Bean 和实体 Bean 前者维护会话 后者处理事务 现在 Servlet 程序 负责与客户端通信 访问EJB 并把结果通过 JSP 产生页面传回客户端 成为开发的新潮 流 从发展的角度看 EJB 完全有可能成为面向对象数据库的新平台 构成企业计算的基 础
总而言之 在日新月异的技术发展和更新中 EJB 甚至 EJB 技术的后继者 将在 J2EE 技术的大旗下不断攻城略地 占领企业计算的大好江山 在下一节 我们将详细介绍 EJB 组件模型的结构
2.2 EJB 体系结构(一)
2.2.1 EJB 组件如何工作
通过上面的介绍 我们对EJB 的组件模型应该有了初步的了解 但这是十分肤浅的 如果想凭这一点知识去开发EJB 应用系统 那无疑是天方夜谭 下面我们首先简要地介绍 一下EJB 组件模型的运行原理 然后再结合运行原理详细介绍 EJB 组件模型 请看图 2.1
第一部分 JSP 技术与 J2EE 技术
图2.1 EJB 应用系统运行原理
图2.1 是一个最最简单的 EJB 应用系统的运行原理图 不会吧 这还是最简单的系统?
是的 这确实是最简单的EJB 应用系统 实际上的 EJB 应用系统要比它还要复杂很多倍 不过读者也不用害怕 EJB 系统刚开始学的时候觉得很复杂 很难 毫无头绪 但是随着 学习的深入与开发经验的增加 你就会觉得EJB 技术原来也是那么简单
闲话少说 现在我们转入正题 图 2.1 明显地可以分为三个层次 从左到右看 第一 层包括Client 和 Web Server 其实这一层可以再分为两层 分别是 Client 层与 Server 层 但是为了简化系统结构起见 我们还是把它们归为一层 Client 端向 Server 端发送请求 Server 端响应 Client 端的请求 这就是普通的 C/S 模式 Server 可以直接反馈信息到客户 端 而不经过任何其他的中间件 但是Server 端也可以把客户端的请求发送到某个特定的 应用系统中 由应用系统对这个请求进行处理 然后再把结果返回Server 端 Server 端再 把结果返回Client 端 这样做的好处是 Server 端可以专注于响应客户端的请求 而把繁重 的计算工作分发到其它的应用系统中进行处理 Server 端只是起了一个信息流交换媒介的 作用 这样的处理模式在大流量 重负荷状态下运行具有明显的优越性 实际上 应用系 统还可以把客户端的请求按照其性质再次分发到下一级的应用系统中进行处理 这样就可 以构造一个高效的树状计算阵列 对输入信息流进行接受 过滤 分发 处理 反馈等操 作 EJB 组件就是这种类型的应用系统
图 2.1 中的第二层是所谓的应用系统层 EJB 服务就主要驻留在这一层 这一层可以 是任何可用的中间件解决方案 这与系统平台有很大的关系 但是本章的主题是EJB 技术 所以我们就假定第二层完全是由EJB 组件构成的 下面的讨论也都是以这个假定为出发点 第二层由下面的部分组成 EJB Server EJB Container Remote Interface Home Interface EJB Object 等 应用系统层是如何工作的呢?Web Server 把客户端的请求分发到应用系统层 首要的目标是找到提供特定服务的 EJB 组件 Web Server 透过 EJB Server 层 与 EJB Container 通信 查找并且定位 Home 对象 Home 对象是 EJB 对象与客户端应用程序(这里 的客户端是相对而言的 因为第一层相对于第二层就是客户端了 第二层的应用系统相对
第 2 章 Enterprise JavaBeans
于第三层也是客户端了)之间通信的接口 当找到特定的 Home 对象时 我们就可以利用这 个对象 创建一个Remote 对象 这个 Remote 对象封装了 EJB 对象的所有功能 在应用程 序中调用Remote 对象的方法 实际上就是调用 EJB 对象的方法 在这个 EJB 对象的方法 中 还可以调用另一个EJB 对象的方法 第二个 EJB 对象可能存在另一个 EJB Container(同 一个EJB Server)中 甚至还有可能存在于另一个 EJB Server 的 EJB Container 中 不过这两 个EJB 对象是否存在于同一个 EJB Server 中并非问题的关键 关键之处在于第一个 EJB 对 象也成了第二个EJB 对象的客户端程序了 第一个 EJB 对象的还可以调用另外的应用系统 来完成特定的任务 例如CORBA DBMS 系统 这些另外的应用系统就构成了图 2.1 中的 第三层(包含 EJB Database Other Enterprise System)
我们特别需要注意的是 在第一层运行的应用程序通过调用第二层的 Home 对象的 create()方法创建 Remote 对象 并调用 Remote 对象的方法 从应用程序的代码上看 似乎 Remote 对象是驻留在第一层的服务器的内存空间中 但事实上却并非如此 Remote 对象 驻留并运行于第二层EJB Server 的内存空间中 它把执行的结果直接返回第一层的应用程 序 不需要再通过 Home 对象了 第一层的应用程序应该分析执行的结果 并把数据送到 客户端(这才是真正的客户端 不提供任何服务 只享受服务)的浏览器中
本章的任务 就是向读者介绍如何使用EJB 技术构造服务端的第二层 应用系统层 下面我们就来仔细分析一下EJB 组件模型的具体细节
2.2.2 EJB Server
EJB 服务器(EJB Server)是管理 EJB 容器(EJB Container)的高端进程或应用程序 并提 供对系统服务的访问 EJB 服务器也可以提供厂商自己的特性 如优化的数据库访问接口 对其他服务 如CORBA 服务 的访问 对 SSL3.0 的支持等 一个 EJB 服务器必须提供对 JNDI 命名和目录服务和事务服务的支持 一些可能的 EJB 服务器的例子如
z 数据库服务器 典型的例子如Oracle 8i/9i 数据库服务器
z Web 服务器 典型的例子如 BEA 的 WebLogic Web 服务器 IBM 公司的 WebSphere 服务器
z 中间件服务器 如Borland 公司的 Smart Agent 2.2.3 EJB Container
EJB 容器(EJB Container)是一个管理一个或多个 EJB 类/实例的平台 它通过在规范中 定义的接口使EJB 类访问所需的服务 EJB 容器厂商也可以在容器或服务器中提供额外服 务的接口 现在还没有 EJB 服务器和 EJB 容器间接口的规范 因为目前 EJB 容器通常由 EJB 服务器来提供 它们一般都是同一个厂家的产品 所以一旦 EJB 服务器和 EJB 容器之 间的接口标准化了 厂商就可能提供可以在任何兼容的EJB 服务器上运行的 EJB 容器
Home 接口支持所有定位 创建 删除 EJB 远程对象的方法 Home 对象(Home Object) 是Home 接口的实现 EJB 类开发者必须自己定义 Home 接口 EJB 容器厂商应该实现从 Home 接口中产生 Remote 对象的方法 远程接口 Remote Interface 封装了 EJB 对象中的 商业方法 EJB Object 实现了远程接口 并且客户端通过它访问 EJB 实例的商业方法 EJB 类开发者必须自己定义远程接口 EJB 容器开发商必须提供产生相应的 EJB Object 的方法
第一部分 JSP 技术与 J2EE 技术
客户端程序不能得到EJB 实例的引用 只能得到它的 EJB Object 实例的引用 当客户端应 用程序调用某个方法 EJB Remote 对象接受请求并把它传给 EJB Object 同时提供进程中 必要的包装功能 客户端应用程序通过调用Home 对象的方法来定位 创建 删除 EJB 类 的实例(其实是远程接口对象) 通过 Remote 对象来调用 EJB Object 中的商业方法 客户端 应用程序可以用Java 语言来编写 通过 Java RMI 技术来访问 EJB Container 中的 Home 对 象和 Remote 或者用其他语言编程并通过 CORBA/IIOP 技术访问已经部署的服务器端组 件
在理解EJB 规范时 对于 EJB 容器这个术语 我们并不应从字面上简单地把它理解为 一个类 而是应该理解为一层代替EJB Object 访问 EJB Server 并调用相应系统服务的接口 EJB 容器开发商应该提供一套完成这些功能的工具和接口 这些工具和编程接口可以运行 在EJB Server 上
上面提到的系统服务包括
z 持久性管理 对于实体EJB 而言
z 实现创建和查找服务的Home 对象的可用性
z 可通过JNDI 技术访问的 Home 对象对于客户端程序的可视性
z 正确地创建 初始化和删除EJB Object/Remote 对象
z 保证商业方法能够正确地运行在事务上下文中
z 实现某一基本的安全服务
z 从Home Interface 和 EJB Object 上产生 stub 类(存根类)和 skeleton 类(框架类) 以 实现客户端与服务端的交互
EJB Object 必须与 EJB 容器通讯来确定调用商业方法的事务上下文 确定以后 EJB
EJB Object 必须与 EJB 容器通讯来确定调用商业方法的事务上下文 确定以后 EJB