posts - 496,comments - 227,trackbacks - 0

级别: 中级

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 中,该元素可被忽略,也可以恰好出现一次。另外,查看数据类型。注意,号码定义为 intchecknumberintdatedateheaderstring,以及 amountfloat












清单 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 中以黑体显示。注意 address2address3,补充的额外地址行非必需。接下来定义贷款申请表复型。





回页首


贷款申请表

如果银行不发放贷款,我们要如何生存?这里定义的数据结构包括贷款申请表信息和贷款状态信息。我们首先定义贷款申请表复型,参见 清单 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 阅读(1703) 评论(1)  编辑  收藏 所属分类: AXISJAVA

FeedBack:
# re: 用 Apache Geronimo 和 Axis2 实现在线银行,第 1 部分: 服务:布设框架(1)
2008-07-02 16:31 | 路过
这个例子在IBM网站上貌似得有会员才能看。博主很有奉献精神!超赞!!!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: