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