级别: 中级
Nicholas Chase
(ibmquestions@nicholaschase.com), 自由作者, Backstop Media, LLC
2006 年 5 月 25 日
使用 Apache Geronimo 和 Axis2 构建复杂 Web 服务应用程序是一项错综复杂的任务,本系列将深入研究相关内容。本系列教程由 3 个部分构成,引领您构建一个示例在线银行 Web 服务,文中介绍了整个流程的每个步骤,因此新用户可快速掌握概念并构建一个完整的 Web 服务和可与 Web 服务连接并通信的 Web 界面客户机。在第一期中,将为您介绍示例 Web 服务和使用 WSDL 的 Web 服务,构建并编译 WSDL 文件,然后在 Geronimo 上测试及部署它。
开始之前
本系列教程分 3 部分,面向对使用 Apache Geronimo 和 Apache Axis2 开发大型 Web 服务有兴趣的读者。了解如何构建 WSDL 文件及与在线银行系统相关的一些操作。然后使用 Axis2 将 WSDL 文件编译为 Web 服务,并在 Geronimo 上进行部署和测试。
关于本系列
本系列中将创建一个在线银行 Web 服务示例。使用 WSDL 和 Axis2 创建的 Web 服务将包含一个 Apache Derby 数据库,用于保存交易数据、账户数据和账单支付数据。您会将 Axis2 作为 Apache Geronimo 上的 Web 应用程序部署,新 Web 服务将是在 Axis2 中部署的 Axis 归档。您在示例中可能会用到在线银行中的多个命令,包括查看账户、搜索交易、划拨资金和支付账单。您还会创建一个客户机 Web 应用程序来连接到 Web 服务,以查询信息及执行交易 —— 主要是为了调用在 Web 服务中实现的操作。
在本系列的第 1 部分中,将在 WSDL 中构建在线银行 Web 服务的基础设施。在第 2 部分中,将通过在 Apache Derby 数据库中存储账户和交易信息来构建 Web 服务的功能。在最后的第 3 部分中,将为 Web 服务创建功能完整、基于 Web 的客户机用户界面(UI),用户可在其中登录、进行在线银行活动及注销。
关于本教程
本教程首先介绍示例 Web 服务,并展示使用 WSDL 的多种 Web 服务。您将使用 Axis2 将 WSDL 文件转换为 Java™ 代码,其中将实现一些简单的功能,以测试客户机与 Web 服务之间的通信。测试环境包括作为 Geronimo 上的模块部署的 Axis2、作为 Axis2 内的归档部署的 Web 服务,以及与 Web 服务通信的一个简单 Java 客户机。
前提条件
要学习本教程,需要具备以下工具:
- Apache Geronimo —— 下载 Apache Geronimo V1.0,您将在 Geronimo 上部署 Axis2 Web 服务。
- Apache Axis2 —— 下载 V0.94 Axis2 WAR 及二进制发行版,用于从 WSDL 构建 Web 服务。
- Apache Ant —— 下载 Apache Ant,由于 Axis2 的 WSDL2Java 工具为构建 Web 服务创建了一个便捷的 Ant build.xml 文件,因此您需要用到此工具,这将使 Web 服务源代码的构建更容易。
- Java 代码 —— 下载最新版的 Java 1.4,Java 1.4.10,Geronimo、Axis2 和 Ant 都需要用到它。
本教程假设您具备 Java 语法和编写代码的基本知识,但不必了解 Axis2 或特定 Geronimo 的相关知识。
在线银行 Web 服务概述
下面简要介绍本系列教程的最终成果 —— 在线银行 Web 服务示例。该 Web 服务涵盖了在线银行体验的几种特性,包括查看账户和交易、划拨资金、申请贷款和在线支付账单。
账户
登录到 Web 服务之后,您会看到您所拥有的账户及其余额。出于安全性方面的考虑,登录过程包括发送用户名和密码,以及接收保证安全性的二进制令牌。因此,在您登录之后,仅需发送该令牌即可使 Web 服务识别您的身份。之后您就可以单击查看账户中的交易,见下节。
交易
您在银行中做的每一件事都涉及交易,各交易的历史 —— 可在各账户中查看其历史 —— 记录在您的账户中。Web 服务还使您根据支票编号、金额或日期搜索交易。这使您可在纳税时更轻松地回溯和查找账户中的交易。您可将资金从一个账户划拨到另外一个账户中,这也作为账户的一项交易记入日志。
申请贷款
本特性允许您通过在线银行 Web 服务申请贷款。您可输入贷款类型、欲贷金额、偿还时间。成功提交贷款申请表后,您可查看每笔贷款的状态。
支付账单
在线账单支付服务现已非常普及。这种服务使您能够通过银行账户支付账单。但在支付账单之前,必须首先添加作为支付对象的人或公司,我们称之为收款方(payee)。Web 服务允许您查看、添加和编辑账户中的收款方。在账户中设置好收款方后,您就可以向其偿还债务或划拨资金了。所支持的支付类型有两种:一次性支付 和 定期支付。您可通过 Web 服务执行各类支付。每次支付都有一个与其相关的日期,在支付发生之前(待定支付),允许您编辑其内容。
在下一节中,我们将开始构建在线银行 Web 服务的 WSDL。
数据结构
您在 Web 服务中支持的消息及操作需要一些数据结构用于来回传递数据,在 WSDL 中也称为复型。这些数据结构是通过简单对象访问协议(SOAP)传送的,并且是使用 WSDL 定义的。Web 服务的操作需要 6 个数据结构,我们将从最常用的一种开始,即交易。
交易
在您的在线银行 Web 服务上下文中,两个账户(或一个账户和银行)是所涉两方。就我们的在线银行应用程序而言,一个交易可能有 5 项属性。下面看看这些属性,参见 清单 1。现在创建一个 WSDL 文件 —— OnlineBanking.wsdl,将 Transaction complexType
放置在其中。
Transaction complexType
中的 5 个元素在 清单 1 中显示为黑体。所有必需元素均以 minOccurs="1" maxOccurs="1"
表示。这表示该元素号应至少出现一次,且最多出现一次,也就是恰好一次。注意 checknumber
非必需,因为 minOccurs="0"
,这表示在一个 Transaction
中,该元素可被忽略,也可以恰好出现一次。另外,查看数据类型。注意,号码定义为 int
、checknumber
和 int
、date
和 date
、header
和 string
,以及 amount
和 float
。
清单 1. 交易
<xsd:complexType name="Transaction">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1"
name="number" type="xsd: int" />
<xsd:element minOccurs="0" maxOccurs="1"
name="checknumber" type="xsd: int" />
<xsd:element minOccurs="1" maxOccurs="1"
name="date" type="xsd: date" />
<xsd:element minOccurs="1" maxOccurs="1"
name="header" type="xsd: string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="amount" type="xsd: float" />
</xsd:sequence>
</xsd:complexType>
|
接下来将介绍收款方复型。
收款方
收款方接受您通过在线银行支付的账单。因此,需要几个字段来获得地址和账单金额信息。为您的 WSDL 文件添加收款方复型,参见 清单 2。
清单 2. 收款方
<xsd:complexType name="Payee">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1"
name="name" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="address1" type="xsd:string" />
<xsd:element minOccurs="0" maxOccurs="1"
name="address2" type="xsd:string" />
<xsd:element minOccurs="0" maxOccurs="1"
name="address3" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="city" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="state" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="zip" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="phoneAreaCode" type="xsd:int" />
<xsd:element minOccurs="1" maxOccurs="1"
name="phonePrefix" type="xsd:int" />
<xsd:element minOccurs="1" maxOccurs="1"
name="phoneSuffix" type="xsd:int" />
<xsd:element minOccurs="1" maxOccurs="1"
name="accountToPay" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="nameOnBill" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="alias" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
|
对于邮汇,您可以想到,需要的所有必需数据,在 清单 2 中以黑体显示。注意 address2
和 address3
,补充的额外地址行非必需。接下来定义贷款申请表复型。
贷款申请表
如果银行不发放贷款,我们要如何生存?这里定义的数据结构包括贷款申请表信息和贷款状态信息。我们首先定义贷款申请表复型,参见 清单 3。
清单 3. 贷款申请表
<xsd:complexType name="LoanApplication">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1"
name="loanType" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="amount" type="xsd:float" />
<xsd:element minOccurs="1" maxOccurs="1"
name="termMonths" type="xsd:int" />
<xsd:element minOccurs="1" maxOccurs="1"
name="joint" type="xsd:boolean" />
<xsd:element minOccurs="1" maxOccurs="1"
name="percentFinanced" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
|
各字段都包括贷款申请表中的典型数据。接下来将贷款状态添加到您的 WSDL 中,如 清单 4 所示。
清单 4. 贷款申请表状态
<xsd:complexType name="LoanApplicationStatus">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1"
name="loanNumber" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="approved" type="xsd:boolean" />
<xsd:element minOccurs="1" maxOccurs="1"
name="denied" type="xsd:boolean" />
</xsd:sequence>
</xsd:complexType>
|
每笔贷款都获得一个号码以及一个与其相关的批准或拒绝状态。如果它既未得到批准,也未被拒绝,则该贷款尚未处理。接下来介绍与账单支付相关的结构。
账单支付
支付账单要求您输入信息,如支付金额、支付对象,以及是否为定期支付等。接下来的两个清单展示了两种结构,供您参考。向您的 WSDL 文件中添加账单支付复型,参见 清单 5。
清单 5. 账单支付
<xsd:complexType name="BillPayment">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1"
name="payeeName" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="account" type="xsd:int" />
<xsd:element minOccurs="1" maxOccurs="1"
name="amount" type="xsd:float" />
<xsd:element minOccurs="1" maxOccurs="1"
name="date" type="xsd:date" />
<xsd:element minOccurs="1" maxOccurs="1"
name="notes" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="recurring" type="xsd:boolean" />
<xsd:element minOccurs="0" maxOccurs="1"
name="recurringData"
type="xsd1:RecurringBillPayment" />
</xsd:sequence>
</xsd:complexType>
|
这里显示的金额即为您所支付的金额。如果是定期支付,则此金额为您每次支付的金额,所以日期将为起始日期。另外,注意这里 recurring
指定支付是否为定期支付,如果是,则定义 recurringData
(注意其 minOccurs
定义为 0
)。recurringData
元素引用 RecurringBillPayment
复型,如 清单 6 所示。将其添加到您的 WSDL 中。
清单 6. 追加定期账单支付数据
<xsd:complexType name="RecurringBillPayment">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1"
name="finalPayment" type="xsd:float" />
<xsd:element minOccurs="1" maxOccurs="1"
name="frequency" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1"
name="totalNumberOfPayments" type="xsd:int" />
<xsd:element minOccurs="1" maxOccurs="1"
name="recurringType" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
|
清单 6
中的数据直接填充 清单 5 所示复型。在这里,您的最后支付为 finalPayment
字段的值,frequency
则为支付账单的周期。recurringType
字段表示账单金额是否为固定数量,也就是说表示您是否可在下一次提交之前更改金额。接下来为您介绍需要通过 WSDL 公开的几种不同操作。
posted on 2006-12-29 19:38
SIMONE 阅读(1812)
评论(1) 编辑 收藏 所属分类:
AXIS 、
JAVA