No application client descriptors defined for: 解决办法:检查你是否已经创建了ConverterClient组件,并确定在runclient命令中用-namc 参数指定了该组件 参考打包J2EE应用程序客户端一节。 登录失败 症状:登录时出现如下错误提示 Incorrect login and/or password 解决办法:确定用户名输入的是:guest。密码输入的是:guest123。 J2EE应用程序还没有部署 症状:客户端提示出错: NameNotFoundException.Root exception is org.omg CosNaming. 解决办法:部署应用程序。参考部署J2E应用程序一节。 JNDI名错误 症状:客户端报告如下错误: NameNotFoundException.Root exception is org-omg CosNaming 解决办法:在ConverterApp的JNDI Names选项页中确定ConverterBean的NDI名和客户 端引用ejb/SimpleConverter引用的NDI名一致。如果不一致,修改后重新部署。 Web客户端运行时错误 URL中的Web上下文不正确 症状:浏览器报告找不到这个页面(HTTP404) 解决办法:检查URL里的Web上下文(converter)跟你在Conponent General Properties对 话框中指定的一致,它是大小写敏感的。参考打包Wb客户端一节。 J2EE应用程序还没有部署 症状:浏览器报告找不到这个页面(HTTP404) 解决办法:部署 JNDI名错误 症状 当你在Web页中点击Submit提交,浏览器报告如下错误: A Servlet Exception Has Occurred. 解决办法:在ConverterApp的NDI Names选项页中确定ConverterBean的NDI名和Web 客户端引用的NDI名一致。如果不 一致,修改后重新部署 用检验工具检查问题 检验工具(verifier)可以检查部署描述符和方法签名不一致的地方。这些不一致通常导致 部署错误或运行时错误。在deploytool里用菜单Tools\Verifier可以启动GUI版的verifer检 验工具。你也可以启动单独的GUI版本或者命令行版本。详见附录B。 比较你的EAR文件和样本EAR文件 对大部分例子(包括本章的例子),该指南的下载包里提供了样本J2EE应用程序EAR文件, 它们存放在j2 eetutorial/examples/ears directory目录下
No application client descriptors defined for: ... ient 组件,并确定在 runclient 命令中用-name 参考打包 J2EE 应用程序客户端一节。 : 时 rect login and/or password 户名输入的是:guest。密码输入的是:guest123。 EE 应用程序还没有部署 户端报告如下错误: ption. Root exception is org.omg.CosNaming... 解决办法:在 App 的 JNDI Names 选项页中确定 ConverterBean 的 JNDI 名和客户 端引 用的 JNDI 名一致。如果不一致,修改后重新部署。 中 不正确 状 这个页面(HTTP 404) URL 里的 Web 上下文(converter)跟你在 Conponent General Properties 对 框 大小写敏感的。参考打包 Web 客户端一节。 应 状 这个页面(HTTP 404) it 提交,浏览器报告如下错误: A ames 选项页中确定 ConverterBean 的 JNDI 名和 Web 。如果不一致,修改后重新部署。 描述符和方法签名不一致的地方。这些不一致通常导致 署 误。在 deploytool 里用菜单 Tools\Verifier 可以启动 GUI 版的 verifer 检 工 启动单独的 GUI 版本或者命令行版本。详见附录 B。 EAR 文件 子),该指南的下载包里提供了样本 J2EE 应用程序 EAR 文件, xamples/ears directory 目录下。 解决办法:检查你是否已经创建了 ConverterCl 参数指定了该组件。 登录失败 症状 登录 出现如下错误提示: Incor 解决办法:确定用 J2 症状:客户端提示出错: NameNotFoundException. Root exception is org.omg.CosNaming... 解决办法:部署应用程序。参考部署 J2EE 应用程序一节。 JNDI 名错误 症状:客 NameNotFoundExce Converter 用 ejb/SimpleConverter 引 Web 客户端运行时错误 URL 的 Web 上下文 症 :浏览器报告找不到 解决办法:检查 话 中指定的一致,它是 J2EE 用程序还没有部署 症 :浏览器报告找不到 解决办法:部署 JNDI 名错误 症状:当你在 Web 页中点击 Subm Servlet Exception Has Occurred. 解决办法:在 ConverterApp 的 JNDI N 客户端引用的 JNDI 名一致 用检验工具检查问题 检验工具(verifier)可以检查部署 部 错误或运行时错 验 具。你也可以 比较你的 EAR 文件和样本 对大部分例子(包括本章的例 它们存放在 j2eetutorial/e
其它异常 如果以上的提示都不能解决出现的问题,你可以卸载应用程序,并用cleanup脚本清空J2EE 服务器的储藏库。服务器也需要关闭后重新启动: j2ee -stop cleanup J2ee -verbose
其它异常 如 以上的提示都不能解决出现的问题 果 ,你可以卸载应用程序,并用 cleanup 脚本清空 J2EE 服务器的储藏库。服务器也需要关闭后重新启动: j2ee -stop cleanup j2ee -verbose
第二部分EB技术 第3章企业Bean Dale Green 译IceShape Zeng 企业Bean是实现EB技术的J2EE组件。企业Bean在俄EB容器中运行,运行时环境由服务器 建立(图1-5)。虽然EJB容器对开发这是透明的,但它为运行其中的企业Ba提供项事务处理等 的系统级服务。这些服务是你可以快速的建立和部署企业Bean,而这些企业Bean正是构成和新业 务处理的J2EE应用。 本章内容: l,企业Bean概述 企业Bean的优点 何时需要使用企业Bean 企业Bean的分类 2,会话Bean 状态管理模式 何时需要会话Bea 3,EntityBean EntityBean的构造 和会话Bean的不同之处 容器管理的持久性 何时需要EntityBean 4.Message-Driven Bean Message---DrivenBean的构道 和会话Bean、EntityBean的不同之处 何时需要Message-Drivenbean 5,定义客户端访问接口 远程访问 本地访问 本地接口和容器管理的关系 选择接口类型 访问的性能 访问的参数 6,企业Bean的内容 7,企业Bean的命名约定 8,企业Bean的生存周期 有状态会话Bean的生存周期
第二部分 EJB 技术 eng J2EE 组件。企业 Bean 在俄 EJB 容器中运行,运行时环境由服务器 容器对开发这是透明的,但它为运行其中的企业 Bean 提供项事务处理等 类 的持久性 、EntityBean 的不同之处 6, 第 3 章 企业 Bean Dale Green 翻译 IceShape Z 企业 Bean 是实现 EJB 技术的 建立(图 1-5)。虽然 EJB 的系统级服务。这些服务是你可以快速的建立和部署企业 Bean,而这些企业 Bean 正是构成和新业 务处理的 J2EE 应用。 本章内容: 1,企业 Bean 概述 企业 Bean 的优点 何时需要使用企业 Bean 企业 Bean 的分 2,会话 Bean 状态管理模式 何时需要会话 Bean 3,EntityBean EntityBean 的构造 和会话 Bean 的不同之处 容器管理 何时需要 EntityBean 4,Message-Driven Bean Message-DrivenBean 的构造 和会话 Bean 何时需要 Message-DrivenBean 5,定义客户端访问接口 远程访问 本地访问 本地接口和容器管理的关系 选择接口类型 访问的性能 访问的参数 企业 Bean 的内容 7,企业 Bean 的命名约定 8,企业 Bean 的生存周期 有状态会话 Bean 的生存周期
无状态会话Bean的生存周期 EntityBean的生存周期 Message--DrivenBean的生存周期 1,企业Bean概述 用Java语言编写,企业Bean就是一个应用中封装了商务逻辑的服务器端组件。这些商务 逻辑是实现应用程序目标的代码。例如在一个存货控制的应用程序里,企业Bean也许在 checkInventoryLevel和orderProduct方法中实现了商务逻辑,通过调用这两个方法,远程客 户端就可以访问应用程序提供的存货管理的服务。 企业Bean的优点 由于以下的原因,企业Bean大大简化了分布是应用的开发。首先EJB容器给企业Bean提 供了系统级服务,使Bean开发者可以专注于商务问题的解决。是EJB容器而不是开发者负责项 事务处理和安全授权等系统级服务的管理。其次因为企业Bean而不是客户端实现商务逻辑 户端开发者就可以致力于客户端表述的开发,而不必为实现商务规则或者数据库访问的日常处 理而编码了。结果使客户端“瘦”了许多,很明品,这个有点对于在小设备上运行的客户端来说 是很重要的。最后,因为企业Bea 1是可移植的,应用程序组装者可以用现有的企业Bean建立 新的应用程序。这些应用程序可以在任何兼容的J2EE服务器上运行。 何时需要使用企业Bean 如果你的应用程序符合以下的任一条件,你就应该考虑使用企业Bean: ·你的应用程序需要不断的升级。为了适应不断增长的用户,你可能需要将你的应用程 序组件分布在多台不同的机器上运行。虽然并不仅仅是企业Ban可以在不同的机器上 运行,但企业Bam的运行位置对于客户端始终是透明的 ·需要用事务机制来保证数据完整性。企业Ban支持事务机制以提供对共享资原并发切 问的管理。 应用程序需要支持众多不同类型的客户端。只需要极少的几行代码,远程客户端就可 以很容易的访问到企业Bean。这些客户都可以很“瘦”并且在理论上可以是任意数量不同 类型的客户清。 企业Bean的分类 表3-1列出了三种不同类型的企业Bean。接下来的几节将详细介绍每一种企业Bean 企业Bean类刑 作用 会话Bean 完成客户端请求的动作 EntityBean 描述持久存储的商业实体对象 MessageDrivenBean 作为JMS(Java Message Service Java消息服务)API 的监听者异步处理监听到的的消息 2,会话Ben 会话Bean表现连接到J2EE服务器的一个单独的客户端。客户端通过调用会话Bean的方法
1,企业 的代码。例如在一个存货控制的应用程序里,企业 Bean 也许在 t 方法中实现了商务逻辑,通过调用这两个方法,远程客 业 点 常处 的应用程序符合以下的任一条件,你就应该考虑使用企业 Bean: 整性。企业 Bean 支持事务机制以提供对共享资源并发访 管理。 业 无状态会话 Bean 的生存周期 EntityBean 的生存周期 Message-DrivenBean 的生存周期 Bean 概述 用 Java 语言编写,企业 Bean 就是一个应用中封装了商务逻辑的服务器端组件。这些商务 逻辑是实现应用程序目标 checkInventoryLevel 和 orderProduc 户端就可以访问应用程序提供的存货管理的服务。 企 Bean 的优 由于以下的原因,企业 Bean 大大简化了分布是应用的开发。首先 EJB 容器给企业 Bean 提 供了系统级服务,使 Bean 开发者可以专注于商务问题的解决。是 EJB 容器而不是开发者负责项 事务处理和安全授权等系统级服务的管理。其次因为企业 Bean 而不是客户端实现商务逻辑,客 户端开发者就可以致力于客户端表述的开发,而不必为实现商务规则或者数据库访问的日 理而编码了。结果使客户端“瘦”了许多,很明显,这个有点对于在小设备上运行的客户端来说 是很重要的。最后,因为企业 Bean 是可移植的,应用程序组装者可以用现有的企业 Bean 建立 新的应用程序。这些应用程序可以在任何兼容的 J2EE 服务器上运行。 何时需要使用企业 Bean 如果你 •你的应用程序需要不断的升级。为了适应不断增长的用户,你可能需要将你的应用程 序组件分布在多台不同的机器上运行。虽然并不仅仅是企业 Bean 可以在不同的机器上 运行,但企业 Bean 的运行位置对于客户端始终是透明的。 •需要用事务机制来保证数据完 问的 •应用程序需要支持众多不同类型的客户端。只需要极少的几行代码,远程客户端就可 以很容易的访问到企业 Bean。这些客户都可以很“瘦”并且在理论上可以是任意数量不同 类型的客户端。 企 Bean 的分类 表 3-1 列出了三种不同类型的企业 Bean。接下来的几节将详细介绍每一种企业 Bean. 企业 Bean 类型 作用 会话 Bean 完成客户端请求的动作 EntityBean 描述持久存储的商业实体对象 MessageDrivenBean 作为 JMS(Java Message Service Java 消息服务) API 的监听者异步处理监听到的的消息 2,会话 Bean 会话 Bean 表现连接到 J2EE 服务器的一个单独的客户端。客户端通过调用会话 Bean 的方法
来访问部署在服务器上的应用程序。会话Bean完成客户端的请求,从而对客户端隐藏了服务器 内复杂商务逻辑的执行过程。 正如会话Bean的名称所表示的,它代表一次会话。单独的会话Bean对象是不可以共享的 它只能有一个客户端访问,同样一次会话也只能有一个用户。和一次会话一样,会话Bean对象 不是持久性对象。(就是说它的数据并不保存到数据库。)当客户端结束运行,对应的会话Bea 也跟着结束并断开与客户端的联系(不保留特定客户端的任何信息)》 第四章将会介绍会话Bean的编码实例。 状态管理模式 根据状态管理模式的不同会话Bean可以分为两类:有状态(stateful)会话Bean和无状 态(stateless)会话Bean。 有状态会活Bean。 一个对象的状态由它的成员变量(数据成员)的状态决定。有状态会话Bea的成员变量描 述一个唯一的客户端-会话Bean的关联状态。因为客户端要与对应的会话Bean进行对话,所以 这种状态通常被叫做会话状态。 会话状态在整个会话期间被保留。如果客户端运行结束或者删除对应的会话Ba,这个会 话就结束同时状态被清除。这种状态的短暂性并不是问题,相反,如果客户端和会话Bea的对 话结束就不必要在保留会话的状态了 无状态会话Bea 无状态会话Bean并不为客户端保留会话状态。在客户端掉用无状态会话Bean的方法时, 对应会话Bea即的数据成员会描述这个调用状态,但仅仅只在该方法调用期间保持这个状态。当 方法调用结束,状态就被清除。除了在方法调用期间,所有同一个无状态会话Bean实例是等价 的,可以被容器分配给任一客户端。 因为无状态会话Bean可以同时支持多个客户端,所以能更好的支持应用程序的可数的大量 客户端。很明显,对支持相同数量的客户端的应用程序,需要的无状态会话Bean会比有状态会 话Bean要少 有时,EJB容器会在没有请求的时候把有状态会话Bean保存在内存(二级存储器Second Storage)中。不管什么时候,没有请求时无状态会话Bean都不会被保存中。所以,无状态会 话Bean会比有状态会话Bean有更高的性能 何时需要会话Bean 通常,在出现以下几种情况时你需要用会话Bean 在任何给定时间,只有 个客户端访问这个Bean的实例 ,Ban的状态并不需要持久保存,只在一个时间段(可能是几小时)内保持。 在以下情况下,建议采用有状态会话Bean: Bean需要描述一个于特定客户端的会话状态 Bean需要在客户端的多个方法调用之间保存调用信息 Bean作为应用程序的其他组件和客户端的中介者,呈现一个简单化的视图给客户端 在调用接口里,Bean管理很多企业Bean的工作流(如18章的AccountControllerEJB 的会话Bean例子)。 如果你的应用符合以下特性,为了得到更高的性能你应该选择无状态会话Bea: Bean的状态不包含客户端相关的数据 .在一个单一方法调用中,Ben已经可以为客户瑞完成所精要的工作。例如你可以用无
来访问部署在服务器上的应用程序。会话 Bean 完成客户端的请求,从而对客户端隐藏了服务器 内复杂商务逻辑的执行过程。 正如会话 Bean 的名称所表示的,它代表一次会话。单独的会话 Bean 对象是不可以共享的, 它只能有一个客户端访问,同样一次会话也只能有一个用户。和一次会话一样,会话 Bean 对象 不是持久性对象。(就是说它的数据并不保存到数据库。)当客户端结束运行,对应的会话 Bean 也跟着结束并断开与客户端的联系(不保留特定客户端的任何信息)。 话 Bean 的成员变量描 一个唯一的客户端-会话 Bean 的关联状态。因为客户端要与对应的会话 Bean 进行对话,所以 这种状态通常被叫做会话状态。 会话状态在整个会话期间被保留。如果客户端运行结束或者删除对应的会话 Bean,这个会 话就结束同时状态被清除。这种状态的短暂性并不是问题,相反,如果客户端和会话 Bean 的对 话结束就不必要在保留会话的状态了。 无状态会话 Bean 无状态会话 Bean 并不为客户端保留会话状态。在客户端掉用无状态会话 Bean 的方法时, 对应会话 Bean 的数据成员会描述这个调用状态,但仅仅只在该方法调用期间保持这个状态。当 方法调用结束,状态就被清除。除了在方法调用期间,所有同一个无状态会话 Bean 实例是等价 的,可以被容器分配给任一客户端。 因为无状态会话 Bean 可以同时支持多个客户端,所以能更好的支持应用程序的可数的大量 客户端。很明显,对支持相同数量的客户端的应用程序,需要的无状态会话 Bean 会比有状态会 话 Bean 要少。 有时,EJB 容器会在没有请求的时候把有状态会话 Bean 保存在内存(二级存储器 Second Storage)中。不管什么时候,没有请求时无状态会话 Bean 都不会被保存中。所以,无状态会 话 Bean 会比有状态会话 Bean 有更高的性能。 何时需要会话 Bean 通常,在出现以下几种情况时你需要用会话 Bean: .在任何给定时间,只有一个客户端访问这个 Bean 的实例。 . Bean 的状态并不需要持久保存,只在一个时间段(可能是几小时)内保持。 在以下情况下,建议采用有状态会话 Bean: Bean 需要描述一个于特定客户端的会话状态 调用之间保存调用信息 符合以下特性,为了得到更高的性能你应该选择无状态会话 Bean: 第四章将会介绍会话 Bean 的编码实例。 状态管理模式 根据状态管理模式的不同会话 Bean 可以分为两类:有状态(stateful)会话 Bean 和无状 态(stateless)会话 Bean。 有状态会话 Bean。 一个对象的状态由它的成员变量(数据成员)的状态决定。有状态会 述 . . Bean 需要在客户端的多个方法 . Bean 作为应用程序的其他组件和客户端的中介者,呈现一个简单化的视图给客户端 .在调用接口里,Bean 管理很多企业 Bean 的工作流(如 18 章的 AccountControllerEJB 的会话 Bean 例子)。 如果你的应用 .Bean 的状态不包含客户端相关的数据 .在一个单一方法调用中,Bean 已经可以为客户端完成所需要的工作。例如你可以用无