认证的 IT 专家, IBM Boston
2003 年 11 月 本教程详细讲解了如何使用 WSDL、J2EE connectors、Struts 和 WebSphere Studio Application Developer Integration Edition V5 来将现有的 COBOL/CICS 程序与 Web 应用程序集成在一起。
©IBM版权所有,2003年。保留所有权利。
引言
使用新的运行在 Web 应用程序服务器中的系统集成遗留的系统(由基于 COBOL/CICS® 的应用程序组成)是一种极为常见的需求,对于大型企业来说尤其如此。本文将以一个简单的示例为那些面临这样的任务的开发人员演示如何编码一个简单的 Web 应用程序,把它连接到现有的 COBOL/CICS 程序,并且对其进行测试(通过用于 WebSphere Application Server V5 开发的 WebSphere® Studio Application Developer Integration Edition Version 5)。
连接到 CICS
可以采用许多不同的技术连接到 CICS;在任何解决方案中,通常都需要完成这项工作的基础结构。在我们的示例中,我将使用 J2EE Connector Architecture,它是一个开放的体系结构,并且完全遵循 J2EE 规范。
J2EE Connector Architecture(也称为 JCA 或 J2C)定义了一种标准的体系结构,用来把 J2EE 平台连接到异类的企业信息系统(Enterprise Information Systems,EIS)、大型机事务处理应用程序、数据库系统和遗留系统(它们都不是用 Java 编程语言编写的)中。在我们的示例中,企业信息系统是 CICS。
通过定义一些可伸缩的、安全的事务性的机制,JCA 使得将 EIS 与应用程序服务器和企业应用程序集成在一起成为可能。JCA 使 EIS 能够为其特定的系统提供标准的资源适配器。资源适配器插到应用程序服务器中,提供了 EIS、应用程序服务器和企业应用程序之间的连接性。
下列资源适配器是 WebSphere Studio Application Developer Integration Edition Version 5(以下称为 Application Developer)附带的:
- CICS ECI(CICS 外部调用接口(External Call Interface))
- CICS EPI(CICS 外部表示接口(External Presentation Interface))
- HOD 3270(用于 3270 终端的 Host On-Demand)
- IMS™
在我们的示例中,我们将使用 CICS ECI 资源适配器。
我们的样本应用程序
在我们的应用程序中,我们有一个访问 DB2_表的遗留 COBOL/CICS程序。我们想要编写一个这样的应用程序,它运行在 WebSphere Application Server V5 中,使用 J2C 连接器连接到现有的 COBOL/CICS程序并且返回一些信息。图1展示了我们的样本应用程序的体系结构:Web应用程序将顾客编号传送到 COBOL/CICS 程序中,COBOL/CICS程序然后读取 DB2 顾客表并且返回详细的信息。
为了实用的目的,我们将把企业服务器和 WebSphereApplication Server 安装在同一台运行 Windows_2000 的机器上。然而,如果企业服务器是 z/OS_机器,那么实现此样本所需的步骤将是一样的。
图1. 应用程序体系结构
为了简化开发过程,我们将此过程分为三项主要工作:
A. 安装软件和准备环境
如果您的环境还没有安装必备的软件,就将需要进行此项工作(一次)。主要的任务有:
- 安装所需的软件
- 配置 DB2、TXSeries 和 CICS Transaction Gateway
- 将 CICS ECI 资源适配器导入 Application Developer
B. 创建一个 EJB 来调用 CICS 程序
完成这些任务来创建将使用 J2C 连接器的 Enterprise JavaBean(EJB)会话 bean:
- 创建一个服务项目并且导入要打包的 COBOL 程序
- 为 CICS 程序生成企业服务
- 为企业服务生成部署代码
- 添加服务器和服务器配置
- 将 JAAS 验证添加到服务器配置中
- 将连接工厂添加到服务器配置
- 绑定连接工厂
- 测试会话 bean
C. 创建一个 Strut 应用程序来使用 EJB
完成这些任务来实现使用 Strut 的样本应用程序:
- 添加在 EJB 中所需的代码来访问顾客信息
- 创建一个访问 bean
- 创建一个支持 Strut 的 Web 项目
- 创建一个 Web 图表
- 创建组件(JSP、动作和表单 bean)
- 创建动作
- 测试 Web 应用程序
- 使用 Struts 特性和错误消息自定义代码
在下面的各个部分中,我们将详细地描述每项活动。
1. 安装所需的软件
我们的解决方案需要下列软件:
- Windows 2000(带有 FP3 或更高配置)
- TCP/IP 已配置且可运行configured and operational
- MS Loopback 驱动程序已配置且可运行。如果没有网络,CICS 将不启动。
- IBM DB2 UDB 版本 8.1(企业服务器版(Enterprise Server Edition))。以前版本的 DB2(DB2 V7.2 FP7)也行。
- IBM TXSeries™Version 5.0 for Windows(CICS 服务器)
- WebSphere Studio Application Developer Integration Edition 版本 5.0
在继续进行操作之前,安装所需的软件(如果有必要的话)。请注意,CICS Transaction Gateway 是作为 WebSphere Studio Application Developer Integration Edition 安装的一部分缺省安装的。
2. 配置 DB2、TXSeries 和 CICS Transaction Gateway
此项工作取决于您的特定环境。请查阅位于 下载文件的 Read_me_first.doc 文件。
3. 将 CICS ECI 资源适配器导入 Application Developer
CICS ECI 资源适配器是 Application Developer 附带的,但是并不自动装入用户的工作区。在为资源适配器生成企业服务之前,您必须首先将其导入工作区。不过,在安装 Application Developer 之后,您只需要这样这样做一次就可以了。(如果您有多个工作区,则将需要把资源适配器分别导入每个工作区。)
要导入资源适配器,您需要遵循下列步骤:
- 启动 Application Developer。
- 如下启动“Connector Import”向导:
- 打开 Business Integration 透视图。
- 从菜单栏中,选择 File => Import.... “Import”向导打开。
- 在 Import 向导中,选择 RAR file。“Connector Import”向导打开(图2)。
- 单击 Browse定位资源管理器文件
ciceci.rar 。J2C资源管理器是 WebSphere Studio产品附带的,您可以在 WS_installdir\resource adapters 找到,其中 WS_installdir 是安装 WebSphere Studio的目录。
- 选中 Standalone connector project复选框,然后为 Connector project选择e New单选按钮。
- 为 New project name 输入一个值,比如
Resource Adapters Project 。
- 为新连接器的位置选择 Use default。
- 单击 Finish完成导入。
图2. 将 CICS ECI 资源适配器导入工作区
进入 J2EE Hierarchy 视图,然后展开 Connector Modules,以查看新的连接器项目,它包含导入的资源适配器。
4. 创建一个服务项目并且导入要打包的 COBOL 程序
服务项目管理服务和流程的开发,并且还是组成每个服务或流程的文件(WSDL、Java、流程文件等等)的容器。服务项目文件在 Enterprise Archive(EAR)文件中打包和部署。
要创建服务项目(Service project)和导入 COBOL程序,您需要遵循下列步骤:
- 使用 Business Integration 透视图,从菜单栏选择 File => New => Service Project。
- 在“New Service Project”对话框中,指定
CICSStrutsDemo 作为项目名(Project name),然后单击 Finish。
- 选择 CICSStrutsDemo,然后在工作台(Workbench)菜单栏上选择 File => New => Package。
- 在“Java Package”对话框中,指定
cics.custdetail 作为包名(Package name),然后单击 Finish。
- 打开 Windows 浏览器(Explorer),然后导航到 下载样本 COBOL的位置(如
c:\temp )。通过拖放操作,将 COBOL程序 WBCSTDT2.cpp 导入 CICSStrutsDemo\cics.custdetail 包。
- 双击
WBCSTDT2.cpp 以在文本编辑器中打开它,然后对其进行分析(图3)。查看DFHCOMMAREA,它是CICS服务器和应用程序之间传递的通信区。我们将很快回来查阅此处的信息。
图3. 导入 Integration Edition 的 COBOL CICS 程序
5. 为 CICS 程序生成企业服务
在这一步中,您将使用 Create CICS ECI Service向导生成服务定义来访问 CICS 服务器上的 CICS程序。服务定义将放在三个 Web Services Description Language(WSDL)文件中,如图4所示。
图4. Integration Edition 生成的 WSDL 文件
要生成企业服务,您需要遵循下列步骤:
- 从 Services 视图中,选择 CICSStrutsDemo服务项目,然后单击工具栏中的 Service built from...
图标。“Create Service”向导打开。
- 在“Create Service”对话框中,为资源适配器选择 CICS ECI,然后单击 Next(图5)。
图5. Creating a CICS ECI Service对话框
- 在“New CICS ECI Service”中,输入下列连接属性(图6):
- Gateway address:您的 CICS 事务处理网关的 URL。
- CICS server name:您的 CICS 服务器的名称。
- User name:用于访问 CICS 系统的有效用户 ID。
- Password:用户名的有效密码。
接受其他连接特性的缺省值。
图6. CICS ECI服务--连接特性
- 单击 Next。
- 在“Service Binding”对话框中(图7)输入下列值:
- Source folder:单击 Browse选择 /CICSStrutsDemo。
- Package:单击 Browse选择 cics.custdetail。
- Interface file name:
CustomerInfo 。
其他字段(比如 Port type name、binding name 等等)的缺省值是根据接口文件名(Interface filename)生成的,不过,如果需要的话,可以对其进行覆盖。一般来说,可以接受缺省值,我们在此处就是这样做的。
图7. CICS ECI 服务--服务绑定
- 单击 Finish。
当“Create Service”向导完成时,对话框就显示一个消息,提示您继续在Binding WSDL 文件 CustomerInfoCICSECIBinding.wsdl (它会在编辑器中打开)中创建绑定操作。(通过选中对话框中的复选框,您可以取消此消息。)您将看到服务-绑定文将打开,等待您进行进行编辑。
在上面的步骤的最后,会生成三个 WSDL 文件:
CustomerInfo.wsdl - Interface WSDL文件:包含一种不带操作和消息的端口类型。
CustomerInfoCICSECIBinding.wsdl - Binding WSDLfile:不包含任何操作的任何绑定定义。
CustomerInfoCICSECIService.wsdl - Service WSDLfile:包含所需的服务和端口定义。
此时,该 WSDL 文件还没有包含任何操作或绑定信息。下面的说明将为服务添加这些信息。
- 您现在在
CustomerInfoCICSECIBinding.wsdl 文件的“Bindings”页面(它会在 WSDL编辑器中打开)。在添加它的绑定定义之前,您需要添加一个操作。因此,您可以在“Port Type andBinding Operations”区域中单击 New按钮(在可用操作(Available Operations)的右边)来添加一个操作。
- 在“Operation Binding”的 Operation name字段中输入值
getCustomerInfo 。将消息的类型保留为 REQUEST_RESPONSE ,因为将有两个消息,一个用于请求,一个用于应答。请参见图8。
图8. 在 WSDL 服务中添加消息
单击 Next ,然后继续进行下列操作:
- 在“Bind Properties”对话框的 functionName 字段中,输入将为服务激活的 CICS 程序的名称,它就是
WBCSTDT2 。单击 Next。
- 在“Operation Binding”对话框中,选择 Use input message for output。您可能会记起COBOL/CICS 程序中的 DFHCOMMAREA存储输入和输出结果。单击输入消息旁边的 Import(而不是 Browse)。
- 在“File selection”对话框中,定位到 CICSStrutsDemo项目,再展开 cics和 custdetail文件夹,然后选择 WBCSTDT2.cpp。
- 单击 Next。
- 在“COBOL Import Properties”对话框中,单击 Next按钮。(此面板将用于指定关于数据应该如何在目标平台上进行传递以及应该如何随 CICS 服务器的执行平台的改变(Intel、390 等等)而改变的特性。 由于我们的示例中的 CICS 服务器是 Win32,所以没有什么需要进行更改。然而,如果您的 CICS 服务器运行在别的平台上(比如 z/OS),您将不得不更改此页面。)
- 在“COBOL Importer”对话框中(图9),向下移动到通信数据结构,然后选择 DFHCOMMAREA。单击 Finish。
图9. 导入 COBOL
- 回到“Operation Binding”对话框,请注意输入消息(Input message)已经填好(作为导入 COBOL 的结果)。单击 Next按钮。
- 在“Operation Binding-Summary”对话框中,简单地分析一下该概览(Summary)。请注意添加了 customerInfo 操作及 customerInfoRequest 消息。单击 Finish。
在这一步的最后,您应该在 cics.custdetail 包中看到三个生成的 WSDL 文件,如图10所示。
图10. 通过向导生成的 WSDL 文件
您现在可以测试生成的 WSDL 文件来验证您能够连接到 CICS 服务器和访问该服务器(按照 Application Developer 中的说明,在在线帮助中的“Testing the service definitions”下)。您不必创建服务器来运行此测试。
记住,如果您决定现在测试 WSDL 文件,就必须返回到此处,继续进行下面的步骤6,因为您还没有生成代码来部署您正在创建的 CICS ECI 服务。
6. 为企业服务生成部署代码
在您可以创建应用程序之前,您需要为企业服务生成部署代码,为了达此目的,您需要使用“Generate Deploy Code”向导。虽然一般来说,向导一打开,您就可以接受向导中的缺省值,但是您应该好好看一看向导中的页面,使自己熟悉为部署代码指定的缺省属性和值。
如果您真的需要更改“Generate Deploy Code”向导中的什么值的话,它最可能就是入站绑定类型(Inbound binding type)。在入站绑定类型(Inbound binding type)下拉列表中,您可以选择下列三个值中的某一个来决定如何执行您部署的服务:
- SOAP:(缺省)生成一个无状态会话 bean 来执行该服务,并且生成 SOAP 部署代码来执行无状态会话 bean。
- EJB:生成一个无状态会话 bean 来执行该服务。
- JMS:生成一个消息驱动 bean(MDB)来执行该服务。
取决于您在“Generate Deploy Code”向导最初的“Deployment”对话框中选择这些值中的哪一个,向导中随后的页面将有所不同。
由于我们想要不必使用 SOAP 就激活 CICS,并且希望得到最好的性能,所以将使用入站绑定类型。
“Generate Deploy Code”向导生成一个无状态会话来把客户机请求传递到服务,并且处理从服务返回的请求。它还生成部署的类,这使得您的会话 bean 可以在 EJB 服务器(比如 WebSphere Application Server)上运行。“Generate Deploy Code”向导也生成服务的 EAR 文件,而该文件就是您将部署到运行时或 WebSphere Studio 测试环境以进行测试的 EAR 文件。
要生成 CICS ECI 服务的部署代码,您需要遵循下列步骤:
- 展开 CICSStrutsDemo服务项目和 cics.custdetail包,然后选择名为 CustomerInfoCICSECIService.wsdl服务-绑定文件。
- 从工具栏中,单击 Generate deploy code for a service
图标。“Generate Deploy Code”向导打开。
- 在“Deployment”对话框中,WSDL 文件、服务名和端口名缺省设置为您在前面根据服务绑定文件选择的值。由于您正在创建将使用 EJB 的服务,所以您必须从 Inbound Binding type 下拉列表中选择 EJB。为您指定了企业应用程序项目和 EJB项目的缺省值。选择 Generate helper classes复选框,然后单击 Next。
- “Inbound Service Files”允许您指定 EJB服务绑定和服务文件的名称、文件名称和位置。您可以接受生成的缺省值,因为它们是基于接口文件名和您选择的入站绑定类型。单击 Next。
- “EJB Inbound Service Files”对话允许您指定 EJB服务绑定和服务文件的名称、文件名称和位置。您可以接受生成的缺省值,因为它们是接口文件名和 EJB绑定类型。单击 Next。
- 在“EJB Port”对话框中,保留 JNDI名的缺省值。此 JNDI 名是用于 EJB绑定的。您可以接受缺省值。单击 Finish。(提示:要获得其他的帮助,请按 Tab键进入条目或向导的页面中的按钮,然后按 F1键。)
请参见图 11 中生成的文件。
图11. 为 EJB 绑定生成可部署的服务
CICSStrutsDemoEJB 项目包含 EJB应用程序的所有资源,其中包括:
- 无状态会话 bean(CustomerInfoService)。
- 部署描述符。
- 远程接口。
- EJB 本地接口。
- 服务定义文件(
CustomerInfoEJBService.wsdl ),它描述生成的会话 bean。
- 服务项目(CICSStrutsDemo),它包含服务定义;此项目被压缩成 JAR文件,并且与 CICSStrutsDemoEJB 项目的 JAR文件一起放在 EAR 项目(CICSStrutsDemoEAR)中。
此时,我们有了 EJB 会话 bean,它能够访问 CICS服务器并且把 DFHCOMMAREA 用作输入/输出参数。为了使用 J2C连接器测试此EJB,我们现在必须创建和配置 WebSphereApplication Server。
7. 添加服务器和服务器配置
这一步添加服务器和服务器配置来运行生成的会话 bean。服务器标识您想要用于测试的运行时环境。服务器配置包含需要用来设置和发布服务器的信息。(如果您想要使用现有的服务器和服务器配置来运行会话bean,则请 跳过这一步。)
在测试组件时,可以自动生成服务器,不过我们将创建一个服务器并且手工配置它:
- 在 Services视图中,右键单击服务器项目,然后选择 New => Other。
- 在左边的窗格中选择 Server,而在右边的窗格中,选择 Server and Server Configuration。单击 Next。
- “Create a New Server and Server Configuration”向导打开。此向导创建一个新的服务器配置并且同时配置它。
- 键入
WASV5 作为服务器名,并且按照向导中的说明指定您想要创建的服务器和服务器配置的细节。
- 在“Create a new server and server configuration”对话框中,从 Server type 列表中选择 请注意,企业版(Enterprise Edition,EE)服务器不需要简单的 J2C 连接器。请参见图12。
图12.创建服务器和服务器配置
- 单击 Finish。
打开 Server 透视图,并且会看到:
- 新的服务器和配置文件夹出现在 Navigator 视图的 Servers project 文件夹中。
- 该服务器还出现在 Servers 视图中和 Server Configuration 视图中。
- 该服务器配置还出现在 Server Configuration 视图中。
8. 将 JAAS 验证添加到服务器配置中
此项工作取决于您的特定环境。
WebSphere Application Server V5 完全支持 Java 验证和验证服务(Java Authentication and Authorization Service,JAAS)体系结构,并且把访问控制体系结构扩展为支持基于角色验证 J2EE 资源(包括 servlet、JSP 和 EJB 组件)。为了使用 JAAS 验证,我们必须把 JAAS 验证条目添加服务器配置,如下所示(图13):
- 使用 Server 透视图和 Server Configuration 视图,选择服务器 WASV5 并且双击之,以打开服务器配置特性。
- 单击 Security选项卡。
- 对于 JAAS Authentication Entries,选择 Add.... Add JAAS Authentication Entry 对话框打开。
- 为 Alias、User ID 和 Password 输入值
cicsentry 。
对于 J2C,可以把别名作为用户 ID 来获取到后端系统的连接。当您添加 J2C 连接工厂时,必须选择此别名作为组件管理的验证和容器管理的验证的别名。要获得更多关于 JAAS 支持的信息,请使用帮助(Help)功能查阅 Java 验证和验证服务(Java Authentication and Authorization Service)主题。
图13. 添加 JAAS 验证条目
- 单击 OK。
9. 将连接工厂添加到服务器配置
这一步是必要的步骤,因为我们将使用 J2C 适配器实现我们的 CICS 连接。
服务器配置中 J2C 资源适配器的连接工厂提供了到 CICS 的连接。在定义连接工厂时,您指定了资源适配器连接到特定 CICS 实例所需的全部信息,并且还指定了 Java 命名和目录接口(Java Naming and Directory Interface,JNDI)查找名,它使新的连接工厂实例能够用于组件。通过此查找名,组件可以迅速地连接到 CICS。在运行时,工厂对象可以生成连接、定位 CICS 服务器和激活服务器上的 CICS 程序。
要添加连接工厂,您需要遵循下列操作:
- 使用 Server 透视图,展开 Server Configuration 视图中的 Servers。
- 双击服务器 WASV5,以在编辑器中打开它。
- 选择 J2C选项卡。对于 WebSphere Application Server,取决于您管理的内容,可以在单元层、节点层或服务器层进行配置;单元包含节点,节点包含服务器。在高层指定的值可以应用在低层,如果它们没有在低层被覆盖的话。在 J2C 页面中,您可以在节点层指定连接工厂,然后它将应用到节点包含的所有服务器中,您也可以在服务器层定义连接工厂。单击 J2C Resource Adapters 旁边的 Add。“Create Resource Adapter”向导打开。
- 从 Resource Adapter Name下拉列表中选择资源适配器的名称。在我们的示例中,选择 Resource Adapters Project,然后单击 OK。
- 在服务器配置编辑器中,选择 J2C Resource Adapters 表内新的 ECIResourceAdapter,然后单击 J2C Connection Factories 表旁边的 Add。“Edit Connection Factory”向导打开。
- 在“Edit Connection Factory”向导中,输入下列值(图14):
- Name:
CICSECI_CF。
- JNDI name:
eis/cicseci。
- Container-managed authentication alias and Component-managed authentication alias: cicsentry(在 Security 页面中指定的相同别名)。
可以选择指定其他值,然后单击 OK。以后您将把此 J2C 连接工厂的 JNDI 名绑定到生成的部署代码的会话 bean中。
图14. 连接工厂
- 在服务器配置编辑器中,在 Resource Properties 表内输入连接特性。例如,您可以输入下列值(图15):
- ServerName:
DEMOTCP (CICS 服务器的名称)。
- ConnectionURL:
localhost (用于访问服务器的 CICS Transaction Gateway 的 URL)。
- PortrNumber:
2006 (保留缺省值)。
图15. 连接工厂规范
- 关闭编辑器,然后单击 Yes保存更改。
请注意,CICS Transaction Gateway(CTG)配置必须与 J2C 连接工厂中的规范相匹配。图16展示了在我们的示例的 CTG 中作出的定义。
图16. CICS Transaction Gateway 定义
10. 绑定连接工厂
现在,我需要把 J2C 连接工厂绑定到生成的(部署代码的)无状态会话 bean。要绑定 JNDI 名称,您需要遵循下列步骤:
- 使用 Business Integration 透视图和 Services 视图,展开 Deployable Services。
- 右键单击 CICSStrutsEJB项目,然后选择 Open with => Deployment Descriptor editor。当编辑器打开时,选择 Reference选项卡(图17)。
- 在 EJB 容器中,展开 EJB 项目和会话 bean,直到您可以看到和选择 ResourceRef为止。
- 在“WebSphere Bindings”下,输入值
eis/cicseci 作为您已经添加到服务器配置中的 J2C 连接工厂的 JNDI 名。
- 按 Ctrl+S保存更改。
图17. 将 EJB 绑定到 J2C 连接器
11. 测试会话 bean
我们现在就准备测试调用 CICS 服务器的 EJB 会话 bean。在测试我们的代码之前,您必须启动 TXSeries 和 CICS Transaction Gateway。
要启动 TXSeries,您需要遵循下列步骤:
- 选择 Start => Programs => IBM TXSeries => CICS => IBM TXSeries Administration Tool。
- 当 Administration window 打开时,选择 DEMO并且应用动作 Start。
- 当系统提示选择自动启动(auto)还是冷启动(cold)时,指定 auto。在几分钟之后,信号声和消息会指示 CICS 已经启动:
Region 'DEMO' started successfully .
图18展示了一个窗口,它指示 TXSeries 已经就绪。
图18. 已启动的 TXSeries
要启动 CICS Transaction Gateway,您需要遵循下列步骤:
- 选择 Start => Programs => IBM CICS Transaction Gateway => IBM CICS Transaction Gateway。
- 此程序立即启动。会打开一个窗口,并且显示一个消息,比如
CCL6524I: Successfully started handler for the tcp: protocol 。
此时,服务器已经就绪。(然而,请记住,还必须启动 DB2。)
要测试 EJB,请使用 Application Developer 和 Universal Test Client 工具来确保已生成的会话 bean 是有作用的。Universal Test Client 使您能够查看和激活方法、对象和类来测试该会话 bean。
要激活和使用 Universal Test Client,您需要遵循下列步骤:
- 在 Services 视图中,在 Deployable Services 下,选择包含该会话 bean 的 EJB 项目。展开项目,直到您找到会话 bean CustomerInforService,右键单击和选择 Run on Server。
- 在“Server Selection”向导中,选择您创建的服务器 WASV5,然后单击 Finish。
- 在“Referencesv pane”窗格中,在 EJB References 下,展开该会话 bean,然后展开本地 bean。为本地 bean 选择 create方法。
- 在“Parameters”窗格中,单击 Invoke。这为您的会话 bean 创建了本地对象,并且显示了 Work with Object 按钮。
- 单击 Work with Object。这在“References”窗格中创建了一个新的 bean。
- 展开这个新的 bean 以显示可以在 bean 中执行的方法的列表。选择您想要执行的方法。
- 在“Parameters”中,显示了所选方法的输入字段。输入一个值,然后单击 Invoke来运行该方法。结果返回到 Results 字段中。
- 您可以选择其他的方法,并且继续进行类似的测试。在测试完成时,关闭测试客户端。(请查阅在线帮助以查阅更详细的信息。)图19和20展示了一个 EJB 测试的示例,其中,我们输入
1 作为顾客编号,并且接收 Daniel 作为第一个名称。
图19. 测试要访问 CICS 的 EJB(两张图中的第一张)
图20. 测试要访问 CICS 的 EJB(两张图中的第二张)
此时,我们有了一个名为 CustomerInfoService 的 EJB 会话 bean,它返回通过 COBOL/CICS 程序访问的数据。图21展示了到此为止我们所做的工作。我们缺少的是激活 EJB 的 Web portion。
图21. 调用 COBOL/CICSEJB 的会话 bean
12. 添加 EJB 中所需的代码来访问顾客信息
在编码 Strut 应用程序之前,我们需要把编码添加到已生成的会话 bean 中,以设置 CICS 调用之前的顾客编号并检索 CICS 调用之后的顾客信息(名称、地址、城市、国家)。为了达此目的,可以采用许多方法。在我们的示例中,通过定义顾客信息的各个字段并且把从 DFHCOMMAREA 提取的信息输入这些字段,我们简单地访问了 DFHCOMMAREA。最主要的是,我们将需要编辑 Java类 CustomerInfoServiceBean 并且完成下列步骤:
- 为调用 getCustomerInfo 方法时您将需要传递到 EJB中的每个顾客数据项创建变量,比如 customerNumber、name、lastName、adress1、city等等。
- 为正在编辑的 Java 类的这些变量创建 getter 和setter:使用上下文编辑器,选择 Source => Generate Getter and Setter。
- 添加必需的代码来初始化 CICS 调用之前的 customerNumber的 DFHCOMMAREA,然后检索调用 CICS的方法调用之后的数据。这必须在方法 getCustomerInfo中进行。CustomerDetailsServiceBean 类中需要添加的代码用粗体显示如下:
// added
int customerNumber;
String name;
String lastName;
String adress1;
String city;
String state;
int accountNum;
String country;
DFHCOMMAREA record = new DFHCOMMAREA();
// addeduntil here
public cics.custdetail.DFHCOMMAREA getCustomerInfo(
cics.custdetail.DFHCOMMAREA argDFHCOMMAREA) {
try {initialize();
// added --> user code begin {pre_execution}
setRecord(argDFHCOMMAREA);
record.setCustNo(getCustomerNumber());
// user code end
WSIFDefaultMessage aMessage = new WSIFDefaultMessage();
aMessage.setObjectPart("dFHCOMMAREA", argDFHCOMMAREA);
WSIFMessage outputMessage =
execute("getCustomerInfo",
"getCustomerInfoRequest",
"getCustomerInfoResponse",aMessage, REQUEST_RESPONSE);
// added --> user code begin {post_execution}
this.record = (cics.custdetail.DFHCOMMAREA)
outputMessage.getObjectPart("dFHCOMMAREA");
setName(record.getFirstName());
setAccountNum(record.getAcctNumList(1));
setAdress1(record.getAddress1());
setCountry(record.getCountry());
setLastName(record.getLastName());
setState(record.getState());
setCity(record.getCity());
// user code end
return (cics.custdetail.DFHCOMMAREA)
outputMessage.getObjectPart("dFHCOMMAREA");
} catch (Exception e) {
- 将生成的代码提升为远程接口(Remote Interface)。为了达此目的,可以选择方法,然后通过上下文编辑器选择 Enterprise Bean => Promote to remote Interface。您可以在图22中看到提升的结果。
图22. 提升为远程接口的方法
- 再次部署该 EJB;通过 J2EE 视图,选择 bean CustomerInfoService,然后选择 Generated Deploy Code。
如果您此时想要运行该 EJB(您将需要停止并重新启动服务器)并且检索顾客数据,您将需要按照这样的顺序执行方法:
- 创建
- setCustomerNumber
- getCustomerInfo(调用 CICS)
- getName、getLastname等等
13. 创建一个访问 bean
EJB 访问 bean 可以大大简化客户机对企业 bean的访问,此外,它们还可以解决许多与远程调用多个企业 bean属性有关的问题。访问 bean 是代表企业 bean 的 Java bean,它们一般用在部署 JavaServer Pages(JSP)文件、servlet 或与其他企业 bean 交互的企业 bean 的客户机程序中。这意味着您可以对企业 bean 进行编程,就像您可以很容易地对 Java bean 进行编程一样,从而大大简化了您的企业 bean 客户机程序,并且有助于减少整个开发时间。
要为 CustomerInfoService 创建一个访问 bean,您需要遵循下列步骤:
- 切换到 J2EE Hierarchy 视图。
- 选择 EJB CustomerInfoService。从上下文菜单中,选择 New => Access Bean。“Access Bean Creation”向导打开。
- 选择 Java bean wrapper单选按钮,然后选择 Next。
- 确保正确的 EJB 项目出现在 EJB Project字段中。正确的项目就是包含您想要为之创建一个访问bean 的企业 bean 的项目。
- 在 Enterprise Bean 字段中,确保 CustomerInfoService被选中,然后单击 Finish。会生成一个名为 CustomerInfoServiceAccessBean 的类。此类将用在调用激活 CICS 的会话 bean 的 Web 项目中。
14. 创建一个支持 Strut 的 Web 项目
可以通过 Cheat Sheet 选择执行下面的顺序:
- 在动作栏,选择 Help => Cheat Sheets => Other_=> Struts => Create a Struts-based Web application。此操作将指导您完成所需的向导。图23展示了“Cheat Sheets”,它将按照这些步骤执行。
图23. 为 Strut 创建 Sheet
- 在“Create a Web Project”对话框中,为 Context 根创建
CICSStrutsDemoWeb (图24)。单击 Next。
图24. 创建一个 Web 项目
- 在“Module dependencies”对话框中,选择 CICSStrutsDemo.jar和 CICSStrutsDemoEJB.jar。
- 在“Struts Settings”对话框中,输入下列值,如图25中所示:
- 检查 Override default settings。
- Struts 版本: 1.1(Struts 1.1 有更多的标记选项,不过版本 1.0.2 也行)。
- 缺省的 Java 包前缀:
cics.struts.demo.web 。
- 单击 Finish,然后为将修改服务器配置的对话框单击 OK。
图25. 创建一个 Web Strut 项目
15. 创建一个 Web 图表
Web 图表是一个文件,它有助于您可视化和更好地理解基于 Struts 的 Web 应用程序。我们将使用图表编辑器来展示我们的 Struts 应用程序:
- 使用 Cheat Sheets,单击 Perform 图标
来创建 Web 图表。
- 我们可以在
CICSStrutsDemoWeb 文件夹中创建我们的图表。键入 CICSStrutsDiagram 作为文件名,然后单击 Finish。可以用空白区来创建图表。
- 使用 Struts 图标
来将新的项目放入 Web 图表:选择一个图标,然后单击您想要创建一个新项目的空白 Web 图表。方法如下:
- 创建两个名为
input.jsp 和 output.jsp 的 JSP。
- 创建一个名为
callCobolAction 的动作。
- 创建一个名为
formCICSStrutsBean 的表单 bean。
- 使用连接器图标来连接对象(单击资源和目标对象)。
- 在从
callCobolAction 动作连接到 output.jsp 时,系统会提示您输入一个转发名(forward name);使用名称 OK 。
最后的结果显示在图26中。
图26. 空图表
16. 创建组件(JSP、动作和表单 bean)
使用 Cheat Sheets,单击 Perform 图标 来创建组件。图27中所示的对话框打开。
图27. 创建 Web 组件
表单 bean 是存储数据的 ActionForm 子类的实例。我们必须在表单中定义所有想要在我们的应用程序中访问的变量。当浏览器提交 Struts 表单时,ActionServlet 会:
- 查看来自 HTML 表单的字段名;
- 匹配它们到表单 bean 中的特性名;
- 调用这些变量的 setter 方法来存放在 HTML 表单中检索的值。
另外,如果您实现了有效的方法并且在 Struts 配置文件的相应动作映射条目中设置了有效的标志,ActionServlet 就会激活表单 bean 的有效方法。
要创建表单 bean,您需要遵循下列步骤:
- 双击 formCICSStrutsBean。(最小化 Cheat Sheets;稍后我们将再次使用它们。)
- 接受第一个对话框中的缺省值,然后单击 Next。
- 在 Choose new accessors 对话框中,也单击 Next。
- 在 Create new accessors 对话框中,我们创建所有想要使用的变量。图28展示了此页面的内容以及所有定义的变量。
图28. 为表单 bean 创建访问器
- 单击 Finish创建表单 bean。
- 由于我们想要检查所键入的输入数据的有效性,现在将添加一个名为 validate 的方法,如图29所示。
图29. 检查表单 bean 中方法的有效性
- 现在,让我们创建
input.jsp 。双击 input.jsp打开向导。
- 接受所有的缺省值,然后单击 Next,直到 Form Field Selection对话框出现为止。
- 选择 formCICSStrutsBean表单和 customerNumber字段,如图30所示。
图30. 创建 input.jsp
- 单击 Finish。会生成一个 JSP 模型,如图31所示。
图31. 生成的 Input.jsp
- 通过 Cheat Sheet 或图表,双击 output.jsp。此 JSP 页面将返回由 COBOL/CICS 返回的结果。我们也可以使用向导来自动生成 JSP。
- 与前面一样,当“New JSP File”对话框打开时,接受所有的缺省值,然后单击 Next,直到“Form Field Selection”出现为止。
- 选择 formCICSStrutsBean表单和所有我们想要展示的字段(图32):
- city
- country
- accountNumber
- state
- firstName
- lastName
- adress1
- 在“Design the Form”对话框中,使用向上和向下箭头来重新安排字段的次序。
- 选择底部的 Fields按钮,然后在 Field Type 字段中,将值从 text更改为 static text。请查看图32中的选择。
图32. 设计 output.jsp
- 单击 Finish。请注意,将在 JSP 中生成一些按钮。由于我们不需要按钮,所以可以选择和删除它们。
- 选择 Source选项卡,同时删除源代码中的此标记:
<html:form action=""> 和 </html:form>。 结果会显示在图33中。
图33. 带有 Struts 的 Output.jsp
- 请注意,会自动生成
<bean:write> ,它带有特性名称集。选择 Source选项卡来查看生成的代码:
<bean:write name='formCICSStrutsBean' property='firstName' /> <bean:write name='formCICSStrutsBean' property='lastName' /> <bean:write name='formCICSStrutsBean' property='adress1' /> <bean:write name='formCICSStrutsBean' property='city' /> <bean:write name='formCICSStrutsBean' property='state' /> <bean:write name='formCICSStrutsBean' property='country' /> <bean:write name='formCICSStrutsBean' property='accountNumber' />
请注意,该表单 bean 名为 formCICSStrutsBean (第一个字母小写),即使 Java 类将为 FormCICSStrutsBean 。这是一个常见的错误。
17. 创建动作
Struts 动作是 Action 类的一个实例,Action 类实现 Web 应用程序的 portion 并返回对象。动作映射是一个配置文件条目,它使动作名称与动作、表单 bean 和本地转发(local forward)相关联。在这一步中,我们将实现与 Web 图表相关联的动作,并且还将执行 COBOL/CICS 调用。
使用 Cheat Sheets:
- 单击 Perform 图标
。
- 在“Select Action”对话框中,双击 /callCobolAction。
- “New Action Mapping”向导打开。对于 For Form Bean Name,选择 formCICSStrutsBean,然后单击 Next。
- 在“Create an Action class for your mapping”对话框中,将生成的 Action 类名更改为
CallCobolAction ,然后单击 Finish。请参见图34。
图34. 创建一个动作类
- 在 CallCobolAction 类中,添加必要的 Java 代码来创建访问 bean,它将使用 EJB 会话 bean 调用 COBOL/CICS。执行方法中引入了以下用粗体显示的代码:
import cics.custdetail.CustomerInfoServiceAccessBean;
_
public ActionForward execute(
ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward();
// return value
FormCICSStrutsBean formCICSStrutsBean = (FormCICSStrutsBean) form;
try {
// do something here
cics.custdetail.DFHCOMMAREA record = new cics.custdetail.DFHCOMMAREA();
CustomerInfoServiceAccessBean acess =
new CustomerInfoServiceAccessBean();
acess.setCustomerNumber(formCICSStrutsBean.getCustomerNumber());
acess.getCustomerInfo(record); // perform the CICS call
formCICSStrutsBean.setFirstName(acess.getName());
formCICSStrutsBean.setAccountNumber(acess.getAccountNum());
formCICSStrutsBean.setAdress1(acess.getAdress1());
formCICSStrutsBean.setCity(acess.getCity());
formCICSStrutsBean.setCountry(acess.getCountry());
formCICSStrutsBean.setLastName(acess.getLastName())
// ============
} catch (Exception e) {
- 当您保存此类时,会在任务列表中显示一些错误,因为在 Java 构建路径中缺少一些必需的 JAR 文件。图35展示了这些错误消息。
图35. 类 CallCobolAction 中的错误
要改正错误,可以选择项目 CICSStrutsDemoWeb,然后使用“Properties for CICSStrusDemoWeb”对话框来添加外部 JAR 文件:
wsadie_install_path\runtimes\base_v5\lib\wsatlib.jar
wsadie_install_path\runtimes\base_v5\lib\wsif.jar警告消息是可接受的。请参见图 36。
图36. 使用 CICS ECI 所需的库 JAR 文件
请注意,最好使用变量来为您提供更多的灵活性,而在我们的示例中,为了简单起见,使用了“外部” JAR 文件。
18. 测试 Web 应用程序
在测试应用程序之前,启动一个名为 cicstail 的程序来监视 CICS 调用,这样您就可以确保 COBOL 被激活。要运行此程序,可以打开命令窗口,然后执行:
cicstail.exe -r DEMO
用于监视的窗口打开。在测试您的代码时,请保留此窗口是打开的,这样您就能够在执行时进行监视。
要测试您的应用程序,您需要遵循下列操作:
- 使用 Web 透视图和 J2EE Navigator 视图。选择位于项目
CICSStrutsDemoWeb/Web Content 中的 input.jsp,然后选择 Run on Server。请参见图37。把应用程序发布到应用程序服务器(WASV5)中,然后通过显示 input.jsp 执行启动。
图37. 测试 Struts 应用程序
- 对于数据,输入值1,然后单击 Submit。
cicstail 程序会通知您,名为 WBCSTDT2 的程序已被调用。(请参见图38。)
图38. 调用 COBOL/CICS 程序
- 执行的结果显示在图39中。
图39. 执行结果
结果显示,CICS COBOL 读取了 DB2 数据,检索了与 Customer Number 1 相关的顾客信息,然后把数据送回到了 Java 客户集中。如果您忘记了从 output.jsp 源代码删除 <html:form action=""> 和 </html:form>
标记,您将看到以下错误:
E SRVE0026E: [Servlet Error]-[Cannot retrieve mapping for action /
此 html 代码与我们删除的按钮是有关联的。
19. 使用 Struts 特性和错误消息自定义代码
我们的应用程序已经访问了服务器,并且完成了大多数重要的任务,不过,我们仍然需要进行一些改进,比如验证输入数据的有效性、显示错误消息、更改外观以及使用可能翻译成其他语言的 Struts 特性。
例如,使用前面已经完成的代码,如果您执行时在第一个 JSP 页面中输入值0,则将在应用程序服务器控制台上产生一个错误:
E SRVE0026E: [Servlet Error]-[action]:_No input attribute for mappingpath /action
我们在表单 bean 中编写了一些有效性检查,如图29所示。因此,有必要把一些修改添加到已生成的文件中:
- 定义 Struts 应用程序资源:
ApplicationResources.properties 文件(在 Java Source 和 cics.struts.demo.web.resources 中)包含我们在该 JSP 中需要的文本常量和来自业务逻辑的错误消息。打开该文件并且添加用粗体显示的代码,如下所示。完成之后保存和关闭文件。
# Optional header and footer for <errors/> tag.
#errors.header=<ul>
#errors.footer=</ul>
#
input.title=Calling COBOL/CICS Example
input.customerNumber=Enter the customer number
input.submit=EXECUTE
error.customer.required=Customer Number cannot be zero
error.customer.number=Customer Number must be smaller than 11
result.title=Result from COBOL/CICS call
- 修改输入 JSP:
必须修改这些 JSP 以使它们能够使用应用程序资源(Application Resources)和 Struts 功能:
- 编辑
input.jsp 并且确保选项 JSP => Show Visual Custom Tags被选中;否则,在设计 JSP 时,您将只能看到图标。
- 通过选择 Window => Show View => Properties打开 Properties 视图。
- 使用“Design”页面,通过左边的指针,选择 JSP => Insert Custom来添加标题。在对话框中,选择 bean标记库(左边)和 message(右边),然后选择 Insert和 Close。选择新的条目, Missing message for key。在 Properties 视图中,为 Key value 输入值
input.title 。这是指向资源文件的引用。
- 选择新标题(在选中时会变黑),然后可以选择 Format => Paragraph => Heading 1,也可以在源页面的标题前后添加 <h1> 和 </h1> 标记。
- 我们将以相同的方式用一个键值来替换 literal“customerNumber”(带有类型为 bean => message的自定义标记)。为了达此目的,可以删除 literal“customerNumber”,然后在它的位置选择 JSP => Insert Custom, bean(左), message(右),然后选择 Insert和 Close。在 Properties 视图中,输入
input.customerNumber 作为键值。
- 通过选择来 html => submit来删除 Submit 按钮并且添加自定义标记。然后,在 Source 视图中,您可以把把自定义 bean => message,插入提交按钮(使用键
input.submit )。结果为:
<TD><html:submit>
<bean:message key="input.submit"></bean:message>
</html:submit></TD>
- 再次使用 Design 页面,在标题和表单之间添加自定义标记 html => errors 以显示错误消息。
- 从 Gallery 视图中拖出图像,并将其放在 JSP 页面的顶部;在我们的示例中,将使用来自
Illustration 文件夹中的 cut018.gif 。最终的布局示于图40中。
图40. 自定义的 Input JSP 页面
- 修改输出 JSP:
按照与上面的步骤2中类似的顺序来更改输出页面,为此,您可以将消息键 result.title 添加到 Header,使用 Format => Paragraph => Heading 1来安排 Header 的格式。请参见图42中的结果。
图41. 自定义的输出 JSP
- 修改 Struts 配置:
使用 J2EE Navigator 视图打开 struts-config.xml 文件(在 CICSStrutsDemoWeb/Web Content/WEB-INF 文件夹忠)。在 Actions 页面上,选择 callCobolAction并将 Input 字段设置为 /input.jsp (将指针移出字段以确保它被输入)。保存和关闭文件。Input 字段设置该 JSP。如果有效性检查出现错误,它将重新显示。
现在,您有了一个比以前更好的应用程序,因为该应用程序现在可以使用一些 Struts 资源。停止服务器并再次测试应用程序(如上所述)。使用值 0 和 11 (无效的顾客编号(Customer Number))查看错误消息。图42展示了使用值11时的输出。
图42. 使用无效的顾客编号进行测试
结束语
祝贺您!现在,您已经实现了一个使用 Struts 的应用程序,在这个应用程序中,我们使用 J2C 连接器实现了与 CICS 的连接。虽然这是一个相对简单的示例,但是不难看出,在必要时,可以很容易地把此处创建的应用程序扩展为复杂的应用程序。此外,在我们的示例中,我们使用了运行在 Windows 下的 CICS。如果您的 CICS 服务器运行在 z/OS 中,那么您将需要在 WSDL 端口类型(WSDL Port Type)和绑定操作(Binding Operations)中作一些更改(请参见步骤5),重新生成一些 Java 代码,并且更新 J2C 配置。
不管应用程序和访问的后端平台(backend platform)的复杂性如何,您都将发现,无论在哪一种情况下,编码、测试和调试应用程序的步骤都与此处所列出的非常类似。 |