使用 PowerDesigner 9.5 创建 Web 服务
Sybase 公司PowerDesigner 总设计师Xiao Wang撰稿
Web 服务允许您以标准格式提供现有的或新增的功能,并且允许用户和应用程序从任何位置访问它们。
PowerDesigner 9.5 同时针对 Microsoft .NET 和 Java 引入了完善的 Web 服务设计和生成机制。使用 PowerDesigner 9.5,您可以专注于 Web 服务的设计,而将所有必需的生成、实现构造的任务交给 PowerDesigner 完成。
Web 服务概述
Web 服务是一种接口,它描述了在网络上可通过 SOAP 消息进行访问的操作集合。
Web 服务的接口和部署位置(可选) 由 WSDL 说明。WSDL 是一种声明数据类型、消息、端口类型和端口(可选)的 XML 文档。通过 WSDL,用户可以知道应该发送哪种格式的 SOAP 消息来调用 Web 服务以及返回消息的格式为何。
为了能使用户查找到所需的 Web 服务,服务提供者可能会在 UDDI 注册服务中发布 WSDL 文档。这样,用户就可以使用 UDDI 注册服务来搜索 Web 服务。
若要调用 Web 服务,用户可以向部署 Web 服务时所在的访问点 URL 发送 SOAP 消息,或者使用可简化此调用过程的代理类。SOAP 消息也是 XML 文档。
PowerDesigner 的 Web 服务功能
PowerDesigner 9.5 允许您新建 Web 服务组件、通过对 WSDL 进行反向工程来创建 Web 服务组件、浏览 UDDI 、搜索 WSDL、从 Web 服务组件的定义生成 WSDL、生成 .NET(C# 和 VB .NET)的服务器端代码、生成 .NET 的客户端代理、生成 Java(JAX-RPC 和 JAXM)的服务器端代码以及生成 Java 的客户端代理。
为了设计 Web 服务组件,PowerDesigner 使用了 UML 类图、组件图和部署图。Web 服务由组件图的组件表示,而已部署的 Web 服务则由部署图的组件实例来表示。
创建 Web 服务组件
创建 Web 服务组件有五个步骤。首先是要创建面向对象模型 (OOM)。您可以选用以下语言中的任一种:C#、Visual Basic .NET 或 Java。在此模型上会自动附加用于 WSDL 的扩展模型定义 (XEM)。XEM 定义了 WSDL 的生成模板和扩展属性。
第二步是创建类。最好是先创建一个程序组 (Package),然后再在此程序组下创建类。
第三步是使用 Web 服务向导将创建的类转换成 Web 服务组件。为此您可以右键单击该类,然后选择“创建 Web 服务组件”命令,或在选中该类后选择“工具>创建 Web服务组件”命令。图 1 显示了一个 Web 服务向导的示例。Web 服务类型可以是接口或实现。如果选择“接口”,则表明您只希望定义此 Web 组件并生成相应的 WSDL。对于 .NET,此组件类型为“标准”,其 Web 服务将通过 .asmx 文件来实现。对于 Java,此组件类型可能是“标准”、“服务程序”或“无状态会话 Bean”。这几种 Java 组件类型的实现方法分别是:“标准”类型使用 JAX-RPC、“服务程序”类型使用 JAXM,而“无状态会话 Bean”类型将使用 J2EE (JSR109) Web 服务规范。当向导结束时会创建一个组件和类。图 2 显示了组件图中的组件符号示例。
图 1 Web 服务向导
图 2 组件符号
第四步是添加 Web 方法。您需要新建一个操作 (Operation)、打开该操作的属性页、单击“Web 方法”复选框、定义参数和返回类型以及编写该操作的实现代码。图 3 显示了 Web 方法 GetStockQuote 的实现示例。
图 3 Web 方法 GetStockQuote 的实现示例
最后一步是对 WSDL 生成进行自定义。可以自定义参数和返回值的 WSDL 数据类型、操作的扩展属性以及组件的属性和扩展属性。若要检验生成的 WSDL,您可以打开组件属性页的 WSDL 选项卡。生成 WSDL 的任务可以交给 PowerDesigner 完成,也可以由您自行定义(用户定义)。如果 Web 服务组件来源于对 WSDL 的反向工程,原始的 WSDL 将得到保留。图 4 显示了一个生成的 WSDL 的示例。
图 4 生成的 WSDL 的示例
您可以在类属性页的“预览”选项卡中预览生成的实现代码。
您可以使用部署图、节点和组件实例来仿建已经部署的 Web 服务组件。此外,还可以在“节点”中定义服务器的 URL 以及在“组件实例”中定义服务的 URL。
对 WSDL 进行反向工程
WSDL 可以仅定义 Web 服务接口,也可以同时定义接口和访问点的 URL。Web 服务接口可能被多个服务提供者用来提供相同的服务,当然,这些服务会具有不同的实现和访问点。如果拥有 WSDL 文档的文件路径或 URL,您就可以通过对它进行反向工程来创建 Web 服务组件,之后可以定义自己的实现方法或将创建的 Web 服务组件保存在库中供以后再次使用。您在查找感兴趣的 WSDL 时,可以使用 UDDI 浏览器在 UDDI 注册服务中进行搜索。
为了对 WSDL 进行反向工程,需要用 C#、VB .NET 或 Java 中的任意一种语言创建 OOM。然后选择“语言>导入 WSDL”命令并输入 WSDL 文件的路径或 URL。进行反向工程之后,会在组件图中创建一个组件,同时在类图中创建一个类。所创建的类将仅包含该 Web 服务的操作信号,若想实现该 Web 服务,还需要定义这些操作的实现代码。
在 UDDI 注册服务中搜索 WSDL
如果希望搜索在 UDDI 注册服务中注册的 WSDL,请打开“导入 WSDL”窗口,然后单击“浏览 UDDI”按钮。通过“浏览 UDDI”窗口(见图 5),您可以选择 UDDI 运营商、搜索条件和搜索类型,并可以按实体名称、服务名称或 WSDL 名称进行搜索。此外,您还可以预览找到的WSDL。
图 5 “浏览 UDDI”窗口
生成 .NET 类型的 Web 服务
对于 .NET 服务器端代码,PowerDesigner 会生成一个 .asmx 文件。这种 Web 服务的实现类可以在上述的 .asmx 文件中生成,也可以在外部生成。此实现类所使用的语言可以是 C# 或者 VB .NET。在类属性页的“预览”选项卡中,可以预览 .asmx 文件和相应的实现类代码。图 6 显示了 C# 语言的 .asmx 文件示例。
图 6 C# 语言的.asmx 文件示例
PowerDesigner 还可以生成客户端代理类来简化 Web 服务的调用。为生成客户端代理类,PowerDesigner 使用了 Visual Studio .NET 附带的 wsdl.exe 程序。
若要生成 WSDL、服务器端代码和/或客户端代理,请选择“语言>生成 C# 代码”或“语言>生成 VB .NET 代码”命令。如果要生成客户端代理,可以在“任务”选项卡中选择“生成 Web 服务客户端代理”选项。图 7 显示了可用的生成任务。如果这个类不是在 .asmx 文件内部生成的,您将可以对这些 C# 代码或 VB .NET 代码进行编译。不过,在编译 C# 或 VB .NET 文件时,您必须定义 CSC 或 VBC 变量来指示 csc.exe 或 vbc.exe 命令的位置。
在部署 Web 服务时,只需要将IIS 目录下的 .asmx 文件和相应的类文件进行复制:C:\Inetpub\wwwroot\<程序组名>。其中,<程序组名> 是程序组的名称。要测试此 Web 服务,可以在浏览器中输入以下 URL: http://<主机名>/<程序组名>/<服务名>.asmx
图 7 Web 服务的生成任务
生成 Java 类型的 Web 服务
如果 Web 服务的实现类型为“标准”,PowerDesigner 将使用 JAX-RPC 来实现。如果实现类型为“服务程序”,PowerDesigner 将使用 JAXM 来实现。如果实现类型为“无状态会话 Bean,则 PowerDesigner 将使用 J2EE (JSR109) Web 服务规范来实现。JSR109 尚未正式颁布。
JAX-RPC 定义了 RPC 类型的 Web 服务调用。虽然它易于开发和使用,但为了避免复杂的对象/XML 映射,它只能局限于简单的消息格式。而基于 JAXM 的 Web 服务组件显然更具优越性,它允许您灵活地处理复杂的消息结构。
若要使用 JAX-RPC 或 JAXM,您需要安装 Java Web Services Developer Pack (JWSDP)。此程序包可从 Sun 公司的网站下载。在部署 JAX-RPC 或 JAXM 类型的 Web 服务组件时,需要有支持 JAX-RPC 或 JAXM 的服务器。支持 JAX-RPC 或 JAXM 的 Apache Tomcat 附带提供了 JWSDP。
至于基于 JAX-RPC 的 Web 服务组件,您只需实现其 Web 方法的代码。若要生成 WSDL、服务器端代码和/或客户端代理,可选择“语言>生成 Java 代码”,然后选择“使用 XRPCC 工具生成 WSDL(服务器端)”和/或“使用 XRPCC 工具生成 Web 服务的代理代码”命令(见图 8)。XRPCC 命令是 JWSDP 的一个工具。它可以生成 JAX-RPC 类型的服务器端代码或客户端代理。在部署生成的 Web 服务时,需要创建一个包含所有生成文件的 .WAR 文件,并将此 .WAR 文件部署在支持 JAX-RPC 的服务器上,比如说 Apache Tomcat。
图 8 JAX-RPC 生成任务
对基于 JAXM 的 Web 服务组件而言,您需要实现其 onMessage 操作。onMessage 操作将按照在 WSDL 中的指示,接收并处理输入的 SOAP 消息并构建返回消息,以及将此消息返回。要生成 WSDL 和 JAXM 类型的 Web 服务,请选择“语言>生成 Java 代码”命令,然后选择“构建 Web 组件,创建 Web 应用程序 WAR”命令(见图 9)。该命令会对 JAXM 服务程序代码进行编译并创建 WAR 文件。要部署此 JAXM 服务程序,您可以将上述 WAR 文件部署在支持 JAXM 的服务器上,比如说 Apache Tomcat。
图 9 JAXM 生成任务
至于基于无状态会话 Bean 的 Web 服务组件,由于 JSR109 规范尚未正式颁布,因此目前还不能使用。
下一步要增强的功能
J2EE (JSR109) Web 服务规范不久将面世,供人们使用。通过它,您可以将无状态会话 Bean 用作 Web 服务实现的利器。它可以让现有功能以 Web 服务的新面目出现,同时也可以新建 Web 服务。PowerDesigner 9.5 附带提供了基于早期JSR109 规范的版本,该版本尚待进一步的认证。等该规范正式颁布后,我们将提供维护版本以实现对它的完全支持。
PowerDesigner 的新版本还将支持 Web 服务的综合标准。
结论
PowerDesigner 9.5 简化了 Web 服务的设计和生成过程。只要懂得如何创建类和方法,就能知道如何创建 Web 服务!您可以使用 PowerDesigner 设计、创建 Web 服务,以及对它进行反向工程和为其创建文档。如果希望重复使用这些 Web 组件,您可以创建一个 Web 服务组件库,并使用版本库 (Repository) 来管理不同版本的 Web 组件。