使用 Web 服务工具生成提供程序端构件。工具的范围从 Apache Axis 或 WebSphere Application Server 中的命令行驱动的 WSDL2Java 到 WebSphere Studio 系列中的 Web 服务向导。这些工具为定义在 WSDL 的 types 元素中的每个复杂类型生成一个 Java 类 (DTO)。它们还生成一个 POJO 或一个无状态会话 EJB 框架服务实现,含有 portType 元素内的每个操作的方法。这些工具还可以生成 JAX-RPC 将该实现部署为应用程序服务器中的 Web 服务所需的任何其他提供程序端构件。这些构件的例子包括 webservices.xml 文件。还可能包括由工具生成的其他一些应用程序服务器依赖的元数据文件。在运行工具后,服务器端的开发人员必须实现正确的业务逻辑以执行该服务定义中的操作语义。
清单 8. WSDL2Java 为服务器端生成的构件列表
Java Resources/com/hello/HelloWorld.java - Service Endpoint Interface for server
Java Resources/com/hello/HelloWorldSoapBindingImpl.java - Server-side Stub implementation
Java Resources/com/hello/dto/HelloWorldData.java - Server-side DTO implementation
Java Resources/com/hello/dto/HelloWorldData_Deser.java - Deserialize DTO from XML message
Java Resources/com/hello/dto/HelloWorldData_Helperjava - Helper class that contains DTO metadata
Java Resources/com/hello/dto/HelloWorldData_Ser.java - Serialize DTO into XML message
WebContent/WEB-INF/wsdl/HelloWorld.wsdl - WSDL for client request
WebContent/WEB-INF/webservices.xml - JAX-RPC server deployment descriptor
WebContent/WEB-INF/ibm-webservices-bnd.xmi - WebSphere-specific binding extensions
WebContent/WEB-INF/ibm-webservices-ext.xmi - WebSphere-specific extensions
WebContent/WEB-INF/HelloWorld_mapping.xml - WSDL to Java mapping metadata
使用 Web 服务工具为服务请求程序从 WSDL 文档生成 DTO、SEI和客户机存根实现。该过程与上述自底向上模式中的步骤 4 完全相同。同前面一样,客户端开发人员必须使用存根调用客户端业务逻辑中的服务。请参见清单 5 中为客户端生成的示例构件。

图 2. 自顶向下的开发模式
评估自顶向下方法
自顶向下方法的优点包括:
支持使用基于现有标准的 XSD 类型。请参见上面的清单 6 和清单 7 以获得相关示例。
在为当前的服务开发了新的模式类型后,只需将最新开发的 XSD 导入到其他服务中,就可以轻松地将其重用于其他服务。
允许客户端和服务器端并行地独立开发。
通过更改 WSDL 本身,最佳地管理服务的递增更改。由于 WSDL 是客户端和服务器端的公共接口(或契约),因此可以轻松地管理这些更改,而不影响与现有请求程序或提供程序的互操作性。
这些工具将使用定义在 WSDL 中的名称空间来确定生成的 JavaBean(或 DTO)的包名。大多数工具都支持名称空间到包名的映射。从 WSDL 开始开发 Web 服务的优点是,客户端和服务器端都可以使用不同的包名映射,而不对访问服务产生影响。
自顶向下方法的缺点包括:
需要有关 WSDL 和 XSD 的知识,因为必须手动生成或操作这两者。即使利用现有的完善工具来生成 WSDL 和 XSD,也仍然需要详细了解 WSDL 和 XSD 的结构,以确保遵循标准并获得最佳性能。
支持自顶向下方法的工具通常要比支持自底向上方法的工具有更多的限制,但这种情况正在逐渐改进。例如,许多工具不能正确地处理导入模式而不是嵌入模式的 WSDL 文件,而且也缺少对生成包装的文档文本样式的 WSDL 的全自动支持。导入模式最常见的问题是,XDS 必须与 WSDL 在同一目录中,并且相对路径名始终无效。
值得注意的是,您可以使用自底向上流程生成驱动自顶向下流程的 WSDL。例如,您可以使用自底向上流程创建发布在 UDDI 注册中心内的 WSDL。我们推荐您在进行上述操作时,使用工具将 WSDL 的 types 元素中的模式与该定义的其他部分分开,以便可以重用该模式。任何自顶向下方法中的要点是:一旦生成 WSDL(手动生成或者从代码中生成),该 WSDL 就会立刻成为请求程序和提供程序所使用的主接口。
往返开发
开发 Web 服务的两种主要方法是自顶向下和自底向上。某些开发人员还采取了第三种方法,这主要是因为工具都或多或少地存在一些缺点或不足,并且开发人员也缺乏对 Web 服务工具和技术的全面了解。在所谓的往返开发中,开发人员开始时使用一部分自底向上流程,接着再使用一部分自顶向下流程。首先,请遵循自顶向下方法中的步骤 1-3a,这主要是为了生成所谓的 DTO(可能根据基于标准的 XSD)。DTO 用于 POJO 或 EJB 的接口中,它是通过手动创建的,用于提供与 WSDL 文档中定义的 portType 操作相对应的公共方法。然后,请遵循自底向上方法中的步骤 2-4。跳过自顶向下方法中的步骤 3b 是因为自底向上方法中步骤 3 生成的 WSDL 用于客户端。整个流程如图 3 所示。

图 3. 往返模式,WSDL – Java – WSDL 的开发模式
