利用 Web 应用程序模型从 CICS 程序来构建基于 Struts 的 Web 应用程序: 第 1 部分:生成服务代理和 Struts 中间层
2009-12-31 00:00:00 来源:WEB开发网引言
今天,许多公司需要把旧的企业应用程序放到 Web 上。考虑到它们有限的资源,为了在 Web 上运行而重写旧的应用程序是不可能的。相反,它们需要利用在业务事务(业务事务运行于经过验证的大型机操作环境中)上的大量投入。公司必须重用现有的事务而不是重写它们,重用的方式是把它们作为 Web 应用程序公开,同时保持它们的高性能、可伸缩性和可靠性。
Web 应用程序模型(Web Application Models)是 IBM® VisualAge® Pacbase 的组件,也是 IBM WebSphere® Studio 的插件,它是加速这个过程的工具。Web 应用程序模型可以使用企业服务(企业服务由现有的 CICS® 或 IMS™ 事务构建而成)来生成 Java™ Enterprise Edition(J2EE)中间层组件,这些组件通过标准的 J2EE 连接器体系结构(J2EE Connector Architecture,JCA)和 Web 服务调用框架(Web Services Invocation Framework,WSIF)连接到运行于大型机环境的 COBOL 程序。
这篇分两部分的文章将描述如何使用 Web 应用程序模型以及 WebSphere Studio Application Developer Integration Edition 或 WebSphere Studio Enterprise Developer 来开发基于 Struts 的 Web 应用程序(这些程序可以访问运行于 CICS 的现有的 COBOL 程序)。第 1 部分讲述:
创建 CICS ECI 程序的企业服务代理
生成和测试服务代理
使用代理以及 Web 应用程序模型来生成其余的中间层组件
测试 Web 应用程序,测试的方法是通过 JCA 资源适配器来访问 CICS 程序
第 2 部分讲述如何使用定制的 Web 应用程序模型 XSL 样式表来定制 Web 用户界面。
创建 CICS ECI COBOL 程序的企业服务代理
请参阅联机帮助( Enterprise Developer Information => Building Enterprise Services),其中有创建企业服务的完整描述。联机帮助中还有标题为 Create an enterprise service for a CICS program (CICS ECI)的有用的“作弊用纸”。下一节演示如何利用 CICS 程序 TRADERBL 来创建服务。
生成 Web 服务描述语言
导入 COBOL Copy Book。
打开 Business Integration 透视图。
创建新的服务项目 MyServiceProj。
用鼠标右键单击 MyServiceProj,选择 Import => File system。
找到那个目录和 COBOL 程序,请确保 MyServiceProj是目标文件夹,然后单击 Finish。
启动 Service built from向导,导入资源适配器。
用鼠标右键单击 MyServiceProj,选择 New => Service built from。
如果工作空间中没有 CICS ECI 资源适配器,那么您必须导入它。为了导入它,请单击 Import Resource Adapter。
找到连接器文件 <studio root>resource adapters\cicseci.rar 。
在相同的对话框中输入新的连接器项目名。请看下面的图 1。
单击 Finish。
图 1. 把 CICS ECI 资源适配器导入到新的连接器项目。
图 2. 选择 CICS ECI 适配器(如下图所示),然后单击 Next。
输入连接属性:
网关地址
端口号
CICS 服务器名称
用户名
密码
TPN 名称
事务名称
JNDI 查询名称
单击 Next,您将看到向导的 Service Binding 面板,请输入接口文件名:
图 3. Service Binding 面板
单击 Finish后将生成三个 WSDL 文件。 MyTradeCICSECIBinding.wsdl 的缺省编辑器被自动打开。下一步是在编辑器中创建服务的新操作并定义 COBOL 程序的输入消息:
为了创建新操作,请在 Port type and Binding Operations 下单击 New。
输入操作名称 getCompany ,然后单击 Next。
在 Operation Binding Properties 中,输入函数名 TRADERBL (这是 CICS 程序的名称),为了定义输入消息,请再次单击 Next。
单击 Import,选择 MyServiceProj 中的 COBOL 程序,然后单击 Next。
在 COBOL Import Properties 面板中,选择 z/OS®平台(或运行 CICS 的平台),然后单击 Next。
在 COBOL Importer 面板中,选择 COMMAREA-BUFFER(如下图所示),然后单击 Finish。
图 4. 选择 COMMAREA-BUFFER 数据结构。
在 Operation Binding 面板中,选中 Use input message for output,然后单击 Finish。
生成 CICS ECI 服务代理
用鼠标右键单击 MyServiceProj/org.tempuri/MyTradeCICSECIService.wsdl,选择 Enterprise Services => Generate Service Proxy。
接受名称的缺省值,单击 Next。
如图 5 所示,选择 Command Bean和 getCompany操作,然后单击 Finish。
图 5. 服务代理生成
现在服务项目包含 WSDL 文件、生成的服务代理和命令 bean:
图 6. 服务项目文件
对服务代理进行单元测试
生成的代理使用 WSIF 的 Java API 来与 CICS 程序通信。对于 Web 应用程序来说,代理被看作它可以执行的企业服务。在构建执行这个服务代理的 Web 应用程序之前,对企业服务进行单元测试以确保 CICS 程序被正确地调用并且可以把数据返回给代理。
切换到 Java 透视图并打开类 MyTradeProxy.java。
找到 main() 方法,在调用 execute 之前和之后添加代码(如下所示)。我提供了 COBOL 程序期待的用户标识和输入参数:请求类型是“Share_value”,公司名是“IBM”。在 execute 之后,我们把 COBOL 程序返回的某些数据打印到控制台。
/**
* main method (for proxy unit testing)
* @generated
*/
public static void main(String[] args) {
try {
MyTradeProxy aProxy = new MyTradeProxy();
// user code begin {set_inputs}
COMMAREABUFFER comm = new COMMAREABUFFER();
comm.setUserid("F058971");
comm.setRequest__type("Share_Value");
comm.setCompany__name("IBM");
aProxy.setCOMMAREABUFFER(comm);
// user code end
aProxy.execute();
// user code begin {get_outputs}
COMMAREABUFFER result = aProxy.getCOMMAREABUFFER();
System.out.println("1=" + result.getUnit__value__1__days());
System.out.println("costbuy=" + result.getCommission__cost__buy());
System.out.println("costsell=" + result.getCommission__cost__sell());
// user code end
保存这个类,然后在菜单中选择 Run、 Run as、 Java Application。控制台中的输出类似于:
1=00163.00
costbuy=010
costsell=015
把服务代理作为 JAR 文件导出
选择 MyServiceProj项目,用鼠标右键单击,然后选择 Export。导出为 JAR 文件,选择文件系统中的目标目录。
生成基于 Struts 的中间层
为了生成构成中间层的 JSP、Java 类和配置文件,我们使用 Web 应用程序模型。这个过程由以下组成:
启动向导并选择模式
选择我们要使用的、来自服务代理的数据
选择一些基本的显示属性
选择生成参数并生成
配置 WebSphere Test Environment(WTE)并测试
启动并选择模式
为了启动向导,请选择 File、 New、 Other、 Web、 Model-based Web Application。如下图所示,您必须选择应用程序名称。应用程序名称被用来标识将由这个模型生成的资源。
选择被标识为 WSIF proxy的技术。如果您选择 Relational Database 技术,那么向导将要求您连接到关系数据库,您可在这个数据库中选择被用来创建 Web 页面的表。VisualAge Pacbase 技术使用可以访问许多后端系统的 VisualAge Pacbase 代理。
图 7. 输入应用程序名称并选择技术
单击 Next后,您将看到如图 8 所示的 Select Patterns 面板。为了大致地了解不同的配置,请浏览可用的模式。在这个示例中,我们要调用的 COBOL 程序可以显示公司的股票的详细视图。
图 8. 浏览可用的模式及其变体
查看原图(大图)
选择服务代理
向导中的第二步是配置来自服务代理的数据(这些数据将与模式一起被使用)。
如图 9 所示,浏览并选择已导出的代理 JAR。
然后,在 Input parameters 下选择代理和 COMMAREABUFFER 类。
把输入参数 Request_type和 Company_name从左边的列表中转移到右边的列表中,COBOL 程序需要这两个参数来完成读操作。
在这个程序中,输入和输出参数在同一个类中。选择输出参数字段并也把它们转移到右边的列表中。您在这里选择的字段可以被显示给最终用户看。
即使在这种情况下只读的 COBOL 程序无法处理输入,您也必须配置 Update 和 Delete 面板。
为了显示向导的 Define Layouts 面板,请单击 Next。
图 9. 选择代理并配置输入和输出字段
配置显示
在下面显示的 Define Layouts 面板中,您可以选择级联样式表,选择/取消选择字段和操作,修改字段和操作属性。通过单击含有眼睛图像的按钮,您还可以预览 Web 页面。静态的 HTML 可以随时被生成,使您大致地了解 Web 页面的模样。单击 Next后,您将看到向导的最后一个页面。
图 10. 定义 Web 页面的布局属性
查看原图(大图)
生成应用程序
下图显示了您可以配置生成参数的生成页面:
把目标项目名改为 Company。
您还可以更改 Java 包的名称(这些包中有您将要生成的应用程序)。
在树形视图中,您可以更改页面、视图和数据集的名称。通过单击名称,您可以直接编辑缺省名。随着您更改这些组件的名称,列表中的文件名也被更改。
当您准备生成的时候,请单击 Finish按钮。
图 11. 生成 Web 应用程序组件。
浏览生成的组件
生成的 Java 类
在这节中,我们将简要地描述生成的组件,先描述常见的 Java 类。
图 12. 生成的 Java 类 | common.dab CommonLog 定义了记录函数。它使用 Jakarta LoggingFactory。 DataException 类被用来处理错误。 common.list MultipleSelectionListForm - 这个类管理列表的每一行上的删除复选框。 SelectionListForm - 为了启动详细视图的导航,这个类管理着列表的每一行上的链接。 SelectionList - 存储 HTTP 会话中的信息:列表的分页信息和每行的键,使您能够浏览(放大)到详细页面。 SessionObject - 用来存储有关 HTTP 会话中详细页面的信息。 common.logic AdditionalFieldChecks - 这个类完成某些常见的字段检查。 CloseSession - 关闭会话并转发到 SessionExpired 页面。 CommonAction - 您可在这个类中放入每次调用操作时执行的逻辑;查找有效的会话。 CommonFormatter - 让您设置日期和时间格式。 OpenSession - 用来建立 HTTP 会话。 wam.data DataSetDataAccessBean - 这个类调用数据集的可用操作并捕捉数据异常。 DataSetExtractObject - 抽取标准的 getter 和 setter。 DataSetSessionObject - 包含存储在 HTTP 会话中的关键字段。 DataSetValueObject - 用合适的类型把字段存储在数据集中。 wam.logic.sample CompanyDetail*Action - 删除、读和更新类调用 CICS 程序中的操作。 CompanyDetailForm - 这个类有表单的属性和 validate 方法。 CompanyRefreshAction - 这个类用数据刷新 JSP。 应用程序资源 ApplicationResources.properties - 包含常见的标签和消息; ApplicationResources-sample.properties - 包含模型特有的标签和消息。 |
Web Content
图 13. Web Content | common - 您可以在这里找到处理分页按钮的 JSP 和 SessionExpired HTML 页面。 doc - HTML 形式的技术文档以及为每个模型生成的 Web、序列和类图。 models - 模型被生成和存储在 XMI 文件中。 jca_sample - 代理的导入的描述的结果,形式是 XMI 文件。 DataSet.dsxmi - 这个 XMI 文件包含在向导中配置的数据集信息。这个数据集可被重用于另一个模式。 sample.icxmi - 这个 XMI 文件存储着模型信息 - 页面、页面视图的内容、它们的操作、导航链接和显示的数据集。这个文件使您能够重放向导情景。 sample - 样本模型特有的 JSP 资源。 theme - 级联样式表。 WEB-INF - 部署描述符、配置文件和二进制文件。稍后将更详细地说明它们。 XML - 用于可扩展样式表语言转换的文件和样式表,本文的第 2 部分将讨论它们。 index.html - 测试页面和技术文档的入口点。 |
WEB-INF
图 14. WEB-INF | classes 子目录 - 已编译的 Java 二进制文件。 lib 子目录 - Struts 1.1 的 jar、WSIF 和代理 jar。 标记库有 .tld 扩展名。 文档类型描述有 .dtd 扩展名。 有两个 Struts 配置文件 - struts-config.xml 和 struts-sample-config.xml,其中声明了: 操作及其转发路径 表单 bean 转到 sessionExpired.html 文件的全局转发 这个模型的消息资源文件 ApplicationResources-sample.properties struts 验证器插件以及包含验证规则的文件 struts 验证器框架,其中有常见的验证规则和样本模型特有的验证。您可以在这些文件中添加新规则。 validator-rules-wam.xml - 这个文件有常见的验证规则,如十进制和时间戳记检查。如果您有在模型之间共享的其它常见的检查,那么您最好把它们放在这里。 validation-sample.xml - 这里有样本模型特有的检查。包括最长的字段长度和格式检查。如果您的规则太复杂以至于无法用 XML 来编写,那么您可以在 validate() 方法中用所生成的 Form 类中的 Java 代码来实现它们。 web.xml - Web 部署描述符。 |
测试 Web 应用程序
配置服务器
打开服务器透视图,
创建新的服务器项目,
创建新的服务器和 WebSphere 版本 5.0 服务器配置。如果您有现成的服务器项目,请继续并把新的服务器和服务器配置放在现成的项目中。
为了确保在服务器配置中声明资源适配器,请打开服务器配置文件并且单击缺省编辑器的 J2C 选项卡(如下图所示)。
单击 Add按钮,选择先前导入到工作空间中的 CICS ECI 资源适配器。
关闭并保存服务器配置文件。
图 15. J2C 选项
在服务器上运行
选择 CompanyWeb 项目,弹出上下文菜单,单击 Run on Server。
为了选择现已正确地配置了 CICS ECI 资源适配器的新的服务器,请在显示的对话框中单击 Advanced按钮。
单击 Finish将把 Web 应用程序发布到应用程序服务器中,然后启动应用程序服务器和应用程序。Web 浏览器将被启动并显示测试页面(如下图所示)。
图 16. 测试页面
浏览文档
图 17. 浏览生成的技术文档
执行应用程序
在测试页面上,单击启动应用程序和详细页面(如下所示)的链接。
图 18. 应用程序的启动将打开一个会话并显示输入字段。
键入输入参数 Share_Value和 IBM。
单击调用 servlet 和 CICS 程序的 Read按钮。
在下图中,CICS 程序返回信息。
图 19. CICS 程序返回的结果
结束语
本文的第 1 部分为您演示了创建基于 Struts 的 Web 应用程序(这个程序使用 JCA 资源适配器连接到现有的 CICS 程序)的步骤。首先,我们使用 Application Developer 中的向导来创建企业服务。为了创建 Web 服务描述语言(Web Services Description Language,WSDL),我们从 COBOL 程序导入了数据描述。在配置了连接参数之后,我们使用 WSDL 生成 Java 代理并测试它以确保我们可以从 CICS 程序收发数据。
我们把代理打包到 jar 中并把这个 jar 用作 Web 应用程序模型向导的输入。在生成与 CICS 代理通信的 Struts Java 类和 JSP 之前,我们在向导中选择了要显示的字段并配置了某些基本的显示属性。然后,我们配置服务器,部署、启动并测试应用程序。
生成的应用程序符合 J2EE 标准并且可以被部署到能够提供可靠性、可伸缩性和所要求的性能的应用程序服务器。尽管它有基本的验证和错误处理,访问和显示数据,负责其它普通的但又必要的功能,但它不是万能的。更复杂的验证怎么办?业务规则怎么办?如何与其它 Web 页面集成?安全性注意事项?在生成的代码中,在哪里实现所有这些细节?这个应用程序看上去并不是特别吸引人。
生成的代码提供了这些问题的部分答案,因为生成的代码是清楚的,而且易于理解,有详细的文档,并可被修改以处理以上功能。Web 应用程序模型并不是被用来开发直接可用的、可立即运行的应用程序,而是开发基本的构件,您可以重新安排和使用这些构件以构造真实的可部署的应用程序。
本文的第 2 部分将讨论提供可立即部署的用户界面的任务。我将为您说明 Web 应用程序模型如何在开发期间为了把常见的外观和感觉包括到应用程序中而使用可扩展样式表语言转换(Extensible Stylesheet Language Transformations,XSLT)。
更多精彩
赞助商链接