Confidential©2009iSoftStoneCorporation.AllRightsReserved.JavaWebService开发系列之基础篇南京研发四部-胡来喜Confidential©2009iSoftStoneCorporation.AllRightsReserved.目录WebService1Soap2WSDL3Demo4Confidential©2009iSoftStoneCorporation.AllRightsReserved.WebService简介•WebService是什么是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务,它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行是一种新的web应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过web调用是一个应用组件,它逻辑性的为其他应用程序提供数据与服务,各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来访问WebService,通过WebService内部执行得到所需结果实际上,WebService的主要目标是跨平台的可互操作性。Confidential©2009iSoftStoneCorporation.AllRightsReserved.补充说明1.访问一个WebService实际上可以看作调用一个函数,唯一不同的就是这个函数是远程的,这么一说,它和RMI就没有什么本质的区别了。既然是一个函数,当然要有函数的声明了,完成这个工作的就是WSDL,它详细的定义函数的原型,包括函数名、入口参数、出口参数,这就是WSDL中opertion完成的工作。既然是一个远程的函数,还要涉及与远程地址的一个绑定,这是WSDL中service的任务。Confidential©2009iSoftStoneCorporation.AllRightsReserved.2.既然是远程访问,就一定要有一个访问协议,WebService的访问协议就是SOAP,SOAP建立在XML之上,不同的就是对XML原本没有限制的格式加上了一些限制,需要有envelope,在envelope中,还要分header和body。如果利用SOAP开发WebService的程序,那就需要根据WSDL的定义来自行组装SOAP包,这显然要比利用WSDL直接面向WebService开发要复杂一些。JAXM是一个利用SOAP进行通信的开发包,它简化了SOAP消息的打包过程。Confidential©2009iSoftStoneCorporation.AllRightsReserved.3.SOAP是建立在XML之上的,那么显然XML的开发包同样适合于SOAP。在这个层次上开发WebService,除了要完成上一层的工作外,还要自行按照SOAP的格式组装SOAP消息,这显然又增加了工作量。XML的开发工具就比较多了,从最简单的SAX和DOM到DOM4J、JDOM,还有不少XML到对象绑定的工具,如JAXB、Castor等等。其实,不考虑WebService,完全用XML做通信协议的情况也并不少见。知晓XML-RPC的存在,就不难理解了XML做通信的含义了。截至到这里所讨论的内容,Sun提供了JWSDP(JavaWebServiceDeveloperPack),其中包含从XML解析到WSDL生成的全套解决方案。Confidential©2009iSoftStoneCorporation.AllRightsReserved.4.上面讨论的所有东西实际上都还停留在传递消息的内容上,并未涉及通信的过程。不要一看到WebService的Web就想当然认为它只能通过HTTP来传输。前面的讨论可以看出,所有的消息内容与传输并无直接关系,所以,无论是以HTTP传输,还是SMTP或是自定义的协议都没有问题。在这个层次上开发WebService,前面的种种险阻之外,还要完成对XML的手工解析工作。这里还是以最常见的HTTP方式来讨论。HTTP的开发就将Server和Client区别对待,Server的实现通常的选择是Servlet,让WebServer替我们完成HTTP协议的解析可以省去我们很多的作。Client的实现可以选择JDK自带的HttpClient,Apache的Jakarta项目下的Commons子项目也提供了一个HttpClient。Confidential©2009iSoftStoneCorporation.AllRightsReserved.5.无论是HTTP还是SMTP,抑或是自定义协议,归根结底都是应用级的协议,底层的实现都是由Socket完成。到了这个层次基本就是原始时代了,什么都没有,一切都要手工完成。在这个层次上开发WebService,所有前面的困难都要一一经历,此外,还有协议的开发等待着不幸至此的人们。到了这里,也不需要其它的工具了,JDK自带的Socket可以保打天下。Confidential©2009iSoftStoneCorporation.AllRightsReserved.6.还想往下吗?再往下就是操作系统的实现了,Java的平台无关就失去了意义,也超出了我目前所了解的范围,到此打住吧!前面所提及应该算是WebService的一个基本知识结构,这里并没有讨论UDDI等等的内容,一来我对它并不了解,二来那应该属于应用,不应该算WebService实现中。经过前面的讨论,我们可以看出,WebService并没有什么神秘可言,所有的东西都是建立在已有东西的基础之上。技术的发展不会是无中生有,只会是一个更好的解决方案而已,在追新求变之前,一个比较牢固的基础才是最重要。Confidential©2009iSoftStoneCorporation.AllRightsReserved.WebService简介•关键的技术和规则XMLSOAPWSDLUDDI(ExtensibleMarkupLanguage)描述数据的标准方法(SimpleObjectAccessProtocol)表示信息交换的协议(WebServicesDescriptionLanguage)Web服务描述语言(UniversalDescriptionDiscoveryandIntegration)统一描述、发现和集成协议Confidential©2009iSoftStoneCorporation.AllRightsReserved.WebService简介•WebService有什么优缺点局域网的同构应用程序WebService优点WebService缺点跨防火墙的通信应用程序集成B2B的集成单机应用程序软件和数据重用Confidential©2009iSoftStoneCorporation.AllRightsReserved.SOAP(简单对象传输协议)语法规则SOAP消息必须用XML来编码SOAP消息必须使用SOAPEnvelope命名空间SOAP消息必须使用SOAPEncoding命名空间SOAP消息不能包含DTD引用SOAP消息不能包含XML处理指令SOAP语法消息的基本结构?xmlversion=1.0?soap:Envelopexmlns:soap=:encodingStyle=:Header....../soap:Headersoap:Body......soap:Fault....../soap:Fault/soap:Body/soap:EnvelopeConfidential©2009iSoftStoneCorporation.AllRightsReserved.SOAP元素•必需的•SOAP消息的根元素•命名空间必须为:xmlns:soap=•encodingStyle属性•可选的•如果有则必须是Envelope元素的第一个子元素•actor属性•mustUnderstand属性•encodingStyle属性•ClicktoaddText•ClicktoaddText•ClicktoaddTextSOAPEnvelopeSOAPHeaderSOAPBodySOAPFault•必须的•传输的是实际SOAP消息•可选的•如果有则必须是Body元素的子元素•只能出现一次Confidential©2009iSoftStoneCorporation.AllRightsReserved.SOAPEnvelope元素•SOAPEnvelope元素•必需的SOAP的Envelope元素是SOAP消息的根元素。它可把XML文档定义为SOAP消息。•请注意xmlns:soap命名空间的使用。它的值应当始终是:•并且它可把封装定义为SOAP封装:•?xmlversion=1.0?•soap:Envelopexmlns:soap=:encodingStyle=•...Messageinformationgoeshere...•/soap:Envelope•xmlns:soap命名空间•SOAP消息必须拥有与命名空间相关联的一个Envelope元素。•如果使用了不同的命名空间,应用程序会发生错误,并抛弃此消息。•encodingStyle属性•SOAP的encodingStyle属性用于定义在文档中使用的数据类型。此属性可出现在任何SOAP元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP消息没有默认的编码方式。•语法•soap:encodingStyle=URI•实例•?xmlversion=1.0?•soap:Envelopexmlns:soap=:encodingStyle=•...Messageinformationgoeshere...•/soap:EnvelopeConfidential©2009iSoftStoneCorporation.AllRightsReserved.SOAPHeader元素•SOAPHeader•可选的SOAPHeader元素可包含有关SOAP消息的应用程序专用信息(比如认证、支付等)。如果Header元素被提供,则它必须是Envelope元素的第一个子元素。•注释:所有Header元素的直接子元素必须是合格的命名空间。•?xmlversion=1.0?•soap:Envelopexmlns:soap=:encodingStyle=•soap:Header•m:Transxmlns:m=:mustUnderstand=1234/m:Trans•/soap:Header•......•/soap:Envelope•上面的例子包含了一个带有一个“Trans”元素的头部,它的值是234