评估自底向上方法
自底向上方法的显著优点包括:
能够快速地将遗留实现作为 Web 服务公开。
需要很少或根本不需要有关 WSDL 或 XML 的知识,因为 WSDL 文档可以由工具生成。
许多优秀的工具都支持这种方法。实际上,完善的工具不仅可以完成在提供程序端创建可部署、可执行的 Web 服务实现所需的全部工作,而且还可以完成允许在请求程序端通过请求访问该实现所需的全部工作。
自底向上方法的缺点包括:
所生成的定义 WSDL 文档中的数据类型的模式只派生于提供程序环境中的 Java 类,而非派生于基于任何标准的模式(请参见上面的清单 3)。
提供程序端的数据类型不可能是简单的 DTO,因为它们还包括其他的业务逻辑。这样的业务逻辑无法在请求程序端重新建立。
所生成的模式被嵌入到 WSDL 中,这使得在其他 Web 服务的定义中重用该模式可能比较困难。当然,可以从原始的 WSDL 文档中提取该模式。
服务器端的 Web 服务实现的开发和客户端 Web 服务请求程序的开发不能并行进行。服务器端的框架和 DTO 必须在可以生成 WSDL 文档(可以用于生成客户端存根和 DTO)之前进行开发。
对接口的递增更改更加难于管理。例如,如果更改实现服务的类的接口并重新生成 WSDL,则该 WSDL 文档可能会发生比较重大的改变,从而导致无法与现有的客户机进行互操作。这主要是因为:服务器端认为实现服务的类是主接口,而客户端则认为服务器端提供的 WSDL 是主接口。这种分歧会导致两个接口不同步,而且难于调试和修复。
嵌入的模式类型的名称空间通常从服务器端 JavaBean 的 Java 包的名称生成。因此,如果该包的名称发生改变,名称空间就会相应地发生改变,这意味着类型不再是一致的。大多数工具支持包到名称空间的映射,但这必须在工具执行的过程中显式地进行设置。
自顶向下的开发
在自顶向下的开发过程中,客户端和服务器端的开发人员使用 WSDL(“顶部”)为各自的环境生成必要的构件(“底部”)。自顶向下的开发能够逐渐成为大家普遍接受的实践至少有两个重要的原因。第一个原因是,在许多情况下,描述服务的 WSDL 在某个注册中心(如 UDDI)中公开可用。借助目前可用的工具,不仅服务器端开发人员可以从 WSDL 开始定义由 WSDL 定义的 portType 元素的新实现,而且客户端开发人员也可以从相同的 WSDL 开始开发该服务的客户机。第二个原因(这甚至是一个更为重要的原因)是,该行业的趋势是使用 XML 模式定义 (XSD) 来定义可互操作的数据标准。这些使用 XSD 定义的行业标准数据类型可能会成为定义新的 Web 服务接口的理想选择。因此,自顶向下的开发模式从标识或开发与 Web 服务领域相关的 XML 模式开始,然后为该 Web 服务创建一个 WSDL 文档。在这种模式下,客户端和服务器端的开发可以并行启动。
自顶向下的开发模式包括以下开发步骤(如图 2 所示):
标识或创建一个与问题域(描述了 Web 服务操作的输入和输出数据类型)相关的 XML 模式。这些数据类型应该定义在一个或多个模式 (.xsd) 文件中。您可以使用标准的模式开发工具来创建或修改必要的模式。
清单 6. 示例 HelloWorldData.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified" targetNamespace="http://dto.hello.com"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:impl="http://hello.com"
xmlns:intf="http://hello.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<complexType name="HelloWorldData">
<sequence>
<element name="value" nillable="true" type="xsd:string" />
</sequence>
</complexType>
</schema>
创建一个新的 WSDL 文件,其包含:一个 types 元素,该元素导入(但不包括)步骤 1 中的模式文件;一个 portType 元素,该元素又包含 operation 元素,用于引用定义在导入的模式中作为输入和输出参数的数据类型。创建该 WSDL 的推荐样式是包装的文档文本 (Wrapped-document Literal) 样式,该样式遵循 WS-I,用于最大限度地与 .NET 环境进行互操作。像 WebSphere Studio 系列一样完善的企业应用程序开发工具包括 WSDL 编辑器,该编辑器为用户创建 WSDL 文档提供了巨大的帮助。
清单 7. 示例 HelloWorld.wsdl 中的 schema 元素(其中包含 import 元素)
<schema elementFormDefault="qualified" targetNamespace="http://hello.com"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:impl="http://hello.com"
xmlns:intf="http://hello.com" xmlns:tns2="http://dto.hello.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
<import namespace="http://dto.hello.com" schemaLocation="WorklistData.xsd"/>
生成提供程序端和请求程序端的 JAX-RPC 构件。请注意,下面描述的这些步骤可以由两个不同的独立团队并行完成。每一端的实现平台也可以不同。
