- ·上一篇教程:使用 WebSphere Studio V5
- ·下一篇教程:样本 DB2 Web 服务总结(第二部分)
样本 DB2 Web 服务实现总结(第一部分)
管理联系人:Grant Hutchison, IBM DB2 解决方案集成中心
2001 年 2 月
Video Central for e-business 是个端对端样本解决方案,它提供了一套企业对企业(B2B)Web 服务,可以用这些服务来访问专为影片租赁业设计的 DB2 中心数据资源库。在本文中,作者探讨了目前尚在开发中的 IBM 解决方案 Video Central,它的前提是可能相互竞争的影片租赁店(在线的或实地的)可以共享一些客户和录像带标题数据。该共享数据可以使出租公司改进他们的日常运营,并为他们各自的客户提供增值服务。
在这第一篇文章中,我们描述了一个 Web 服务的样本应用程序 IBM Video Central,它使用了 DB2 Universal Database®(DB2 UDB)。这里简要介绍了其体系结构和关键技术。有关这方面的更多信息和可下载映象,请参考 http://www.ibm.com/software/data/developer/samples/video。在第 II 部分中,我们将描述如何通过引入文档访问定义扩展(Document Access Definition eXtension,DADX)来简化开发。
概述
IBM Video Central 是一个可运行的 Web 服务应用程序。Web 服务是用于集成电子商务应用程序的新的开发模型。它提供了在分布式计算环境中描述、发布、发现和调用业务逻辑的标准技术(请参阅图 1)。
图 1. Web 服务
Web 服务编程模型基于一些新兴技术,包括简单对象访问协议(Simple Object Access Protocol,SOAP)、Web 服务描述语言(Web Services Description Language,WSDL)和统一描述、发现和集成(Universal Description, Discover and Integration,UDDI)规范。SOAP 是用于调用 Web 服务的标准消息格式。SOAP 消息可以通过因特网标准协议 - 超文本传输协议(Hyper Text Transfer Protocol,HTTP)进行传送。Web 服务请求者使用 Web 服务提供者的 WSDL 文档来开发他们的应用程序。Web 服务提供者将其业务逻辑以 Web 服务形式发布给服务代理,服务请求者使用 UDDI 从服务代理那儿查找可用的服务。
IBM Video Central 是一个影片租赁应用程序的服务提供者。我们在文章“IBM Video Central for e-business:业务原理、需求和 Web 服务描述”中部分实现了该想法,可以在 DB2 开发者园地上找到这篇文章。为了简单起见,我们没有将可用的服务发布给服务代理,而是直接将 WSDL 文档提供给了服务请求者。显然,这并不影响对作为影片租赁服务提供者的 IBM Video Central 进行演示。为了说明由 IBM Video Central 提供的服务,我们还实现了一个使用 SOAP 来调用那些服务的样本客户机应用程序。
方案
IBM Video Central 是一个通用的影片租赁应用程序的 Web 服务提供者。它提供了一个中央数据资源库,可以通过已注册的基于 Web 的应用程序访问该资源库。我们设计了一个专用的与商家相关的 Web 服务:商家注册,它允许商家(例如,影像店)向 IBM Video Central 注册自己。一旦商家向 IBM Video Central 注册之后,它就能使用其它可用的 Web 服务。
我们设计了四个专用的与客户相关的 Web 服务。
- 客户注册(Customer Registration),这使已注册的商家能向 IBM Video Central 注册它们自己的客户。注册完客户之后,其它服务就可以存储、访问和分析关于该客户的有用信息。
- 客户违规(Customer Infraction),这使已注册的商家能向中央资源库中添加违规信息和从中查询违规信息。这允许商家跟踪这些客户的违规行为,而不必在其本地数据库中真正存储和管理这些数据。
- 客户已租借列表(Customer Rented List),这使得已注册的商家能添加和查询已租借的影片。在将来添加了数据挖掘和商业智能服务之后,该数据集将被证实是愈加有用。
- 客户感兴趣的列表(Customer Wish List),这使得已注册的商家能添加和查询客户表示将来有兴趣观看的影片名称。该影像店可以使用这些列表来确定哪些影片是有需求的,从而改变其库存采购计划。
体系结构
IBM Video Central 是作为三层应用程序来实现的。这种三层方法是一种灵活的基于组件的实现,旨在能方便地通过可扩展框架(图 2)来实现将来的增强功能。
Web 界面层利用了用于表示的 Java™Server Pages(JSP)和用来调用 Web 服务的 servlet。该方法在终端用户界面设计方面提供了最大限度的灵活性。通常,服务提供者并不关心这一层,而服务请求者则不然。我们提供了一个 Web 界面层的样本客户机作为服务请求者,来调用 IBM Video Central 的服务。
将业务逻辑层设计成使用 Web 服务作为抽象层。每个 Web 服务都定义了一套业务过程并用 WSDL 描述了接口。接下来,可以将 WSDL 接口发布到公共的或专用的 UDDI 注册中心。IBM Video Central 应用程序的关键组件 - 客户违规 - 使用 DB2 XML Extender©来管理用于存储和检索的客户违规资源库,因此可以在服务请求者(客户机)和服务提供者(IBM Video Central)之间传输包含违规信息的可扩展标记语言(eXtensible Markup Language,XML)文档。
通过 IBM Video Central 的数据访问(Data Access)组件来进行所有数据库访问,这是使用 IBM Data Access bean 实现的。DB2 UDB 是数据库服务器。
图 2. IBM Video Central 体系结构
从开发到生产
在这一节中,我们说明了开发电子商务应用程序的整个过程 - 从开发到生产,包括 IBM Video Central 和样本客户机。我们再来简要回顾一下 IBM 电子商务解决方案所使用的最新技术。
开发
IBM 电子商务应用程序的开发方式和其它传统应用程序的一样。在业务逻辑层设计好之后,可以使用 IBM 以下这些功能强大且完备的开发工具中的任意一种来开发应用程序:VsualAge®for Java(VAJ)以及 IBM XML 和 Web 服务开发环境(Web Services Development Environment,WSDE)。对于 IBM Video Central,VAJ 可选可不选(即使它提供了强大的功能,比如团队合作和可视化组合等等),而 WSDE 是必需的。原因是,WSDE 为 Web 服务提供了更多支持。
WSDE是一个集成工具套件,它既可用于开发基于 XML 和基于 Java 的 Web 应用程序,又可用于创建和访问 Web 服务。这个开发环境包括了 XML、Web 服务和 Java 工具,这些都被集成到公共用户界面和项目框架。XML 工具支持编辑 XML 代码、XML 模式定义(XML Schema Definition,XSD)和文档类型定义(Document Type Definition,DTD),以及生成可扩展样式表语言(eXtensible Stylesheet Language,XSL)。Web 服务工具支持从 Java bean、servlet 和 SQL 语句创建基于 SOAP 的 Web 服务,并支持创建访问 Web 服务的 Java 客户机代理和 Web 测试客户机。
WSDE 所提供的工具之一 RDB XML 映射编辑器(Mapping Editor),支持在关系表和 XML 模式之间的可视化映射定义。它可以:
- 将一个或多个关系表中的列映射到 XML 文档中的元素和属性;
- 生成由 DB2 XML Extender 所使用的文档访问定义(Document Access Definition,DAD)脚本。
- 可选地,它可以生成测试工具来测试生成的 DAD 文件。
对于 IBM Video Central 的业务逻辑层,Java bean 提供了到这些服务的接口。对于数据访问层,IBM Data Access bean 访问后端 DB2 资源库。
IBM Data Access bean提供了优于 java.sql 包中所提供的一组丰富的功能和增强函数:
- 高速缓存查询结果。可以立即检索 SQL 查询结果并将它们放入高速缓存中。应用程序可以移至高速缓存中的任何一个结果行,并且可以通过整个结果集的子集来检索和管理大型结果集。
- 通过结果高速缓存进行更新。应用程序可以使用标准的 Java 语句来更改、添加或删除结果高速缓存中的行,这些更改可以被传播到底层关系表中。
- 查询参数支持。可以将基本 SQL 查询定义为 Java String,用参数代替某些实际值。
- 元数据支持。StatementMetaData 对象包括基本 SQL 查询。可以将更高级别的数据(元数据)添加到该对象中,从而有助于将参数传递到查询中并与返回结果一起使用。
在 IBM Video Central 所提供的五个服务之中,客户违规使用 XML 文档来进行数据存储和检索。违规信息用 XML 格式表示并被分解到中央资源库中。进行查询时,将来自数据资源库的违规数据组合成 XML 文档。DB2 XML Extender 支持这种类型的数据访问。
DB2 XML Extender集成了 DB2 UDB 的强大功能和 XML 的灵活性。它能够存储和访问 XML 文档以及从现有的关系数据中生成 XML 文档。它可以将 XML 文档分解成关系数据,这指的是它可以解构文档并存储不带标记的元素或属性内容。它还提供了新的数据类型、函数和存储过程来管理 DB2 中的 XML 数据。
图 3 显示了“添加违规(Add Infraction)”请求的处理流程。包含违规数据的 XML 文档被送到 IBM Video Central 的客户违规 Web 服务。该服务调用 XML Extender 的存储过程 dxxShredXML() 并传递 DAD 和 XML 文档参数的值。然后 XML Extender 将违规数据分解到 DB2 数据库中。根据 DAD 中的 RDB 映射定义,该数据存储在 USERINFRACT 表中。
图 3.“添加违规”请求的处理流程
部署
WSDE 支持 Web 服务的部署。从 Web 服务的 Java 类生成 WSDL 文档。可以使用 UDDI 向服务代理发布这些 WSDL 文档,并将其提供给用于请求者应用程序的服务请求者。图 4 是一个 WSDL 文档示例。
图 4. 客户违规的 WSDL 文档
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="CustomerInfraction" targetNamespace="http://www.CustomerInfraction.wsdl.com/wrapperedService"
xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:cus="http://www.CustomerInfraction.wsdl.com/wrapperedService"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<message name="InprocessQueryRequestRequest"> <part name="meth1_inType1" type="xsd:int"/>
<part name="meth1_inType2" type="xsd:string"/> <part name="meth1_inType3" type="xsd:int"/>
<part name="meth1_inType4" type="xsd:string"/> <part name="meth1_inType5" type="xsd:string"/>
</message>
<message name="OutprocessQueryRequestResponse"> <part name="meth1_outType" type="xsd:string"/> </message>
...
<portType name="CustomerInfraction">
<operation name="processQueryRequest">
<input message="InprocessQueryRequestRequest"/> <output message="OutprocessQueryRequestResponse"/>
</operation>
...
<binding name="CustomerInfractionBinding" type="CustomerInfraction">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="processQueryRequest"> <soap:operation soapAction="urn:CustomerInfraction"/>
<input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:CustomerInfraction" use="encoded"/> </input>
<output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:CustomerInfraction" use="encoded"/> </output>
</operation>
...
</binding>
<service name="CustomerInfraction">
<documentation>WSTK 1.2 wrappered class CustomerInfraction as service</documentation>
<port binding="CustomerInfractionBinding" name="CustomerInfractionPort">
<soap:address location="http://localhost:80/soap/servlet/rpcrouter"/> </port> </service>
</definitions>
第一次生成 WSDL 文档时,同时还在 WebSphere®Application Server 3.5.2 上创建了 IBMSoapServer。它包含了一个用于调用 Web 服务的 rpcrouterservlet。
SOAP是用于在分散和分布式环境中交换信息的轻量级协议。它可能可以与其它各种协议一起使用。有关 SOAP V1.1 规范和其它 SOAP 参考资料,请参阅 www.w3.org/TR/SOAP。
生产
使用 WebSphere Application Server 3.5.2 将 IBM Video Central 的 Web 服务部署到 IBMSoapServer。该应用程序服务器的类路径指向这些服务的代码,通过 rpcrouterservlet 调用该服务。
样本客户机
样本客户机是对 IBM Video Central 中 Web 服务的服务请求者。在浏览器中使用 JSP 进行表示。该客户机从服务提供者那儿获得 WSDL 文档,并在 WSDE 中生成代理代码。代理代码是一系列的 Java 类,这些类将“存根”提供给远程服务。代理代码的示例如图 5 所示。
图 5. 客户违规的代理代码
public class CustomerInfractionProxy
{
private Call call = new Call();
private URL url = null;
private String SOAPActionURI = "";
private SOAPMappingRegistry smr = call.getSOAPMappingRegistry();
public CustomerInfractionProxy() throws MalformedURLException
{
call.setTargetObjectURI("urn:CustomerInfraction");
call.setEncodingStyleURI("http://schemas.xmlsoap.org/soap/encoding/");
this.url = new URL("http://localhost:80/soap/servlet/rpcrouter");
this.SOAPActionURI = "urn:CustomerInfraction";
}
...
public synchronized java.lang.String processQueryRequest(int meth1_inType1,
java.lang.String meth1_inType2, int meth1_inType3, java.lang.String meth1_inType4,
java.lang.String meth1_inType5) throws SOAPException
{
...
call.setMethodName("processQueryRequest");
Vector params = new Vector();
Parameter meth1_inType1Param = new Parameter("meth1_inType1", int.class,
new Integer(meth1_inType1), null);
params.addElement(meth1_inType1Param);
Parameter meth1_inType2Param = new Parameter("meth1_inType2",
java.lang.String.class, meth1_inType2, null);
params.addElement(meth1_inType2Param);
Parameter meth1_inType3Param = new Parameter("meth1_inType3", int.class,
new Integer(meth1_inType3), null);
params.addElement(meth1_inType3Param);
Parameter meth1_inType4Param = new Parameter("meth1_inType4",
java.lang.String.class, meth1_inType4, null);
params.addElement(meth1_inType4Param);
Parameter meth1_inType5Param = new Parameter("meth1_inType5",
java.lang.String.class, meth1_inType5, null);
params.addElement(meth1_inType5Param);
call.setParams(params);
Response resp = call.invoke(url, SOAPActionURI);
...
}
...
}
结束语
IBM Video Central 是 IBM 电子商务解决方案的一个样本,而且是用 IBM 所提供的最先进技术实现的。本文是对 IBM Video Central 样本应用程序的总结。更详细的信息(包括逐步的指南和代码)可以从 IBM Video Central 下载网站: http://www.ibm.com/software/data/developer/samples/video获得。





