??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧洲日产国码一级毛片,亚洲人成图片小说网站,久久精品夜色噜噜亚洲A∨http://www.tkk7.com/mlzry0612/category/29970.html自大的h只想着怎么把面子保住,自强的h只想着怎么把事办好Q?/description>zh-cnWed, 31 Aug 2011 22:03:30 GMTWed, 31 Aug 2011 22:03:30 GMT60WebService与SOA的实?/title><link>http://www.tkk7.com/mlzry0612/articles/357633.html</link><dc:creator>Daniel</dc:creator><author>Daniel</author><pubDate>Wed, 31 Aug 2011 05:25:00 GMT</pubDate><guid>http://www.tkk7.com/mlzry0612/articles/357633.html</guid><wfw:comment>http://www.tkk7.com/mlzry0612/comments/357633.html</wfw:comment><comments>http://www.tkk7.com/mlzry0612/articles/357633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mlzry0612/comments/commentRss/357633.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mlzry0612/services/trackbacks/357633.html</trackback:ping><description><![CDATA[<span id="iimyiuw" class="Apple-style-span" style="font-family: 'Times New Roman'; line-height: normal; font-size: medium; "><p align="center"><strong><br /></strong></p><p>14.1 Web Services和面向服务的软g架构QService Oriented ArchitectureQ简USOAQ概qͼ</p><p> </p><p>在最新Java开发世界里Q我们经怼遇到q样一个名词:Web ServicesQWeb服务Q。同时还会发玎ͼ与这个名词同时出现的多是各大L技术供应商Q各大技术供应商无一不在xq一领域的发展。从Microsoft?NET架构Q到SUN的SUN ONEQ以及IBM的Web ServicesQ都体现了这些重量的技术提供者对Web Services的推崇与重视?/p><p> </p><p>电子商务的发展促q了Web Services的发展。Web服务可以使公叔R低进行电子商务的成本Q更快地部v解决Ҏ以及开拓更多的新机遇。Web服务使应用程序的集成比以前更快、更Ҏ而且更便宜。它更注重服务语义而不那么注重|络协议语义的消息,从而实C业务功能的松散耦合。这些特性对于在企业之间和企业内部通过webq接业务功能是非常理想的。它提供了一致化QUniformQ的~程模型Q从而在企业内外都可以利用通用的基设施q以一U通用的方法进行应用程序集成?/p><p> </p><p>要理解Web Services, 首先需要认识面向服务的软g架构QService Oriented ArchitectureQ简USOAQ,Web Services是SOA架构pȝ的一个实例?/p><p>14.1.1面向服务的Y件架构(SOAQ?/p><p> </p><p>1. 面向服务中的基本概念</p><p>在面向服务的架构中包含一些基本的概念Q透过q些基本概念可以q一步了解面向服务的架构?/p><p>(1) 服务的概?/p><p>在SOA中的服务是指能够处理一些Q务过E的动作的抽象概念,q些服务可以被描qͼ可以被发玎ͼ可以由服务代理负责向h者提供服务ƈl出l果。代理是指请求或者提供服务的人所使用的Y件工P人通过代理q行交互操作?/p><p>(2) 消息的概?/p><p>服务代理之间需要通过消息的传递进行交互操作,消息的内容含有一定的语义和数据,消息传输需要与某个通信协议相绑定才能够实现?/p><p>(3) 服务的描q和发现</p><p>众多的服务组成一个开攄l,除了需要提供信息交互方式以外,q需要提供相互了解的机制Q这需要提供描q和发现的方式。代理可以通过服务的描q来了解一个服务的内容Q包括用这个服务的技术信息、访问这个服务的地址信息{内宏V当新的服务被投入到pȝ之中后,它需要被注册Qƈ且要能够被发玎ͼ使它可以被利用v来?/p><p> </p><p>2.Z么需要面向服务的软g</p><p>׃软g需求的扩大QY件系l变得越来越复杂。面对复杂的pȝ资源Q我们需要一U更加合理的方式不同类型、不同位|的子系l有力地l合hQ这U整合ƈ不是它们之间绑定得更加紧密Q而是利用更加松散的方式来建立q个pȝ?/p><p>SOA通过松散的方式将分布式的软g模块l合hQ与旧有pȝ集成相比有着明显的优ѝ对于服务的使用者来_可以单地通过服务的描q来获取服务Q系l各部分之间不必Z某一部分的升U而改变,在服务的q程中不同的软g模块可以充当不同的角Ԍ从而构成整个系l的工作体系?/p><p>在SOA当中Q一个服务代表的是一个由服务提供者向服务h者发布的一些处理过E,q个q程在被调用之后Q获得服务请求者所需要的一个结果。在q个q程中,服务h者可以向M能够提供此项服务的服务提供者来h服务Q服务实现的q程对于服务h者来说是透明的?/p><p>随着pȝ分布式和多种l构复合E度的提高,SOA的巨大优势将q一步被挖掘?/p><p>(1) 建立松散耦合的系l?/p><p>松散耦合pȝ的优点已l被业内充分地认可,SOA作ؓ一U分布式的系l,它实C一U服务和描述{概늛l合的架构?/p><p>SOA中的服务在SOA架构中被标准的描q语a所描述Qƈ通过与某U传输协议的l定来实现相互之间的交互。这U基于服务的架构使整个系l成Z个松散耦合的结构,利用与通信协议的绑定将分布式系l中的所有部分连接v来,利用语义和服务的描述Q在代理之间q行交互?/p><p>(2) 提高软g的重用?/p><p>面向服务的架构还提高了对软g的重用性。与lg方式相比QSOApȝ中的单个服务的改变不会对其他部分造成严重的媄响,同时利用服务的描qC同一服务可以充分地被其他pȝ所调用Q各个系l之间Ş成了高度的重用性?/p><p>现在正在被广泛用的一些服务,正在不断地被各个pȝ所重用Q重用的条g十分单,只要了解服务的描qͼ或者可以访问到服务的描q地址卛_。与lg重用相比Q服务的重用q具有与实现语言无关的特点,重用服务的客LE序不需要用与服务实现部分同样的开发语aQ一切交互的q程都是利用与实现无关的方式q行的?/p><p>(3) 提供按需服务的代?/p><p>面向服务的架构也使得pȝ的实现虚拟化Q在SOA架构中的h和提供之间交互或怺代理的过E中Q可计算的代码资源分布在松散l构中的各个部分上,当请求发生时才被调用和服务,所有计过E都是按照请求者的需求进行的。服务的对象分ؓ有状态和无状态两U方式提供服务,按照需求提供服务,也可以利用缓冲机制优化系l的pȝ?/p><p>MQSOA使代码的开发变得更有服务的目的性,使开发更加有效和合理?/p><p> </p><p>14.1.2 SOA?Web 2.0</p><p>另外Q我们补充一下SOA与目前同L门的Web 2.0的关pR?/p><p>实际上Web 2.0 和SOA的概念在很大E度上是相同的,只是被粉饰成Y件的不同部分Q如果的存在不同的话)Q也是说SOA和Web 2.0有很多重叠的东西Q例如都是基于调用(invokeQ的服务Q都能存在于|络的Q何位|等{?/p><p>SOA和Web 2.0的共性远大于它们之间的区别,而且Web 2.0在推qSOA斚w起到了一定作用。到现在为止QSOA和Web 2.0拥有不同的支持? SOA更多涉及企业l构和商务开拓,而Web 2.0更关注用戗这U差别随着更多企业接纳Web 2.0而在变化Q但是这两项技术有着不同的重? Web 2.0告诉我们数据是Y件应用中最重要的部分,而SOA告诉我们服务才是中心。SOA中传输数据的服务也非帔R要,但是传统SOA更关注ITpȝ的接合处而不是那些能使接合处更具价值的东西。也是_SOA也许是通畅的管道,但ƈ不是pȝ中通过的水的h倹{许多行业领D说企业同时需要SOAcL法的l构和Web 2.0Ҏ的创业能力?/p><p>SOA和Web 2.0之间有许多共有的要素Q?/p><p>l 软g重组</p><p>l 理</p><p>l 软g是服务</p><p>l 应用是q_</p><p>l 无意识的使用</p><p>l 开?/p><p>l AJAX</p><p>l 互操作?/p><p>l 货币?/p><p>l 安全</p><p>l |络导向架构</p><p>特别要说的是Q最后一条网l导向架构或者Web Oriented ArchitectureQWOAQ是关键的内容,最l有可能会将SOA和Web 2.0合ؓ一体?/p><p> </p><p>了解了SOA后, 我们来介l什么是Web Services。Web Services是SOA架构pȝ的一个实例。从技术角度来ԌWeb Services是一U新的技术架构、新的Y件应用环境。它的系l架构和实现技术完全承已有的技术,可以认ؓWeb Services是Internet的一Ug伸,是现有的Internet面向更好的互操作能力的一个g伸?/p><p>14.2Q?Web Services的概?/p><p>Web ServicesQ从字面上理解就是通过Web提供的服务。我们可以理解Web Services是自包含的、模块化的应用程序,它可以在|络(通常为Web)中被描述、发布、查找以及调用;也可以理解Web Services是基于网l的、分布式的模块化lgQ它执行特定的Q务,遵守具体的技术规范,q些规范使得Web Sevices能与其他兼容的组件进行互操作Q也可以q样理解Q所谓Web服务Q它是指׃业发布的完成其特别商务需求的在线应用服务Q其他公司或应用软g能够通过Internet来访问ƈ使用q项应用服务</p><p>对于Web ServicesQ很多h会与Web Service混ؓ一谈,认ؓ二者指的是同一个事物。其实不Ӟ前者指的是用于建构Web Service的技术框Ӟ后者指的是使用Web Services技术而创建的应用实例。Web Services是描qC一些操作的接口Q基于标准化的XML消息传输机制Q我们可以通过|络讉Kq些操作。Web Services使用规范的、基于XML的WSDL(Web Services Description Language)语言描述的,q称为Web Services的服务描q。这一描述囊括了与服务交互所需要的全部l节Q包括消息格式(详细描述操作的输入输出消息格式)、传输协议和位置。该接口隐藏了服务实现的l节Q允讔R过独立与服务实现、独立于软硬件^台、独立于~写服务所用的~程语言的方式用该服务。这使得ZWeb Services的应用程序具有松散耦合、面向组件和跨技术实现的特点。Web Services都行一定的特定业务或Q务,可以实现同其他Web Services一L于实现复杂的商业交易?/p><p>从外部用者角度而言QWeb Services是一U部|在Web上的对象和组Ӟ具备以下特征Q?/p><p>.完好的封装性:</p><p>Web服务既然是一U部|在web上的对象Q自然具备对象的良好装性,对于使用者而言Q他能且仅能看到该对象提供的功能列表?/p><p>.松散耦合</p><p>q一特征也是源于对象Q组件技术,当一个Web服务的实现发生变更的时候,调用者是不会感到q一点的Q对于调用者来_只要Web服务的调用界面不变,Web服务实现的Q何变更对他们来说都是透明的,甚至是当Web服务的实现^CJ2EEq移CQNET或者是相反的迁ULE,用户都可以对此一无所知。对于松散耦合而言Q尤其是在Internet环境下的Web服务而言Q需要有一U适合Internet环境的消息交换协议,而XMLQSOAP正是目前最为适合的消息交换协议?/p><p>.使用协议的规范?/p><p>q一特征从对象而来Q但相比一般对象,它更加规范化和易于理解。首先,作ؓWeb服务Q对象界面所提供的功能应当用标准的描述语言来描q?比如WSDL)Q其ơ,由标准描q语a描述的服务界面应当是能够被发现的Q因此这一描述文档需要被存储在私有的或公q注册库里面。同Ӟ使用标准描述语言描述的用协U将不仅仅是服务界面Q它被延到Web服务的聚合、跨Web服务的事务、工作流{,而这些又都需要服务质?QoS)的保障。其ơ,我们知道安全机制对于松散耦合的对象环境的重要性,因此我们需要对诸如授权认证、数据完整?比如{֐机制)、消息源认证以及事务的不可否认性等q用规范的方法来描述、传输和交换。最后,在所有层ơ的处理都应当是可管理的Q因此需要对理协约q用同样的机制?/p><p>.高度可集成能?/p><p>׃Web服务采取单的、易理解的标准,Web协议作ؓlg界面描述和协同描q规范,完全屏蔽了不同Y件^台的差异Q无论是CORBA、DCOMq是EJBQ都可以通过q一U标准的协议q行互操作,实现了在当前环境下最高的可集成性?/p><p> </p><p>14.2.1 Web Services的核心技?/p><p> </p><p>Web Services 是一U基于组件的软gq_,是面向服务的Internet 应用。Web Services 是应用于Internet ?而不是限于局域网或试验环境,q就要求Web Services 框架必须适用于现有的Internet 软g和硬件环?x务的提供者所提供的服务必d有跨q_、跨语言的特性。其?Web Services 所提供的服务不但是面向?而且需服务于其它应用系l。现有的Web|站也可以认为是面向服务?但这U服务仅仅可以提供给Z?只有人类才可以读懂浏览器下蝲的页? 。而新一代的Web Services 所提供的服务应能被机器所L,例如其它应用E序及移动设备中的Y件系l。这?我们可以看出,Web Services 的发展方向实际上是构造一个基于现有Internet 技术之上的分布计算pȝ?/p><p>Web Services 框架的核心技术包括SOAP(Simple Object Access Protocol,单对象访问协? ,WSDL(Web Services Description Lanuage,Web服务描述语言) 和UDDIQUniversal DescriptionQDiscovery and IntegrationQ通用描述Q发玎ͼ集成) ,它们都是以标准的XML 文档的Ş式表q的?/p><p>XML是Web Services技术体pM最基础的标准,Web Services的一切都建立在XML技术的基础之上Q包括Web Services的消息、描q和服务实现的各个环节。利用XMLQWeb Services的服务提供者和h者可以利用不同的开发语a来协作完成服务调用的q程。XML是Web Services技术体pM的很多标准得以徏立的基础Q在Web Servicespȝ中无处不在?/p><p> </p><p>SOAP 是Web services 的通信协议。SOAP是一U简单的、轻量的基于XML 的机Ӟ用于在网l应用程序之间进行结构化数据交换。SOAP包括三部?一个定义描q消息内容的框架的信,一l表C应用程序定义的数据cd实例的编码规则,以及表示q程q程调用和响应的U定?/p><p>WSDL表示WEB服务说明语言。WSDL文g是一个XML 文档Q用于说明一lSOAP消息以及如何交换q些消息Q通过WSDL可以描述一个服务的信息。这些信息不了解这个服务的开发者可以徏立调用这个服务的客户端代码,或者通过WSDL帮助生成实现它的基本代码l构。WSDL在Web Services的实际开发过E中L重要的作用?/p><p> </p><p>  Web Services是基于互联网的应用程序模块,用于在互联网上运行,它采用开攄UDDIQUniversal DescriptionQDiscovery and IntegrationQ通用描述Q发玎ͼ集成Q标准。UDDI标准先由IBM、微软、Ariba制订Q到目前为止获得?30多家公司的支持。UDDI 提供一U发布和查找服务描述的方法。UDDI 数据实体提供对定义业务和服务信息的支持。WSDL 中定义的服务描述信息是UDDI注册中心信息的补充。UDDI提供了一个开放,q_独立的技术框Ӟ来企业之间能在互联|上扑ֈҎ的服务,定义它们在互联网上的交互zdQ以及这些信息的׃n方式?/p><p> </p><p>Web 服务体系l构Z三种角色Q服务提供者、服务注册中心和服务h者)之间的交互?/p><p>服务提供者。从企业的角度看Q这是服务的所有者。从体系l构的角度看Q这是托访问服务的q_?nbsp;<br />服务h者(用户Q。从企业的角度看Q这是要求满特定功能的企业。从体系l构的角度看Q这是寻扑ƈ调用服务Q或启动与服务的交互的应用程序。服务请求者角色可以由览器来担当Q由人或无用L面的E序Q例如,另外一?Web 服务Q来控制它?nbsp;<br />服务注册中心。这是可搜烦的服务描q注册中心,服务提供者在此发布他们的服务描述。在静态绑定开发或动态绑定执行期_服务h者查找服务ƈ获得服务的绑定信息(在服务描qCQ。对于静态绑定的服务h者,服务注册中心是体pȝ构中的可选角Ԍ因ؓ服务提供者可以把描述直接发送给服务h者。同P服务h者可以从服务注册中心以外的其它来源得到服务描qͼ例如本地文g、FTP 站点、Web 站点、广告和服务发现QAdvertisement and Discovery of ServicesQADSQ或发现 Web 服务QDiscovery of Web ServicesQDISCOQ?nbsp;<br /></p><p>  Web Services 的体pL构如? 所C?br /><img src="http://www.ascenttech.cn/html/book/part/step3/xx12/image001.jpg" width="308" height="143" alt="" /></p><p>Web Services 服务提供斚w过WSDL(Web Services Description Language) 描述所提供的服?q将q一描述告知Web Services 注册服务器。注册服务器依据WSDL 的描q?依照UDDI (Universal Description Discovery and Integration) 的协定更新服务目录ƈ在Internet 上发布。用户在使用Web Services 前先向注册服务器发出h,获得Web Services 提供者的地址和服务接口信?之后使用SOAP 协议(Simple Object Access Protocol) 与Web Services 提供者徏立连?q行通信。Web Services 的技术主要徏立在XML 的规范之?q保证了q一体系l构的^台无x、语a无关性和人机交互性能?/p><p> </p><p>14.2.2 Web 服务开发生命周?/p><p>Web 服务开发生命周期包括了设计和部|以及在q行时对服务注册中心、服务提供者和服务h者每一个角色的要求。每个角色对开发生命周期的每一元素都有特定要求?/p><p>Web 服务开发生命周期有以下四个阶段Q?/p><p>1. 构徏 <br />生命周期的构建阶D包括开发和试 Web 服务实现、定义服务接口描q和定义服务实现描述。我们可以通过创徏新的 Web 服务、把现有的应用程序变?Web 服务和由其它 Web 服务和应用程序组成新?Web 服务来提?Web 服务的实现?/p><p>2. 部v <br />部v阶段包括向服务请求者或服务注册中心发布服务接口和服务实现的定义Q以及把 Web 服务的可执行文g部v到执行环境(典型情况下,Web 应用E序服务器)中?/p><p>3. q行 <br />在运行阶D,可以调用 Web 服务。在此,Web 服务完成部vQ成为可操作的服务。服务请求者可以进行查扑֒l定操作?/p><p>4. 理 <br />理阶段包括持箋的管理和l营 Web 服务应用E序。安全性、可用性、性能、服务质量和业务程问题都必被解决?/p><p> </p><p>接下来我们具体展开Web Services原理?/p><p> </p><p>14.3QWeb Services原理</p><p> </p><p>首先Q我们将看看 Web 服务的一个概忉|协议栈以及q个协议栈的l节。然后我们将讨论选择|络协议的标准。我们还回一下基本的Z XML 的消息传递分布式计算。我们将用服务描q扩展基本的 XML 消息传递,而服务描q是Ҏ它的协议栈来解释的。接下来Q我们将讨论服务描述?Web 服务体系l构中的角色Q说明支持静态和动?Web 服务应用E序的服务发布技术的范围。我们还围l服务发布讨论服务发现的角色。最后,我们描q基?Web 服务体系l构的扩展,电子商务需要这些扩展才能?Web 服务?/p><p> </p><p>14.3.1 Web 服务协议?/p><p>要以一U可交互操作的方式执行发布、发现和l定q三个操作,必须有一个包含每一层标准的 Web 服务协议栈。图 2 展示了一个概忉|?Web 服务协议栈。上面的几层建立在下面几层提供的功能之上。垂直的条表C在协议栈中每一层必L的需求?/p><p>?. Web 服务概念性协议栈<br /><img src="http://www.ascenttech.cn/html/book/part/step3/xx12/image002.gif" width="424" height="312" alt="" /><br />Web 服务协议栈的基础是网l层。Web 服务要被服务h者调用,必L可以通过|络讉K的。互联网上可以公用的 Web 服务使用普遍适用的网l协议。HTTP 凭借其普遍性,成ؓ了互联网可用?Web 服务真正的标准网l协议。Web 服务q可以支持其它互联网协议Q包?SMTP ?FTP。内部网域可以用可靠消息传递和调用基础l构Q如 MQSeries ?CORBA {等?/p><p> </p><p>下一层是Z XML 的消息传递,它表CZ?XML 作ؓ消息传递协议的基础。选择 SOAP 作ؓ XML 消息传递协议有很多原因Q?/p><p>它是使用 XML 传送以文档Z心的消息以及q程q程调用的标准化装机制?nbsp;<br />SOAP 很简单;它基本上是一个用 XML 信封作ؓ有效负蝲?HTTP POST?nbsp;<br />SOAP 比对 XML 单的 HTTP POST 更受青睐Q因为它定义了一个标准机Ӟq个机制正交扩展(orthogonal extensionQ合qؓ使用 SOAP 报头和对操作或函数进行标准编码的消息?nbsp;<br />SOAP 消息支持 Web 服务体系l构中的发布、查扑֒l定操作?nbsp;<br />服务描述层实际上是描q文档的一个协议栈。首先,WSDL 是基?XML 的服务描q的真正标准。这是支持可交互操作?Web 服务所需的最标准服务描q。WSDL 定义了服务交互的接口和结构。要指定业务环境、服务质量和服务之间的关p,我们q需要另外的描述。WSDL 文档可以由其它服务描q文档来补充Q从而描q?Web 服务的这些更高的方面。例如,描述业务环境除了使用 WSDL 文档Q还要?UDDI 数据l构。Web 服务程语言QWeb Services Flow LanguageQWSFLQ文档中则描qC服务l成和流E?/p><p>因ؓ Web 服务被定义ؓ可以通过 SOAP 从网l进行访问,q由服务描述表示Q所以该协议栈中的前三层需要提供或使用 Web 服务。最单的协议栈将包括|络层的 HTTP、XML 消息传递层?SOAP 协议以及服务描述层的 WSDL。所有企业间或公?Web 服务都应该支持这U可交互操作的基协议栈。Web 服务Q特别是企业内部或专?Web 服务Q能够支持其它的|络协议和分布式计算技术。该协议栈提供了互操作性,它 Web 服务能够利用现有的互联网基础l构。这ɘq入普遍存在的环境的成本非常低。另外,灉|性ƈ不会因ؓ互操作性需求而有所降低Q因为我们可以ؓ选择性和增值的技术提供另外的支持。例如,我们必须支持 HTTP 上的 SOAPQ但也可以同时支?MQ 上的 SOAP?/p><p>协议栈的最下面三层立了保证一致性和互操作性的技术,而它们上面的两层Q即服务发布和服务发玎ͼ可以用多U解x案来实现?/p><p>M能够让服务请求者?WSDL 文档的操作,不管它处于服务请求者生命周期的哪个阶段Q都W合服务发布的标准。该层中最单、最静态的实例是服务提供者直接向服务h者发?WSDL 文档。这被称为直接发布。电子邮件是直接发布的蝲体之一。直接发布对静态绑定的应用E序来说很有用。另外,服务提供者还可以描q服务的文档发布C机本?WSDL 注册中心、专?UDDI 注册中心?UDDI q营商节炏V?/p><p>Web 服务如果没有被发布就不能被发玎ͼ所以说服务发现依赖于服务发布。该层的各种发现机制和一l发布机制互相^行。Q何允许服务请求者获得对服务描述的访问权Qƈ在运行时使应用程序能够用该服务描述的机刉必须W合服务发现的标准。最单、最静态的发现的实例是静态发玎ͼ其中服务h者从本地文g获取 WSDL 文档。这通常都是通过直接发布获取?WSDL 文档Q或者前面查找操作的l果。另外,也可以通过使用本地 WSDL 注册中心、专?UDDI 注册中心?UDDI q营商节点在设计时或q行时发现服务。因?Web 服务实现是一UY件模块,所以通过l徏 Web 服务来?Web 服务是很自然的。Web 服务的组合可以扮演很多角色之一。企业内部的 Web 服务可能会相互合作,从而对外显C出一个单独的 Web 服务接口Q或者,来自不同企业?Web 服务可以怺合作Q从而执行机器到机器、企业到企业的事务。另外,工作程理者还可以在参与业务流E的时侯调用每个 Web 服务。最上面一层,x务流E,描述了如何执行服务到服务的通讯、合作以及流E。WSFL 用于描述q些交互。要?Web 服务应用E序满当今电子商务的迫切需求,必L供企业基础l构Q包括安全性、管理和服务质量。这几个垂直条在协议栈的每一层都必须得到解决。每一层的解决Ҏ可以彼此独立。随着 Web 服务范例的采用和发展Q将会出现更多此cd直条?/p><p>该协议栈的最下面几层表示基础 Web 服务协议栈,它们相对于协议栈中上面几层来说更成熟Q也更标准。Web 服务的成熟和采用会带动协议栈中上面几层和垂直条的开发和标准化?/p><p>|络?/p><p>Web 服务协议栈的最底层是网l层。该层可表示L多个|络协议QHTTP、FTP、SMTP、消息排队(Message QueuingQ、互联网 ORB 间协议(Internet Inter ORB ProtocolQIIOPQ上的远E方法调用(Remote Method InvocationQRMIQ、电子邮件等{。在Ml定的情况下使用的网l协议都依赖于应用程序需求?/p><p>对于可以从互联网讉K?Web 服务Qh们选择|络技术的时侯通常会們֐于选择普遍部v的协议,?HTTP。对于内部网中提供和使用?Web 服务Q用另外的|络技术也会被认同。我们可以根据其它需求选择|络技术,包括安全性、可用性、性能以及可靠性。这使得 Web 服务可以利用已有的功能更高的联|基l构和面向消息的中间Ӟ?MQSeries。在有多U网l基l构的企业中QHTTP 可以用来在这些基l构之间搭徏桥梁?/p><p>Web 服务的好处之一在于Q它Z用内部网和公用互联网服务的开发和使用提供了统一的编E模型。所以,|络技术的选择Ҏ务开发者来说是透明的?/p><p>Z XML 消息传递的分布式计?/p><p>Web 服务体系l构最基础的支柱是 XML 消息传递。当?XML 消息传递的行业标准?SOAP。IBM、Microsoft 以及其它企业都向 W3C SOAP 作ؓ XML 协议工作l(XML Protocol Working GroupQ的基础。XML 协议代?SOAP 作ؓ行业标准 XML 消息传递协议的位置。当 W3C 发布 XML 协议的草案标准时QWeb 服务体系l构׃?SOAP q移?XML 协议?/p><p>SOAP 是一U简单的、轻量的基?XML 的机Ӟ用于在网l应用程序之间进行结构化数据交换。SOAP 包括三部分:一个定义描q消息内容的框架的信、一l表C应用程序定义的数据cd实例的编码规则,以及表示q程q程调用Qremote procedure callsQRPCQ和响应的约定。SOAP 可以和各U网l协议(?HTTP、SMTP、FTP ?IIOP ?MQ 上的 RMIQ相l合使用Q或者用q些协议重新装后用?/p><p>虽然理解q个基础很重要,但多?Web 服务开发者不必直接处理这个基l构。大多数 Web 服务都会使用?WSDL 生成的经q优化的特定于编E语a的绑定。当服务提供者和服务h者都在类似的环境中执行时Q这U优化可能尤为重要?/p><p>?4 展示?XML 消息传递(?SOAPQ和|络协议如何l成Web 服务体系l构的基?/p><p><img src="http://www.ascenttech.cn/html/book/part/step3/xx12/image004.jpg" width="576" height="277" alt="" /></p><p>?4. 使用 SOAP ?XML 消息传?/p><p>|络节点在基?XML 消息传递的分布式计中扮演提供者和h者角色的基本要求是构建、解?SOAP 消息的能力(或两者兼而有之)Q以及在|络上通信的能力(接收、发送消息,或两者)?/p><p>通常Q在 Web 应用E序服务器中q行?SOAP 服务器将执行q些功能。另外,我们也可以用在 API 中封装这些功能的特定于编E语a的运行库。应用程序与 SOAP 的集成可以通过使用四个基本步骤来实玎ͼ</p><p>在图 4 中,服务提供者的应用E序在(1Q创Z?SOAP 消息。这?SOAP 消息是调用由服务提供者提供的 Web 服务操作的请求。消息主体中?XML 文档可以是一?SOAP RPC hQ也可以是一个服务描qC所描述的以文档Z心的消息。服务请求者将此信息和服务提供者的|址一h供给 SOAP 基础l构Q例如一?SOAP 客户行时Q。SOAP 客户行时与一个底层网l协议(例如 HTTPQ交互,然后在网l上?SOAP 消息发送出厅R?nbsp;<br />|络基础l构在(2Q将消息传送到服务提供者的 SOAP q行Ӟ例如一?SOAP 服务器)。SOAP 服务器将h消息路由到服务提供者的 Web 服务。如果应用程序需要,SOAP q行时负责将 XML 消息转换为特定于~程语言的对象。这个{换由消息中可以找到的~码模式所控制?nbsp;<br />Web 服务负责处理h信息q生成一个响应。该响应也是一?SOAP 消息。响应的 SOAP 消息在(3Q被提供l?SOAP q行Ӟ其目的地是服务请求者。在 HTTP 上的同步hQ响应的情况中,联网协议的底层请求/响应本质用于实现消息传递的hQ响应本质。SOAP q行时将 SOAP 消息响应发送到|络上的服务h者?nbsp;<br />响应消息在(4Q由服务h者节点上的联|基l构接收。消息会l过整个 SOAP 基础l构Q可能会?XML 消息转换为目标编E语a中的对象。然后,响应消息被提供给应用E序?nbsp;<br />本示例用了hQ响应传送基本原理,q种原理在大多数分布式计环境中都很常见。请求/响应交换可以是同步的Q也可以是异步的。其它传送基本原理,如单向消息传递(无响应)Q通知Q推动式响应Q以及发布/订阅Q也可能用到 SOAP?/p><p>那么Q服务请求者如何知道请求消息应该用什么格式呢Q这个问题在下面会得到回{?/p><p> </p><p>服务描述Q从 XML 消息传递到 Web 服务</p><p>服务提供者是通过服务描述所有用于调?Web 服务的规范传送给服务h者的。要实现 Web 服务体系l构的松散耦合Qƈ减少服务提供者和服务h者之间所需的共识的E度和定制编E与集成的程度,服务描述是关键。例如,不管是请求者还是提供者,都不必了解对方的底层q_、编E语a或分布式对象模型Q如果有的话Q。服务描qC底层 SOAP 基础l构相结合,以装服务h者的应用E序和服务提供者的 Web 服务之间的这个细节?/p><p>基本服务描述</p><p>Web 服务体系l构使用 WSDL 作ؓ基本服务描述。WSDL 已经被提交到 W3C 作ؓ标准。WSDL 是一U?XML 文档Q它?Web 服务描述Zl端点,q些端点会处理包含面向文档或面向q程的(RPCQ消息的消息。操作和消息都是被抽象描q的Q然后它们会被绑定到一个具体的|络协议和消息格式,用来定义端点。相关的具体端点被合q到抽象的端Ҏ服务中。WSDL 可以扩展为允许端点和其消息的描述Q不用哪U消息格式或|络协议q行通讯都可以。然而,目前l过描述的绑定只能用?SOAP 1.1、HTTP POST 以及多用途互联网邮g扩展QMultipurpose Internet Mail ExtensionsQMIMEQ?/p><p>Web 服务体系l构中对 WSDL 的用按照常规将基本的服务描q分成了两部分:服务接口和服务实现。这使每个部分都可以被分开独立定义Qƈ可以由另一部分重新使用?br /><img src="http://www.ascenttech.cn/html/book/part/step3/xx12/image006.jpg" width="528" height="405" alt="" /><br />服务接口定义是一U抽象或可重用的服务定义Q它可以被多个服务实现定义实例化和引用。我们可以将服务接口定义惌成接口定义语aQInterface Definition LanguageQIDLQ、Java 接口?Web 服务cd。这使常见的行业标准服务cd可以被多个服务实现者定义和实现。这cM于在~程语言中定义抽象接口然后得到多个具体实现。服务接口可以由行业标准l织定义?/p><p>服务接口包含 WSDL 元素Q它们组成了服务描述中的可重用部分,q些元素有:WSDL: binding、WSDL: portType、WSDL: message ?WSDL: type 元素Q如?5 中所描述。WSDL: portType 元素中定义了 Web 服务的操作。操作定义了输入和输出数据流中可以出现的 XML 消息。您可以操作想象成~程语言中的Ҏ说明。WSDL: message 元素指定哪些 XML 数据cdl成消息的各个部分。WSDL: message 元素用于定义操作的输入和输出参数。WSDL: types 元素中描q消息中复杂数据cd的用。WSDL: binding 元素描述特定服务接口QWSDL: portTypeQ的协议、数据格式、安全性和其它属性?/p><p>服务实现定义是一个描q给定服务提供者如何实现特定服务接口的 WSDL 文档。Web 服务被徏模成 WSDL: service 元素。服务元素包含一l(通常是一个)WSDL: port 元素。端口将端点Q例如网址位置?URLQ与来自服务接口定义?WSDL: binding 元素兌h?/p><p>Z说明职责的安排,开攑ֺ用程序组QOpen Applications GroupQOAGQؓ开攑ֺ用程序组集成规范QOpen Applications Group Integration SpecificationQOAGISQ购买标准定义了一个服务接口定义。这个服务接口定义会定义 WSDL: type、WSDL: message、WSDL: portType ?WSDL: binding?/p><p>服务提供者可以选择开发实?OAGIS 购买订单服务接口?Web 服务。服务提供者会开发一个服务实现定义文档,描述 WSDL 讑֤、端口和地址位置元素Q这些元素描q提供者的 Web 服务的网址及其它特定于实现的细节?/p><p>服务接口定义和服务实现定义结合在一Pl成了服务完整的 WSDL 定义。这两个定义包含为服务请求者描q如何调用以及与 Web 服务交互的够信息。服务请求者可以要求获得其它关于服务提供者端口的信息。此信息由服务完整的 Web 服务描述提供?/p><p> </p><p>完整?Web 服务描述</p><p>完整?Web 服务描述建立在服务基本的 WSDL 定义之上。完整的 Web 服务描述可以解决q样的问题:什么企业在托管q个服务Q它是何U类型的企业Q与服务相关联的产品有哪些?各种公司和品类别中与该企业或其 Web 服务相关联的分类有哪些?有没有服务的其它斚wQ如服务质量Q会影响到请求者是否选择调用服务Qؓ了查找该服务更ҎQ可以提供哪些关键字Q?/p><p>?6 中描qC一个完整的 Web 服务描述?/p><p>?6. 完整?Web 服务描述协议?br /><img src="http://www.ascenttech.cn/html/book/part/step3/xx12/image007.gif" width="594" height="303" alt="" /><br />UDDI 提供了一个保?Web 服务描述的机制。虽?UDDI 通常会被认ؓ是一U目录机Ӟ但是它也定义了一个用 XML 表示服务描述信息的数据结构标准。UDDI 条目中有四种基本数据l构Q如?7 中所C?/p><p>?7. 基本 UDDI 数据l构<br /><img src="http://www.ascenttech.cn/html/book/part/step3/xx12/image009.jpg" width="564" height="363" alt="" /><br />UDDI 条目?businessEntity 开始。businessEntity 元素对关于企业的信息q行建模Q包括基本的企业信息Q例如企业名U和联系方式信息是什么?Q、分cM息(例如q是何种cd的企业?Q以及标识信息(?Dunn and Bradstreet ~号是什么?Q。businessEntity 包含一l?businessService 元素Q每个元素对应于企业希望发布的每?Web 服务。每?businessService 元素都包含和 businessEntity 元素?Web 服务有关的技术性和描述性信息。businessService 包含一l?bindingTemplate 元素。bindingTemplate 描述讉K信息Q例如端点地址Q,q描q?businessService 如何使用各种不同的技术规范。技术规范在q里的模型是 tModel。tModel 可以为很多不同概念徏模,如:一U服务、一个诸?HTTPS 之类的^台技术或一个类别。与 businessService 相关联的那一l?bindingTemplate 元素代表?businessService 所使用的技术的印记?/p><p>在Web 服务体系l构中,完整?Web 服务描述包括用于端点描述的一层,q个端点描述使用 UDDI 条目向服务描q添加企业和实现环境?/p><p>端点描述遵@l合 WSDL 使用 UDDI 的约定。端ҎqC?UDDI 提供企业信息和类别的标准表示。这?UDDI-WSDL U定规定了如何从?Web 服务相关联的 UDDI 条目中得出服务接口定义和服务实现定义?WSDL 描述。这个约定对于在Web 服务体系l构中?UDDI 作ؓZ WSDL 的服务的服务注册中心来说臛_重要?/p><p>端点描述向应用到服务的特定实现的服务描述d了另外的语义。安全属性可以定义对 Web 服务的访问进行控制的{略。服务质量属性指定面向性能的能力,例如服务在一定时间内作出响应的能力,或所支持的可靠消息传递的U别。服务开销属性描q服务的资源需求。还可以定义支持哪些对话语义?/p><p>服务描述协议栈中的最后一层是协议描述。协议描q反映两个企业伙伴之间ؓ了完成一个多步企业交互而进行的 Web 服务调用的一个简单的~排。例如,“协议定义”定义了购买协议中诸如购买者和出售者之cȝ角色。协议定义规定了每个角色必须辑ֈ的要求。例如,出售者必L接受报hhQrequest for quoteQRFQQ消息、购买订单(purchase orderQPOQ消息和付款消息?Web 服务。购买者的角色必须有接受报PRFQ 响应信息Q、发消息和帐户摘要信息?Web 服务。这个简单的 Web 服务C业角色的~排对于在企业伙伴之间徏立多步的、面向服务的交互来说臛_重要。在很多不同的企业协议标准下Q一个给定的服务h者或服务提供者也许能够扮演购买者或出售者的角色。通过昑ּ地徏立企业协议和每个节点在企业协议中扮演各种角色的能力,h者可以选择在面对各U提供者企业伙伴时加入哪种企业协议?/p><p>q个领域充满了创新。对于企业协议定义来_目前q没有一个单独的标准。ebXML 协作-协议概要和协定规范(ebXML Collaboration-Protocol Profile and Agreement SpecificationQ描qCq些概念Q但不是Ҏ作ؓ该体pȝ构的一部分描述?Web 服务技术而描q的。Web 服务程描述?Web 服务端点描述q两层正处于开发中Q它们可以提供这个别的服务描述?/p><p> </p><p>服务描述的发布和发现</p><p>服务发布</p><p>Web 服务的发布包括服务描q的生成和之后的发布。发布可以用各U不同机制?/p><p>生成服务描述 <br />我们可以生成、手工编码服务描qͼ也可以根据已有的服务接口定义l成服务描述。开发者可以手工编码整个服务描qͼ包括 UDDI 条目。有些工具可以从~程模型和可执行 Web 服务的部|生?WSDLQ还有可能生成来自元数据构g的部?UDDI 条目。部分服务描q可能已l存在(例如QWeb 服务可以Z一个行业标准服务接口定义)Q这样就只须q一步生成一部分就可以了?/p><p>发布服务描述 <br />服务描述可以使用各种不同机制来发布。根据应用程序将使用服务的动态程度,q些不同的机制提供不同的能力。服务描q可以用多U不同机制发布到多个服务注册中心?/p><p>最单的情况是直接发布。直接发布意味着服务提供者直接将服务发布l服务请求者。这可以通过使用电子邮g附g、FTP 站点甚至光盘分发来实现。直接发布可以在企业伙伴双方在 Web 上用电子商务的条款达成一致后q行Q或在请求访问服务的服务h者支付了费用之后q行。在q种情况下,服务h者可以保留服务描q的一份本地副本?/p><p>E微更动态一点的发布使用 DISCO ?ADS。DISCO ?ADS 两者都定义了一个从l定 URL 获取 Web 服务描述的简单的 HTTP GET 机制。增强的服务描述资源库会提供服务描述的一个本地高速缓存,不过q提供了附加的搜索能力。对于在企业内部跨越L的服务描q资源库来说Q服务提供者会向专用的 UDDI 节点发布。我们可以根据发布到节点?Web 服务的域的范_使用几种专用?UDDI 节点?/p><p>内部企业应用E序 UDDI 节点QInternal Enterprise Application UDDI nodeQ节点:公司内部Zq行内部企业应用E序集成而用的 Web 服务应该被发布到q一c?UDDI 节点。此c?UDDI 节点的范围可以是部门的或公司的单独的应用E序。这?UDDI 位于防火墙之后,允许服务发布者对他们的服务注册中心和它的讉K权、可用性以及发布要求有更多的控制?nbsp;<br />门户|站 UDDI 节点QPortal UDDI nodeQ节点:由公司发布以供外部伙伴查扑֒使用?Web 服务可以使用门户|站 UDDI 节点。门L站节点运行在服务提供者的防火墙之外或之间。这U专?UDDI 节点只包含公司希望向来自外部伙伴的请求者提供的那些服务描述。这允许公司保留对他们服务描q的控制、UDDI 节点的访问以?UDDI 节点的服务质量。此外,通过使用门户|站中固有的Z角色的可见性,企业服务描q的可见性局限在允许看到它们存在的伙伴中?nbsp;<br />伙伴目录 UDDI 节点QPartner Catalog UDDI nodeQ节点:q定公怋用的 Web 服务可以被发布到伙伴目录 UDDI 节点。伙伴目?UDDI 节点位于防火墙之后。此cM?UDDI 节点只包含来自合法企业伙伴的l过允许的、测试过的、有效的 Web 服务。此c?Web 服务的业务环境和元数据可以被定位到特定的h者?nbsp;<br />电子市场 UDDI 节点QE-Marketplace UDDI nodeQ节点:对于服务提供者打用来与其它 Web 服务竞争h者的业务?Web 服务来说Q服务描q应该被发布到电子市?UDDI 节点?UDDI q营商节炏V电子市?UDDI 节点׃个行业标准组l或C֛托管Q包含特定行业中的企业的服务描述。我们可以要求这些服务支持特定的标准、可搜烦元数据、接口或数据cd。电子市?UDDI 节点一般会qo掉某些非法的条目Qƈ提供有保证的服务质量?nbsp;<br />UDDI q营商节点:如果您希?Web 服务可以被潜在的新的企业伙伴或服务用户发玎ͼq可以将其发布到 UDDI q营商节炏VIBM、Microsoft ?Ariba 都支持、复制和托管 UDDI q营商节炏V在发布 UDDI q营商节点的时侯Q如果要让潜在的服务h者发现服务的话,完整的业务环境和l过深思熟虑的分类法是很必要的?br /></p><p>?8. 服务发现q箋?br /><img src="http://www.ascenttech.cn/html/book/part/step3/xx12/image010.gif" width="575" height="392" alt="" /><br />?8 展示了从发布和发C最静态、最单的技术到最动态、更复杂的技术的q箋体。Web 服务的用h实现者不必严格遵循这个发展顺序?/p><p>服务发现</p><p>Web 服务的发现包括获取服务描q和使用描述。获取过E可以用各U不同机制?/p><p>获取服务描述</p><p>和发?Web 服务描述一PҎ服务描述如何被发布以?Web 服务应用E序可能辑ֈ的动态程度,获取 Web 服务描述也会有所不同。服务请求者将在应用程序生命周期的两个不同阶段Q即设计时和q行时查?Web 服务。在设计Ӟ服务h者按照他们支持的接口cd搜烦 Web 服务描述。在q行Ӟ服务h者根据他们通讯的方式或公告的服务质量搜?Web 服务?/p><p>使用直接发布ҎӞ服务h者在设计时对服务描述q行高速缓存,以在q行时用它。服务描q可以被静态地用程序逻辑表示Qƈ存储在文件或单的本地服务描述资源库中?/p><p>服务h者可以在设计时或q行时在服务描述资源库(单的服务注册中心?UDDI 节点Q中索一条服务描q。查找机刉要支持一U查询机Ӟ它提供按接口cdQ基?WSDL 模板Q、绑定信息(卛_议)、属性(?QoS 参数Q、所需的中介类型、服务分cL、企业信息等{的查找?/p><p>不同cd?UDDI 节点会显C可以选择的运行时l定 Web 服务的数目、多选一的策略,或者调用服务之前必ȝh者作出预选的量?/p><p>内部企业应用E序 UDDI 节点和伙伴目?UDDI 节点不需要预选来建立Ҏ务的信Q。服务选择可以建立在绑定支持、历史性能、服务质量分cR相似性或负蝲q的基之上?/p><p>电子市场 UDDI 节点有更多的运行时服务可以选择。必L行某U预选以保证 Web 服务提供者是有h值的伙伴。我们可以根据h格承诺、开销、经q允许的伙伴列表的出席情况,同样q有l定支持、历史性能、服务质量分cd怼性来选择服务?/p><p>如果服务h者从 UDDI q营商节Ҏ?Web 服务提供者,他们在预选可能的服务提供者时必d可能谨慎和认真。应该有一个有效和准确的机制就位,qo掉无用的服务描述和没有h值的服务提供者?/p><p>使用服务描述 <br />在获取了服务描述之后Q服务请求者需要处理它以调用服务。服务请求者用服务描q生成对 Web 服务?SOAP h或特定于~程语言的代理。该生成可以在设计时或运行时q行Q从而对 Web 服务的调用进行格式化。我们在设计时和q行时可以用各U工具从 WSDL 文档生成~程语言l定。这些绑定表C应用程序的 APIQƈ装了来自应用程序的 XML 消息传递的l节?/p><p>在下一部分Q我们将描述基本 Web 服务体系l构的扩展,电子商务需要这些扩展才能?Web 服务?/p><p> </p><p>在下一部分Q我们将描述基本 Web 服务体系l构的扩展,电子商务需要这些扩展才能?Web 服务?/p><p> </p><p>14.3.2 真正的电子商务的 Web 服务</p><p>虽然对于可互操作?XML 消息传递来?SOAP ?HTTP p够了Q而且 WSDL 也可以传达服务h者和服务提供者之间需要什么样的消息,但是要覆盖电子商务的全部需求还需要更多的技术。ؓ了完全支持电子商务,安全性、可靠的消息传递、服务质量、Web 服务协议栈的每一层的理都需要扩展?/p><p> </p><p>安全?/p><p>真的需?Web 服务安全层吗Q对于基于消息的体系l构Q业界已l有一套现成的而且q泛接受的传输层安全机制Q比如,安全套接字层QSecure Sockets LayerQSSLQ和|际协议安全QInternet Protocol SecurityQIPSecQ,Z么还要再加别的呢Qؓ了回{这个问题,我们不仅要研I要求,q将探讨一些只依靠现有的几cM输层安全机制q不能在 Web 服务模型内提供够的安全性的情况?/p><p>通常QWeb 服务安全层必L供以下四个基本的安全性要求:</p><p>机密性(ConfidentialityQ是指信息对没有l过授权的个人、实体或q程的不可用性或不公开性,q保证消息内容不Ҏ有经q授权的个h公开?nbsp;<br />授权QAuthorizationQ是指权限的授予Q包括根据访问权限授予访问权和保证发送方被授权发送消息?nbsp;<br />数据完整性(Data integrityQ是指数据没有以未经授权的方式或被未l授权的用户不可察觉的改变或者破坏的性质Q从而确保消息在传送的q程中不会被偶然或故意修攏V?nbsp;<br />原始性证明(Proof of originQ是Ҏ息或数据的发送者进行标识的证据。断a消息由正标识的发送者传送,q且不会重新发送以前传送过的消息。这一要求隐含了数据完整性的要求?nbsp;<br />׃需要在Z XML 消息和工作流的动?Web 服务世界中管理不同风格的资源讉KQ所以必重新评估策略、信d风险评估q三者相互之间的关系。现有的Z个hw䆾的访问控制模型正在发展成为基于角色的信Q域关p,在该U关pMQ可信Q的权威机构将执行某项d的权限授予个人,其行为受该权限限制。Web 服务体系l构定义了需要信息的代理Q服务请求者)、提供信息的代理Q服务提供者)Q有时还有提供关于信息的信息的代理(服务中介者、元信息提供者或服务注册中心Q。服务中介者经怼收到大量信息hQ这样就需要它能够军_谁想要哪些信息以及请求者是不是已经被授予访问权。基设施和关pd化迅速,因此有关的策略需要能灉|的允许或拒绝讉K?/p><p>此外Q尽?XML 发誓要ؓq样的服务提供通用接口Q但 XML 不会提供实现q一梦想所需要的整个基础设施。而且QXML 可能不适合构徏整个 Web 服务安全层。目标是要确定在哪些场合?XML 格式提供信息以顾及通用数据交换较ؓ重要Q以及在哪些场合利用目前已存在于q_之上的现有安全性机制较为重要?/p><p>SOAP 信封是用 XML 定义的,从而您可以向消息dU类众多的元信息Q比如事?ID、消息\׃息和消息安全性。SOAP 信封׃个部分组成:头和M。头是把功能d?SOAP 消息中的通用机制。SOAP 头元素下一U的所有子元素都叫做头条目。主体是为最l的消息接收Ҏ要的应用数据Q如 RPCQ准备的容器。因此,可以?SOAP 看作是在传输层(例如 HTTPQ和应用层(例如Q业务数据)之间引入的另外一层,在此可以方便的传送消息元信息。SOAP 头提供可扩展机制以扩?SOAP 消息使其可以适用于多U用途。虽?SOAP 头是向消息添加安全性功能最合理的地方,但是 SOAP 规范本nq没有指定这L头元素?/p><p>让我们仔l的分析一下在 Web 服务模型中现有的各种各样的传输层安全机制Z么不够,又ؓ什么会需?Web 服务安全层,以及q个安全层最初是怎样的?/p><p>端对端的消息传递。安全传输协议,?SSL ?IPSecQ可以在传输q程中提供消息完整性和机密性,但只有在点对点的情况下,它们才会q样做。但是,因ؓ SOAP 消息是由中介体接收ƈ处理的,所以即便两两之间的通信链\Qcommunication linkQ是可信ȝQ只要在所有的中介体间没有信Q兌Qtrust associationQ,那么安全的端对端通信是不可能的。如果有一条通信链\不安全,那么端对端安全性也会被削弱。就 Web 服务拓扑来看Q安全的传输对于 SOAP 消息的端对端安全性是不够的?/p><p>中间件的独立性。最l,唯一能提供端对端安全性的方式在于应用层或中间g层。如果消息在通信方之间的某点是纯文本Q那么就有可能在q点受到d。但是,既要在新的或现有的应用中集成加密功能Q又不能引入额外的安全性弱Ҏ增加风险Q这是一不Ҏ又不受欢q的d。因此,在大多数情况下,Z希望安全性功能尽可能靠近应用Q但不在应用本n中构建?/p><p>传输的独立性。SOAP 中介体的原意是用来把信息转发C同的|络上去Q通常使用的传输协议也会有所不同。虽然所有的通信链\都是安全的,中介体也是值得信赖的,但是Q安全信息(如消息发送者的w䆾验证Q需要被转移到消息\径上的下一个传输协议安全性域Q这个过E冗长而且复杂Q还可能会导致完整性方面的~陷?/p><p>异步多阶消息传递。传输层安全性保证数据在通信链\上传输时的安全。它与存储在M中介体上的数据都无关。在一ơ传输被接收q解密后Q传输层安全性对保护数据免受没有l过授权的访问和可能的改变就不是很有帮助了。在先存储消息然后{发的情况下(持久的消息队列)Q消息层保护是有必要的?/p><p>因ؓ我们已经看到安全的传输机制不以满 Web 服务开发方法和使用场景的要求,所以我们的d是要创Z个概忉|?Web 安全层,包括下列几个lgQ?/p><p>对于|络安全性: <br />支持?SSL ?HTTPS {提供机密性和完整性的安全传输机制?nbsp;<br />对于 XML 消息Q?nbsp;<br />如果通信没有中间节点Q那么发送方可以依靠 SSL ?HTTPS 来保证用h识和密码的机密性?nbsp;<br />W3C 正在标准?XML 数字{֐工作的支持。它定义了生成消息摘要与利用发送方的私钥来{֏消息的标?SOAP 头和法。因此,接收方就可以证明消息发送方的n份?nbsp;<br />对网l内部的、可信Q的第三方验证服务Q例?KerberosQ的支持?nbsp;<br />概念?XML 消息传递模型还必须支持端对端保护消息及其子元素。ؓ了全面的支持Q过E和能力需要被扩展到包括消息交换的安全性特征。应该有一U方式可以定义多D|息和用预期接收方的公钥来保护消息Dc需要探讨的一些论题有Q?/p><p>端点负责实现验证及授权。应该支持在企业之间交换信息的合同的M描述中都要定义哪些雇员可以用哪些服务。中介体负责审计和服务原始性证明。中介体q可能需要执行验证、授权和数字{֐验证以及有效性检查?nbsp;<br />在服务端点的服务描述层中需要定义支持上文论q的安全性问题的面向安全性元数据。这些安全性描q将ҎM或角色定?Web 服务层访问控制。服务描q将会描q是否支持数字签名、加密、验证和授权以及如何支持它们?nbsp;<br />h者将使用服务描述的安全性元素来查找服务端点Q该端点应符合政{要求及其安全性方法?nbsp;<br />标准l正在调查如下主题和技术。随着q些标准固定下来Q它们将会被q入 Web 服务安全性体pȝ构?/p><p>W3C 有一?XML 加密工作l,帮助提供数据元素的机密性,q样验证交换成ؓ可能?nbsp;<br />W3C 已发布了一?XML 密钥理服务QXML Key Management ServicesQXKMSQ的备忘录,来帮助分发及理在端点之间进行安全的通信所需的密钥?nbsp;<br />OASIS 已经成立了一个技术委员会来定义授权和验证断言QAuthorization and Authentication assertionsQSAMLQ。这帮助端Ҏ受和x讉K控制权?nbsp;<br />OASIS 已经成立了一个技术委员会来标准化讉K控制权的表达QXACMLQ。这帮助端点能够以一致的方式解析 SAML 断言?nbsp;<br />随着我们不断的研I?Web 服务模型中遇到的所有威胁和对策QWeb 服务安全性体pȝ构也在不断发展着?/p><p> </p><p>服务质量QQoSQ和可靠的消息传?/p><p>服务质量垂直塔提供与 Web 服务概念栈每一层有关的信息的规范。对于网l层Q这会暗示能用各U别的服务质量的网l?/p><p>׃需要通过|络q行可靠的消息传递,所以得Ҏ在这一领域内发送高质量服务的能力来选择|络技术。可靠的消息传递指基础设施把消息一ơ发送(只发送一ơ)到预定目标或提供定的事Ӟ如果发送没能完成,也许会重新发送到源)的能力。结合网l层?XML 消息传递将需要支持四个等U的消息传递服务质量:</p><p>1. 最佛_力:服务h者发送消息,服务h者和基础设施不尝试重发?/p><p>2. 臛_一ơ:服务h者提求,q一直重试直到它接收到确认ؓ止。服务提供者重复消息处理不是问题,例如单的查询处理。实现这可能意味着每个消息包含唯一的标识。服务请求者以自己定的时间间隔重发没有得到确认的消息。服务提供者发出确认消息,?RPC 响应消息Q如果不能处理的话,发送不能处理的消息异常?/p><p>3. 臛_一ơ:q徏立在最一ơ情늚基础之上。服务请求者试着h直到它得到回应。象现有的全局唯一标识W(universal unique identifierQUUIDQ这L机制允许服务提供者抑刉复多ơ的hQ以保h不会被多ơ执行。例如,hҎ库存目录中的一个号码拿一件东ѝ?/p><p>4. 刚好一ơ:服务h者提求,h已经执行的回应其得C证。刚好一ơ交换模式排除了重传h的需要ƈ且适应失效的情c?/p><p>可靠的消息传递通常是通过标准设计模式传送的Q在该模式中Q一件基设施Q有时叫做端点管理器Q将会被用来在通信的每一端协调消息发送。在q种模式中,发送方通过同步h把消息发l端点管理器。一旦发送到Q发送方可以得C证,一定会把消息发送出L引发定的事Ӟ例如时Q。端点管理器与其它资源管理器参与本地事务Q在一ơ事务中不仅可以q点管理器Ҏ息进行排队,q有可能在数据库中记录业务过E步骤。应用程序应该指z点管理器来负责发送消息或者检发送失败的原因Q它在网l传输层?XML 消息传递层都可以v作用?/p><p>可靠的一ơ性消息发送的技术和目的都不会引起争议。但是,围绕如何?SOAP ?XML 的上下文中支持这Ҏ术已l提Z重要的质疑。关键问题是Q应不应该在 XML 消息层上定义必要的协议和消息格式Q从而允许可靠的消息发送成Z端应用程序的责QQ或者能不能在较低的层(如传输层上)定义协议和消息格式?</p><p>在没有支持可靠的消息传递的传输方式的情况下Q即互联|)QXML 消息传递层需要在不可靠的基础设施之上支持q些服务质量。端点管理器需要修Ҏ息,而不是修Ҏ息的传输信封Q这h能成功扮演其角色。应用程序和业务q程的定义将必须考虑所有可能的l果Q如拒收消息或在可接受的旉长度内发送不出去。但是,q些定义q需要考虑在发送过E中发生的中间状态。向业务q程公开q些状态可能会大大增加其定义的复杂E度Q但对于定义q程的业务分析师而言q无太大意义。在一些情况下Q?XML 消息传递来发送可靠的消息传递格式可能会D使用现有的这些传输毫无效率。最好能开发一U在互联|上使用的可靠的 HTTP 标准?/p><p>在有支持可靠的消息传递的传输方式的情况下Q即在企业内部)Q它可以用于发送可靠的消息Q而不?XML 消息传递层Q可能缺省ؓI实玎ͼ。端点管理器会只修改传输信,而不会修?XML 消息。用可靠的传输使应用程序和业务q程定义不需要知道或处理消息发送的中间状态?/p><p>需要在来q行的几点补充:</p><p>互联|的 HTTP 需要加以改q才能提供可以在企业间用的单可靠的消息传递。这会带来额外的好处Q不?SOAPQ许多种消息cd都可以采用可靠的消息传递。需?XML 消息传递层处理可靠的消息传递的情况׃随之减少Q促q不依赖于网l选择的应用程序开发?nbsp;<br />HTTP 上的 XML 消息传递层也需要处理发布和订阅、消息排序、发送时间限制、优先和多点传送等{问题?nbsp;<br />服务提供者对可靠的消息传递的质量和实现的支持情况会在服务描q的l定信息中定义?/p><p>服务实现层(例如Q通过事务的或安全?SOAP l定Q的服务描述以及接口层(例如Q从h者开始等待来自提供者的响应之后最长经q多久)的其它服务描qC都会关系到服务质量(Quality of ServiceQ信息。h们期待着开发出 WSDL 扩展或新的服务描q层来允许指定其它服务质量和功能的规范?/p><p>Web 服务层上的服务质量可以在服务合成和服务流中用。在为流选择服务或提C流理器该开始恢复或其它的流Ӟ预期的执行时间、超时倹{历史^均执行时间值都可以作ؓ输入。服务描q栈的端Ҏq层和工作流描述层必L供这一信息?/p><p>Web 服务的服务质量问题和解决Ҏ仍然很紧q?/p><p> </p><p>pȝ和应用程序管?Management)</p><p>随着 Web 服务成ؓ商业q作的重要因素,需要对其进行管理。在q种情况下,所谓管理是指专为应用程序定制的或从厂商那里买来的管理应用程序可以发?Web 服务的基设施、Web 服务、服务注册中心和 Web 服务应用E序存在性、可用性以及健康度。最令h满意的结果是理pȝq应当能够控制和配置基础设施及组件?/p><p>理概念?Web 服务栈各层的 Web 服务?Web 服务模型lg必定是有可能的。对理的需求可以分成两个集中的领域。第一个领域是用于实现 Web 服务的基设施的可理性。主要的考虑应当是确保可用性和提供服务描述、消息传递和|络的关键元素的性能。Web 服务基础设施提供者应当提供这一层上的系l管理?/p><p>企业对其自己的基设施及管理拥有完全的自主权。但是,当企业在对等基础上相互作用时Q就应当提供对网l层、XML 消息传递层、服务注册中心和 Web 服务实现的基本报告和恢复办法。此外,企业向其合伙人提供的理接口应当是在服务层上操作的,而不是在相对低的基设施层上。合伙h应该能够讉K到报告操作和h处理的状态和健康度的接口Q但不一定要理解企业如何理其请求的l节?/p><p>对于|络层,现有的网l管理品几乎支持目前所有的|络基础设施。这些品应当用于管理企业内部的 Web 服务的网l基设施。当企业怺作用Ӟ应该向其合伙h提供有关 Web 服务基础设施可用性的基本报告。媄?Web 服务基础设施可用性的|络可用性应作ؓ因素之一写入报告?/p><p>?XML 消息传递层Q协议应该在企业内部q有的基础设施理工具来管理。在企业怺作用的情况下Q每个站炚w有必要提供协议的基本报告和恢复办法。例如,如果站点 A 支持会话Q就该向站点 B 提供可用于查询活跃的 IBM Software Group Architecture Overview Web Services Conceptual Architecture 28 会话以及回滚的接口。协议层需要正常的频道与协议和cM对等的控制接口?/p><p>理的第二个斚w?Web 服务本n的可理性。一些主要的考虑是性能、可用性、事件和使用量度Q因为它们将为服务提供者市场收取所提供的服务用费提供必要信息?/p><p>服务描述可以用于宣传可管理性特征和理需求。这斚w的约定正在开发之中?/p><p>服务注册中心的Q何实玎ͼ不管是用于私人消费还是公共消费,都要求基设施是可用的、发送承诺的服务质量q能够报告用情c这些系l管理元素对于成功采?UDDI 是十分重要的?/p><p>对于 Web 服务应用E序lg来说Q支持管理环境可能会大大增加应用E序的复杂性。由?Web 服务必须易于开发,所以必d可能向开发者隐藏这L复杂性。Web 服务的管理方式要使基设施能自动提供量度、审计日志、启动和停止处理q程、事仉知和作?Web 服务q行时的一部分Q也是_L?SOAP 服务器)的其它管理功能。因为基设施通过观察它所托管的组件的行ؓ不可能收集到所有的信息Q所?Web 服务实现也许会需要向托管它的服务器提供基本的健康度和监督信息?/p><p>Web 服务基础设施应该为服务提供一U简单的方式以参与管理和利用理基础设施。可理的服务的 WSDL 文档的定义应当是 Web 服务能实现提供通过理pȝ讉K Web 服务的管理信息的功能。这一接口可能包括的能力是获得配置和量度数据、更新配|及接收来自可管理的 Web 服务的事件?/p><p>Web 服务体系l构的^台独立性它不适合套用M一?Web 服务理标准。因此,需要有一U基?Web 服务而且允许 Web 服务与管理系l通信的方法。ؓ了达到这一目的Q还应当定义?WSDL 文档描述的、可接收来自可管?Web 服务的事件以及量度更新的理服务Qƈ使其可用。管理服务的实现技术与 Web 服务无关。但是,对于Z Java 技术的环境QJava 理扩展QJava Management ExtensionQJMXQ应该是合乎逻辑的而且厂商不可知的选择。通过使用 JMX q样的开放标准,对现有的pȝ理提供者来_要把其目前所提供的品扩展ؓ包括 Web 服务关键元素的管理应该是很容易的。Web 服务的管理体pȝ构仍在向前发展?/p><p> </p><p>14.4 Web Services 目实战</p><p>14Q?Q? Web Services实现</p><p> </p><p>本书是重点讲解EJB 3.0的。在理解了Web Services原理之后Q?接下来我们讲解如何用J2EE和EJB3.0来实现Web Services</p><p> </p><p>Web 服务遵@ Java 2 q_Q企业版QJava 2 PlatformQEnterprise EditionQJ2EEQ、通用对象h代理体系l构QCommon Object Request Broker ArchitectureQCORBAQ以及其它针对与耦合较紧的分布式或非分布式应用程序集成的标准。Web 服务是部|ƈ提供通过 Web 讉K业务功能的技术;J2EE、CORBA 和其它标准是实现 Web 服务的技术?/p><p> </p><p>J2EE 1.4Z用常规JavacL企业UJava Beans来创建和部vweb services提供了一个全面的q_。以下表格给ZJ2EE 1.4中包括的web service APIs的细节?nbsp;<br /><img src="http://www.ascenttech.cn/html/book/part/step3/xx12/image011.jpg" width="634" height="343" alt="" /><br />定义在Java Community Process的JSR 101之下的JAX-RPCQ提供了创徏和访问web services的Java API,因此它是使用J2EEq_创徏和部|web services?#8220;心脏和灵?#8221;。通过向应用程序开发者隐藏XMLcd和Javacd映射的复杂性,以及处理XML和SOAP消息的底层细节,它提供了一个简单的Q健壮的创徏web services应用的^台。ؓ了引入一个方法调用范式,它提供了两种~程模式:服务器端模式Q用JavacL无状态EJB开发web service 端点Q和客户端模式,创徏作ؓ本地对象讉Kweb services的Java客户端。JAX-RPC 1.1要求使用SOAP 1.1Qƈ且实C使用其他技术创建的web services之间的互操作性,比如微Y?NET。实CJ2EE1.4规范的应用服务器Q比如OC4J 10.1.3和SUN的Java System Application Sever,提供了对于JAX-RPC的支持?/p><p>JAX-RPC的叫法有点用词不当,因ؓ它既支持RPCcd的web servicesQ也支持文档cd的web services?/p><p>Web Services部v模型</p><p>在J2EE 1.4之前Q所有J2EE商家都用他们私有的部v模型支持web services。J2EE 1.4为Java Web Services定义了部|模型。它为J2EEq_上的web services制定了开发,部v以及服务发布和用的标准?/p><p>有了J2EE 1.4对web services的支持,让我们学习用J2EEq_来徏造web service的方法?/p><p>使用J2EE创徏一个Web Service</p><p>把web service创徏成一个轻便的和可互操作的分布式组件不是一琐的d。如之前讨论的,你既可以把常规Javac,也可以把无状态EJB部v成web services。常规Javac被打包在一个web模块中,而EJB web services被打包在标准的ejb-jar模块中?/p><p>在这两种部v选择中,你会使用哪一个呢?</p><p>Java cd无状态EJB:永无止境的争?/p><p>你会选择常规Javac还是EJB作ؓ你创建web service的技术可能是一个长期的争论。JavacLEJB更容易开发,它是U的Java对象Qƈ且它不具有EJB带来?#8220;额外辎重”。但是,EJB提供了几个很好的特点Q比如被声明的事务和安全性,因此它开发者将_֊集中于徏立商业逻辑Q而不需要担心基服务架构。EJB 3.0大大化了设计模型Q在它的规范中,EJB看v来就像常规JavacR?/p><p>使用J2EE 5.0化SOA的开?/p><p>  使用J2EE创徏面向服务的应用程序确实很困难Q因此通过使用由JSR 181定义的Web Services 元数据注解,J2EE 5.0开发更单。EJB 3.0和Web Services元数据具有相似的目标Q就是向开发者提供亲和力?/p><p>  Z在J2EE 1.4中开发一个简单的Java web serviceQ你需要几个web service定义文g:WSDLQ映文件和几个冗长的标准以及私有的web services部v描述W。Web Services元数据规范用一U类gEJB 3.0的缺省配|方法来使开发更ѝWeb Services元数据注解处理器(或web services 装配工具)会ؓ你生成这些文Ӟ因此你只需要关心类的实现?/p><p>  当你使用Web Services元数据开发时Q这是一个看h如此单的Java web service:</p><p>package com.ascenttech.ejb30.ws.demo; <br />import javax.jws.WebMethod; <br />import javax.jws.WebService; <br />@WebService(name = "HelloWorldService", <br />targetNamespace = "http://hello/targetNamespace" ) <br />public class HelloWorldService { <br />@WebMethod public String sayhello(String name ) { <br />return "Hello” +name+ “ from jws";<br />} <br />}</p><p>  正如我之前提到的QEJB 3.0使用常规Javacȝ化了EJB的开发。通过利用EJB 3.0和Web Services元数据,开发基于EJB的web services会变得来简单。当使用EJB 3.0和web services元数据时Q这是一个看h如此单的HelloWorld EJB web service。你不必担心创徏WSDLQ部|描q符{等Q应用服务器会在部vq程中生成这些定义文件?/p><p>package com.ascenttech.ejb30.ws;<br />import javax.ejb.Remote;<br />import javax.jws.WebService;<br />@WebService <br />public interface HelloServiceInf extends java.rmi.Remote{<br />@WebMethod java.lang.String sayHello(java.lang.String name) <br />throws java.rmi.RemoteException;<br />}</p><p>  如下是EJB 3.0?HelloWorld EJB的实现类:</p><p>package com.ascenttech.ejb30.ws;<br />import java.rmi.RemoteException;<br />import javax.ejb.Stateless;<br />@Stateless(name="HelloServiceEJB")<br />public class HelloServiceBean implements HelloServiceInf {<br />public String sayHello(String name) {<br />return("Hello "+name +" from first EJB3.0 Web Service");<br />}<br />}</p><p>  以上例子清楚的表明了通过使用web services元数据和EJB 3.0Q服务开发正在变得越来越单。现在,你可以在实现了J2EE规范的应用服务中Q比如JBoss Application Server{,开始创建和部v你的web services了?/p><p>14.4Q? Web Services 目实战</p><p>14.4.2.1 Web Services的实?br />本节使用EJB 3.0 实现一个web Servicesd的例子。下面我们创Z个工E叫QEmployeeManager。加入用到的EJB 3.0的jar包?/p><p>我们先创建服务器端的实体BeanQ这和创建普通的Ejb3.0实体bean是一LQ?/p><p>package com.ascent.ejb.po;</p><p>import java.io.Serializable;</p><p> </p><p>import javax.ejb.Remote;</p><p>import javax.ejb.Stateless;</p><p>import javax.persistence.Column;</p><p>import javax.persistence.Entity;</p><p>import javax.persistence.GeneratedValue;</p><p>import javax.persistence.Id;</p><p>import javax.persistence.Table;</p><p>@SuppressWarnings("serial")</p><p>@Entity</p><p>@Table(name = "usr")</p><p> </p><p>public class User implements Serializable</p><p>{</p><p>private Integer id;</p><p>private String name;</p><p>private String password;</p><p>private String description;</p><p>@Id</p><p>@GeneratedValue</p><p>public Integer getId()</p><p>{</p><p>return id;</p><p>}</p><p>public void setId(Integer id)</p><p>{</p><p>this.id = id;</p><p>}</p><p>@Column(name = "name", nullable = false)</p><p>public String getName()</p><p>{</p><p>return name;</p><p>}</p><p>public void setName(String name)</p><p>{</p><p>this.name = name;</p><p>}</p><p>@Column(name = "password", nullable = false)</p><p>public String getPassword()</p><p>{</p><p>return password;</p><p>}</p><p>public void setPassword(String password)</p><p>{</p><p>this.password = password;</p><p>}</p><p>@Column(name = "description", nullable = true, length = 100)</p><p>public String getDescription()</p><p>{</p><p>return description;</p><p>}</p><p>public void setDescription(String description)</p><p>{</p><p>this.description = description;</p><p>}</p><p>}</p><p>接着创徏q程接口Q?/p><p>package com.ascent.webservice.bean;</p><p> </p><p>import java.rmi.Remote;</p><p>import javax.jws.WebMethod;</p><p>import javax.jws.WebService;</p><p>import javax.jws.soap.SOAPBinding;</p><p>import javax.jws.soap.SOAPBinding.Style;</p><p>@WebService</p><p>@SOAPBinding(style=Style.RPC)</p><p>public interface LoginDao extends Remote {</p><p>@WebMethod</p><p>public boolean isLogin(String name, String password);</p><p>}</p><p>在LoginDaocM要注意的是Remote接口是要实现的,@SOAPBinding(style=Style.RPC)QSoap的绑定方式也是需要的Q不然在客户端是找不到LoginDao ?/p><p>下面创徏会话beanQ?/p><p>package com.ascent.webservice.bean;</p><p>import java.util.List;</p><p>import javax.ejb.Stateful;</p><p>import javax.ejb.Stateless;</p><p>import javax.jws.WebService;</p><p>import javax.persistence.EntityManager;</p><p>import javax.persistence.PersistenceContext;</p><p>import javax.persistence.Query;</p><p>@Stateless</p><p>@WebService(endpointInterface = "com.ascent.webservice.bean.LoginDao")</p><p>public class LoginDaoBean</p><p>{</p><p>@PersistenceContext</p><p>protected EntityManager em;// the manager of entity</p><p>public boolean isLogin(String name, String password)</p><p>{</p><p>// define query sentence</p><p>StringBuffer hql = new StringBuffer();</p><p>hql.append("from User u where u.name='" + name + "'");</p><p>hql.append(" and u.password='" + password + "'");</p><p>// create the query</p><p>Query query = em.createQuery(hql.toString());</p><p>List queryList = query.getResultList();</p><p>// if the result is null</p><p>if (queryList.size() == 0)</p><p>{</p><p>return false;</p><p>}</p><p>// if the user's length greater 1</p><p>if (queryList.size() > 1)</p><p>{</p><p>return false;</p><p>}</p><p>// return single user</p><p>return true;</p><p>}</p><p>}</p><p>x服务器端的类是徏好了Q这里又两个问题Q需要说明一?/p><p>AQ?两个cȝҎ中都没有抛出异常Q可不可以抛出呢? 可以。但到实现SOA的时候会有一些问题,是异常在经axis 通过WSDL2Java 生成后,在程序运行时有可能会出现找不到的情Ş。所以本文ؓ了让大家在仿照这个例子时都能成功Q所以也抛弃了异常的抛出?/p><p>BQ?两个cȝҎ的返回值是基本cdQ而不是自定义cdQؓ什么会q样呢,自定义类型可以不可以呢,可以?/p><p>现在我们的webservice的服务器端就已经创徏好了Q我们把服务器端的三个类和persistence.xml文g一h包部|到jboss服务器里。包名是QempdEjb?/p><p>下面我们来创建客LQ?/p><p>package com.ascent.webservice.client;</p><p>import java.net.URL;</p><p>import javax.xml.namespace.QName;</p><p>import javax.xml.rpc.Service;</p><p>import javax.xml.rpc.ServiceFactory;</p><p>import com.ascent.webservice.bean.LoginDao;</p><p>public class LoginClient</p><p>{</p><p>public static void main(String[] args) throws Exception</p><p>{</p><p>String userName ="lxl";</p><p>String password = "lxl";</p><p>URL url = new URL("http://localhost:8080/empdEjb/LoginDaoBean?wsdl");</p><p>QName qname =</p><p>new QName("http://bean.webservice.ascent.com/jaws","LoginDaoService");</p><p>ServiceFactory factory = ServiceFactory.newInstance();</p><p>Service service = factory.createService(url, qname);</p><p>LoginDao loginDao = (LoginDao) service.getPort(LoginDao.class);</p><p>boolean isExists = loginDao.isLogin(userName, password);</p><p>if(isExists)</p><p>{</p><p>System.out.println("hello " + userName);</p><p>}</p><p>else</p><p>{</p><p>System.out.println("sorry " + userName + ", you are not user in the system!");</p><p>}</p><p>}</p><p>}</p><p>把服务器端发布出M后,服务器端会自动发布一个webServiceQƈ且生成ƈ发布一个WSDL文gQ通过讉Khttp://localhost:8080/empdEjb/LoginDaoBean?wsdlq个|址是可以找到的。http://bean.webservice.ascent.com/jaws ?LoginDaoService 字符Ԍ在客LE序当中出现了上面两个字W串Q它们在你生成的wsdl 文g中有详细的描q。在地址栏里输入http://localhost:8080/empdEjb/LoginDaoBean?wsdlQ就可以看到wsdl文g了。这里你所需要做的是按照你自q情况~写你自q客户端程序。启动服务器后,在机子上q行客户端程序就可以了。当然你也可以去~写自己的jsp客户端去调用它。wsdl文g的内容如下:</p><p><definitions name="LoginDaoService"</p><p>targetNamespace="http://bean.webservice.ascent.com/jaws"></p><p><types/></p><p><message name="LoginDao_isLogin"></p><p><part name="String_1" type="xsd:string"/></p><p><part name="String_2" type="xsd:string"/></p><p></message></p><p>-</p><p><message name="LoginDao_isLoginResponse"></p><p><part name="result" type="xsd:boolean"/></p><p></message></p><p>-</p><p><portType name="LoginDao"></p><p>-</p><p><operation name="isLogin" parameterOrder="String_1 String_2"></p><p><input message="tns:LoginDao_isLogin"/></p><p><output message="tns:LoginDao_isLoginResponse"/></p><p></operation></p><p></portType></p><p>-</p><p><binding name="LoginDaoBinding" type="tns:LoginDao"></p><p><soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/></p><p>-</p><p><operation name="isLogin"></p><p><soap:operation soapAction=""/></p><p>-</p><p><input></p><p><soap:body namespace="http://bean.webservice.ascent.com/jaws" use="literal"/></p><p></input></p><p>-</p><p><output></p><p><soap:body namespace="http://bean.webservice.ascent.com/jaws" use="literal"/></p><p></output></p><p></operation></p><p></binding></p><p>-</p><p><service name="LoginDaoService"></p><p>-</p><p><port binding="tns:LoginDaoBinding" name="LoginDaoPort"></p><p><soap:address location="http://lixinli:8080/empdEjb/LoginDaoBean"/></p><p></port></p><p></service></p><p></definitions></p><p>q样一个WebService+Ejb 3.0的例子就实现了?/p><p>14.4.2.2 SOA的实?br />本例q是Z前两个例子的基础上的Q要保证上面的例子是能正常运行的?/p><p>1.WSDL2Java<br />从名字上可以看出Q是把wsdl 转化为java?在上面的例子中我们在服务器端生成了一个wsdl文gQ现在要做的是你把那个wsdl文gl别人或者别的公司,让他们根据wsdl中所描述的你所提供的服务,d发一个应用,来访问你所提供的接口。拿到这个WSDL文g后要做什么呢Qto java。我们来看看怎么to java?/p><p>q里Q在原来的EmployeeManager工程下面Z个wsdl文g夹,它攑֜下面Q然后所要做的准备工作是Q把包括axis在内的几个jar包找刎ͼ讄在你的classpath里面。然后在命o行下q行WSDL2Java?/p><p>哪几个jar包?</p><p>C:\axis-1_4\lib\axis.jar;C:\axis-1_4\lib\axis-ant.jar;C:\axis-1_4\lib\commons-discovery-0.2.jar;C:\axis-1_4\lib\commons-logging-1.0.4.jar;C:\axis-1_4\lib\jaxrpc.jar;C:\axis-1_4\lib\log4j-1.2.8.jar;C:\axis-1_4\lib\saaj.jar;C:\axis-1_4\lib\wsdl4j-1.5.1.jar;E:\jboss-4.0.5\server\default\lib\activation.jar;E:\jboss-4.0.5\server\default\lib\mail.jar</p><p>q是我classpath 里面所讄的几个jar包,后面两个可以不需要,W二个也可以不需要,后俩个只是保证运行的时候没有警告?/p><p>1Q?LoginDaoBean.wsdl 攑֜wsdl文g夹下面。E:\workspace\EmployeeManager\wsdl</p><p>2Q?在命令行下进入E:\workspace\EmployeeManager\wsdl</p><p>3Q?执行 java org.apache.axis.wsdl.WSDL2Java LoginDaoBean.wsdl</p><p>q个时候,你会发现在wsdl文g夹下面生成了一个目录,它里面包含了几个javacR?/p><p>LoginDao.javaQLoginDaoBindingStub.javaQLoginDaoService.javaQLoginDaoServiceLocator.java</p><p>2 SOA的实?br />本节是一个以SOA+struts实现d的例子。新Z个web工程QEmployeeWebServiceQ然后将上面生成的几个类攑օ你的src目录下面Q是放整个目录,别只攑և个类q去. 构徏struts资源。创建struts的过E就不在q里l说了。创建的action内容如下Q?/p><p>package com.ascent.webservice.struts.action;</p><p>import javax.servlet.http.HttpServletRequest;</p><p>import javax.servlet.http.HttpServletResponse;</p><p>import javax.servlet.http.HttpSession;</p><p>import org.apache.commons.logging.Log;</p><p>import org.apache.commons.logging.LogFactory;</p><p>import org.apache.struts.action.Action;</p><p>import org.apache.struts.action.ActionForm;</p><p>import org.apache.struts.action.ActionForward;</p><p>import org.apache.struts.action.ActionMapping;</p><p>import org.apache.struts.action.ActionMessage;</p><p>import org.apache.struts.action.ActionMessages;</p><p>import com.ascent.webservice.struts.form.LoginForm;</p><p>import com.ascent.webservice.bean.jaws.LoginDao;</p><p>import com.ascent.webservice.bean.jaws.LoginDaoServiceLocator;</p><p>public class LoginAction extends Action</p><p>{</p><p>public ActionForward execute(ActionMapping mapping, ActionForm form,</p><p>HttpServletRequest request, HttpServletResponse response)</p><p>throws Exception {</p><p>LoginForm loginForm = (LoginForm) form;</p><p>String userName = loginForm.getLoginName();</p><p>String password = loginForm.getPassword();</p><p>LoginDaoServiceLocator loginDaoServiceLocator = new LoginDaoServiceLocator();</p><p>LoginDao loginDao=</p><p>loginDaoServiceLocator.getLoginDaoPort();</p><p>boolean isExists = loginDao.isLogin(userName, password);</p><p>if(isExists)</p><p>{</p><p>System.out.println("hello " + userName);</p><p>HttpSession session = request.getSession();</p><p>session.setAttribute("loginName", loginForm.getLoginName());</p><p>return mapping.findForward("success");</p><p>}</p><p>else</p><p>{</p><p>System.out.println("sorry " + userName + ", you are not user in the system!");</p><p>ActionMessages messages = new ActionMessages();</p><p>messages.add("login",new ActionMessage("error.login.jsp.loginName.exists"));</p><p>this.saveErrors(request, messages);</p><p>return mapping.getInputForward();</p><p>}</p><p>}</p><p>}</p><p>q里用到的LoginDaoServiceLocatorcdgetLoginDaoPort()Ҏ是使用WSDL2Java命o把wsdl文g生成的类。现在就可以打包成叫employee的war文gQ运行它。至此,你便可以在浏览器中输?a href="http://localhost:8080/employee/login.jsp">http://localhost:8080/employee/login.jsp</a>Q运行你q个SOA的应用了。如果是把服务器端部|到别的机器上,只要把localhost改ؓ相应的ip可以了?/p><p>结<br />本章首先介绍了目前一个前沿技术:Web Services和面向服务的软g架构QService Oriented ArchitectureQ简USOAQ。在理解了Web Services原理之后Q?接下来我们讲解了如何使用J2EE和EJB3.0来实现Web Services?br /></p><p> </p></span><img src ="http://www.tkk7.com/mlzry0612/aggbug/357633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mlzry0612/" target="_blank">Daniel</a> 2011-08-31 13:25 <a href="http://www.tkk7.com/mlzry0612/articles/357633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Difference Between RPC and Document Style WSDLhttp://www.tkk7.com/mlzry0612/articles/357632.htmlDanielDanielWed, 31 Aug 2011 05:24:00 GMThttp://www.tkk7.com/mlzry0612/articles/357632.htmlhttp://www.tkk7.com/mlzry0612/comments/357632.htmlhttp://www.tkk7.com/mlzry0612/articles/357632.html#Feedback0http://www.tkk7.com/mlzry0612/comments/commentRss/357632.htmlhttp://www.tkk7.com/mlzry0612/services/trackbacks/357632.html

rpc和document的区?/span>  

2008-10-24 18:48:07|  分类Q?/span> webservice|字号 订阅

 

译?The Difference Between RPC and Document Style WSDL

rpc和document到底是什么意思?他们如何?encoded/literal"相关联?二者的冲突来自哪里Q?/p>

binding的style和use

通常情况下,web服务是由一个wadl文g来描q的的。在q个文g中,抽象的描q所支持的web服务操作和消息,然后兌C个具体的|?/p>

l歇息和消息格式。典型的wsdl文gp个几个元素组?tyoes,message.porttype用来描述抽象的定?biding和service指定具体的实

现。所有的q些元素包装在definitions元素中?/p>

在binding元素中,rpc和document是最值得我们x的元素。wsdl ?binding描述了如何将service兌到消息协议;q些消息协议?/p>

httpQmimeQsoap中的L一U。不q,实际中,soap是最常用的协议;rpc和document的区别也是在soap的下的区别(it is SOAP that

the RPC/document distinction refers toQ。通常http(s)是传输soap消息的协议?/p>

<wsdl:binding>元素包含一对参敎ͼstyle(rpc|document)和use(encoded|literal)Q他俩会影响到soap消息的格?他们的用方式如?/p>

Q?/p>

<wsdl:binding name="Config1Binding" type="prt0:CreditLimitLocalWebServiceVi_Document">

    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />

     <wsdl:operation name="creditLimitCheck">

        <soap:operation soapAction="" />

         <wsdl:input>

            <soap:body use="literal" parts="parameters" />

         </wsdl:input>

        <wsdl:output>

            <soap:body use="literal" />

         </wsdl:output>

</wsdl:operation>

</wsdl:binding>

style属?

wsdl1.1要求binding的style要么是rpc要么是doucment。这个选择与如何组lsoap的负L兟뀂下面是分别他们如何影响<soap:body>?/p>

容的l节?/p>

documentQ?lt;soap:body>的内容由定义?lt;wsdl:type>中的xml模式指定。他不需要遵循特定的soap规范。简a之,soap消息是通过

<soap:body>中的document发送出去,而没有额外的要遵循的格式规则。document style是一U默认的选择?/p>

rpcQ?<soap:body>元素的结构需要遵循特定的规则Qsoap1.1规范W?部分有细节)。根据这些规则,<soap:body>可以包含唯一一个元?/p>

Q这个元素在operation后被命名Q所有的参数都必d成这个元素的子元素?/p>

因ؓ可以自由的选择哪种消息格式Q遵循document格式的soap消息看上d像rpc格式?/p>

现在Q决定性的问题是:选择其中L一个选项后的l果是什么样Qؓ何要选择rpc或者documentQ很多情况下Q选择他们后,soap消息

的格式看h很相像,那么Z么还要提供这U选择呢?原因要从soap标准化的历程中寻找?/p>

use属?/p>

q个属性指定了soap消息的编码规则。他同样?lt;wsdl:binding>元素中完成。他的gؓencoded或者literal.

他引用了一pd规则Qsoap客户端和soap服务端都遵@q些规则以解?lt;body>元素中的内容?/p>

use="literal" 意味着type定义遵@xml模式定义

use="encoded" 参考xml中已有的应用数据Q通常指的是soap1.1规范中的soap~码规则。如果文档中没有自定义数据,可以选择

encoded?/p>

附文章全文:

The Difference Between RPC and Document Style WSDL

Summary

RPC style and document style are catchphrases frequently heard in the context of web services and the SOAP protocol. What exactly do they mean? How do they relate to the pair of terms "encoded/literal"? Where does the confusion about these terms come from? This article describes the WSDL binding style and use attributes.

By Susanne Rothaug

20 Nov 2004

Binding Style and Use

A web service is usually described by a WSDL (Web Services Description Language) document. In this document, the supported web service operations and messages are described abstractly and then bound to a concrete network protocol and message format. A typical WSDL document consists of the following elements: "types," "message," and "portType" for the abstract definitions; "binding" and "service" for the concrete specification. All of these elements are wrapped inside a "definitions" element.

In the context of RPC and document style, it is the binding element that we need to take a closer look at. A WSDL binding describes how the service is bound to a messaging protocol, either HTTP GET/POST, MIME, or SOAP. In practice, SOAP is the most universally used protocol; it is SOAP that the RPC/document distinction refers to. Usually HTTP(S) is used as transport protocol for the SOAP message – "SOAP over HTTP(S)."

The <wsdl:binding> element of the WSDL contains a pair of parameters that influence the form of the resulting SOAP messages: binding style (RPC or document) and use (encoded or literal). See how style and use are defined in the WSDL fragment below: <wsdl:binding name="Config1Binding" type="prt0:CreditLimitLocalWebServiceVi_Document">     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />      <wsdl:operation name="creditLimitCheck">         <soap:operation soapAction="" />          <wsdl:input>             <soap:body use="literal" parts="parameters" />          </wsdl:input>         <wsdl:output>             <soap:body use="literal" />          </wsdl:output> </wsdl:operation> </wsdl:binding>

The "Style" Attribute

WSDL 1.1 specifies the style of the binding as either RPC or document. This choice corresponds to how the SOAP payload - i.e., how the contents of the <soap:Body> element - can be structured. Here are some details of how each style affects the contents of <soap:Body>:

  • Document: the content of <soap:Body> is specified by XML Schema defined in the <wsdl:type> section. It does not need to follow specific SOAP conventions. In short, the SOAP message is sent as one "document" in the <soap:Body> element without additional formatting rules having to be considered. Document style is the default choice.

  • RPC: The structure of an RPC style <soap:Body> element needs to comply with the rules specified in detail in Section 7 of the SOAP 1.1 specification. According to these rules, <soap:Body> may contain only one element that is named after the operation, and all parameters must be represented as sub-elements of this wrapper element.

As a consequence of the freedom of choice that the document style offers, the SOAP messages conforming to a document style WSDL may look exactly the same as the RPC equivalent.

The decisive question now is: What are the consequences of choosing one option or another? Why choose RPC over document, or document over RPC? In many cases, the SOAP messages generated from either RPC or document style WSDLs look exactly the same - so why offer the choice at all? The reason may be found in the history of the SOAP standard.

SOAP has its roots in synchronous remote procedure calls over HTTP and the appearance of the document accordingly followed these conventions. Later, it was seen as a simplification to use arbitrary XML in the SOAP body without adhering to conventions. This preference is reflected in the document style WSDL documents. So far, both options are represented in the WSDL specification and the choice of one or the other is mainly a question of personal taste since most SOAP clients today accept both versions.

The "Use" Attribute

The use attribute specifies the encoding rules of the SOAP message. This is also done within the <wsdl:binding> element, as seen in the example above. The value can be encoded or literal. It refers to the serialization rules followed by the SOAP client and the SOAP server to interpret the contents of the <Body> element in the SOAP payload.

  • use="literal" means that the type definitions literally follow an XML schema definition.

  • use="encoded" refers to the representation of application data in XML, usually according to the SOAP encoding rules of the SOAP 1.1 specification. The rules to encode and interpret a SOAP body are in a URL specified by the encodingStyle attribute. Encoded is the appropriate choice where non-treelike structures are concerned, because all others can be perfectly described in XML Schema.

The combination of the style and use attributes leads to four possible style/use pairs:

  1. RPC/encoded

  2. RPC/literal

  3. document/encoded

  4. document/literal

Some of these combinations are rarely used in practice, such as document/encoded. In general, the literal use is gaining importance, and as far as RPC/encoded is concerned, the Web Services Interoperability Organization (WS-I) in its Basic Profile Version 1.0a of August 2003 ruled out the use of SOAP encoding with web services. Document/literal and RPC/literal will be the only allowed style/use combinations in the future.



Daniel 2011-08-31 13:24 发表评论
]]>
Webservices with HTTPShttp://www.tkk7.com/mlzry0612/articles/350434.htmlDanielDanielTue, 17 May 2011 13:39:00 GMThttp://www.tkk7.com/mlzry0612/articles/350434.htmlhttp://www.tkk7.com/mlzry0612/comments/350434.htmlhttp://www.tkk7.com/mlzry0612/articles/350434.html#Feedback0http://www.tkk7.com/mlzry0612/comments/commentRss/350434.htmlhttp://www.tkk7.com/mlzry0612/services/trackbacks/350434.html
1. Generate KeyStore


set SERVER_DN="CN=Server, OU=ec, O=ec, L=nanchang, S=jiangxi, C=CN"
set CLIENT_DN="CN=Client, OU=ec, O=ec, L=nanchang, S=jiangxi, C=CN"
set KS_PASS=-storepass PASSWORDHERE
set KEYINFO=-keyalg RSA
keytool -genkey -alias Server -dname %SERVER_DN% %KS_PASS% -keystore server.keystore %KEYINFO% -keypass strongit
keytool -export -alias Server -file test_axis.cer %KS_PASS% -keystore server.keystore
keytool -import -file test_axis.cer %KS_PASS% -keystore client.truststore -alias serverkey -noprompt
keytool -genkey -alias Client -dname %CLIENT_DN% %KS_PASS% -keystore client.keystore %KEYINFO% -keypass strongit
keytool -export -alias Client -file test_axis.cer %KS_PASS% -keystore client.keystore
keytool -import -file test_axis.cer %KS_PASS% -keystore server.truststore -alias clientkey -noprompt
2. Modify server.xml

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" keystoreFile="D:\test\server.keystore" keystorePass="PASSWORDHERE"
                 truststoreFile="D:\test\server.truststore" truststorePass="PASSWORDHERE" sslProtocol="TLS" />


3. add below code into your invoke code

System.setProperty("javax.net.ssl.keyStore",
"D:\\test\\client.keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "PASSWORDHERE");
System.setProperty("javax.net.ssl.trustStore",
"D:\\test\\client.truststore");
System.setProperty("javax.net.ssl.trustStorePassword",
"PASSWORDHERE");
URL url = new URL("https://localhost:8443/TOMCAT6/services/GetName");


Daniel 2011-05-17 21:39 发表评论
]]>
JBoss nested exception is: Invalid invocation 调节http://www.tkk7.com/mlzry0612/articles/221894.htmlDanielDanielThu, 14 Aug 2008 02:14:00 GMThttp://www.tkk7.com/mlzry0612/articles/221894.htmlhttp://www.tkk7.com/mlzry0612/comments/221894.htmlhttp://www.tkk7.com/mlzry0612/articles/221894.html#Feedback0http://www.tkk7.com/mlzry0612/comments/commentRss/221894.htmlhttp://www.tkk7.com/mlzry0612/services/trackbacks/221894.html使用Eclipse EJB ?调用此EJB的JSP或Servlet部v到JBoss4.0.2中,使用LOMBOZ EJB Test Client Wizard 创徏的Java客户端可以正常调用EJBQ但使用Servlet和JSP调用时出错:
04:03:33,714 INFO [STDOUT] java.rmi.ServerException: EJBException:; nested exception is:
javax.ejb.EJBException: Invalid invocation, check your deployment packaging, method=public abstract test.ejb.TestEJBInterface test.ejb.TestEJBHome.create() throws javax.ejb.CreateException,java.rmi.RemoteException

解决办法Q?/span>

1] Edit conf/jboss-service.XML and make CallByValue as 'true' in NamingService as below

<mbean code="org.jboss.naming.NamingService"
name="jboss:service=Naming"
xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
true


2] Edit deploy/ear-deployer.xml, and set Isloated and CallByValue as true

3]Edit deploy\jbossweb-tomcat55.sar\META-INF\jboss-service.xml , and set Java2ClassLoadingCompilance and UseJbossWebLoader attributes as false



Daniel 2008-08-14 10:14 发表评论
]]>
MyEclipse + AXIS2 http://www.tkk7.com/mlzry0612/articles/185209.htmlDanielDanielMon, 10 Mar 2008 15:02:00 GMThttp://www.tkk7.com/mlzry0612/articles/185209.htmlhttp://www.tkk7.com/mlzry0612/comments/185209.htmlhttp://www.tkk7.com/mlzry0612/articles/185209.html#Feedback11http://www.tkk7.com/mlzry0612/comments/commentRss/185209.htmlhttp://www.tkk7.com/mlzry0612/services/trackbacks/185209.html非常感谢呼必斯哈拉图Q写得非常的详细Q图文ƈ茂?br /> 但是Q我的环境和他文中的不太一P所以根据自q环境重写如下?/font>

一、环境准?/font>

1.1软g下蝲准备
Tomcat 5.5下蝲地址Q?br />
http://tomcat.apache.org/download-55.cgi#5.5.20

Axis War包:
http://ftp.wayne.edu/apache/ws/axis2/1_1_1/axis2.war

Axis Eclipse plug-in(代码生成工具和打包工?Q?br /> http://apache.justdn.org/ws/axis2/tools/1_1_1/axis2-eclipse-codegen-wizard.zip
http://apache.justdn.org/ws/axis2/tools/1_1_1/axis2-eclipse-service-archiver-wizard.zip

Eclipse 3.2Q?br /> http://www.eclipse.org/

MyEclipse5.5M1Q?br /> http://www.myeclipseide.com/

1.2安装

A.首先搭徏开发环境,下载的Eclipse解压~到一个目录,D:eclipse-SDK-3.2-win32?br /> B.下载到?/span>Axis 的两?/span>plug-in解压~到D:Axis-Plugin-Direclipseplugins目录?/span>?br /> C.在eclipse目录下创建D:eclipse-SDK-3.2-win32eclipselinksQ新建文件名?axis-eclipse-plugin.link

内容为:
path=D:Axis-Plugin-Dir


D.安装MyEclipse5.5M1,eclipse目录指向D:eclipse-SDK-3.2-win32Q删除D:eclipse-SDK-3.2-win32eclipseconfiguration下的org.eclipse.update目录?span lang="">然后启动MyEclipseQ选择“File->New->Other”可以看到如下的两个界?/span>?br /> 1、Axis2 plugins


2、Web Servieces plugins

E.下面开始搭建Web Services的部|环境?br />
下载的tomcat5.5解压~到一个目录D:Tomcat5.5?/p>

F.axis2.war包拷贝到tomcat安装目录下的webapps目录?/p>

G.启动Tomcat(D:Tomcat5.5binstartup.bat)Q打开览器输入ƈ讉K:http://127.0.0.1:8080/axis2 来查?l果如下图,表示axis2已经工作正常?/p>

二、快速开?/p>

2.1创徏webApps目

启动MyEclipseQ新建立一?/span>WebAppsQ?/span>File->New->Project->Web ProjectQ?/span>,l?/span>Project Name ?/span>SayHello
Q其他保持不改变?br />
2.2创徏WSDL文g

A.选择File->New-Other菜单Q进入后扑ֈMyEclipse->Web Servicesq择WSDL.如下图:

B.点击下一步按钮,昄如下图:

C.选择“src”目录作ؓ“Enter or select the parent folder”的|“File name”值给定ؓSayHello.wsdl?/font>

D.下一步》所有界面内容取默认|FinishQ?/font>

E.昄WSDL设计器的界面如下Q?/span>

F.修改图中标红色的部分Q?br /> 修改图中的NewOperation为SayHello;
修改input中parameters为SayHelloRequest;
修改output中parameters为SayHelloResponse;
修改完后如下图:

U色框内为变化的内容QWSDL文g修改完毕?/span>

2.3?/span>WSDL生成Java代码

A.选择菜单“File->New->Other”Q从对话框中选取“Axis2 Wizards”下面?#8220;Axis2 Code Generator”.点击“Next”

B.q入下一个页面,保持“Generate java source code from WSDL file”被选中Q点?#8220;Next”q入下一步?/span>
C.点击“Browse”来选取存放?/span>src目录下的SayHello.wsdl文gQ?#8220;Next”
q入下一步?br /> D.首先生成客户端代码和试代码Q设|如下:

E.下一步后Q选择SayHellosrc目录Q如下图Q?br />

Finish !

F.重复从A到C的步骤,然后生成服务端代码,讄如下Q?br />

后面同E?/span>

G.l束后,h目Q如图:

q是׃没有Axis2?/span>jar包放?/span>class path 中以及源代码?/span>package不ؓorg.example.www.sayhello引v的?br />
H.修改包名为org.example.www.sayhelloq从tomcat中的axis2 web应用WEB-INF/lib目录中加载所?/span>jar包到目的classpath中?/span>

I.?font size="4" face="楷体_GB2312">SayHelloTest.java 中引?/font>junit包?/font>

2.4~写业务代码

打开SayHelloSKeleton.java文g其中的方法如下:

 

public org.tonyzhangcn.ws.sayhello.SayHelloResponse SayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequest param0)

{

// Todo fill this with the necessary business logic

throw new java.lang.UnsupportedOperationException();

}

 

 修改为:

 

public org.tonyzhangcn.ws.sayhello.SayHelloResponse SayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequest request)
{
      try
    {
             SayHelloResponse response = new SayHelloResponse();
             response.setOut("Hi,"+request.getIn()+".How are you?");
             return response;
    }catch(UnsupportedOperationException e)
       {
           throw e;
   }
}

 

2.5打包

A.选择菜单“File->New->Other”Q从对话框中选取“Axis2 Wizards”下面?#8220;Axis2 Services Archive”.点击“Next”q入下一个页?/span>?/span>

B.选择~译好的class文g所在目录(本项目应该是WebRoot下面WEB-INF/classesQ,“Next”q入下一步?/span>

C.选择WSDL文g所在目录,此处?/span>src目录下的SayHello.wsdl文g?#8220;Next”,?#8220;Next”。选择services.xm文g?/span>

D.点击“Next”Q将记入最后一个页面,此处有两个选项Q一个是输出目录一个是处处文g名称。这里的输出文g名称l的?/span>SayHello。点?#8220;Finish”完成?/span>

2.6部v

AQ将打包好的文gSayHello.jar拯?/span>Tomcat中已l部|的Axis2应用?/span>WEB-INF/services目录下面?/span>

B.重新启动Tomcat?/span>

C.打开览器,输入http://127.0.0.1:8080/axis2,q点d中的“services”链接可以看到SayHello已经被部|Ӏ点?/span>SayHello提供的连接可以看C之对应的WSDL?/span>

2.7调用试
A.修改SayHelloTest.java文g中的Ҏ
testSayHello的内容ؓQ?br />

 

public void testSayHello() throws java.lang.Exception {
  String url="http://localhost:8080/axis2/services/SayHello";
  org.example.www.sayhello.SayHelloStub stub = new org.example.www.sayhello.SayHelloStub(url);
  org.example.www.sayhello.SayHelloStub.SayHello request = (org.example.www.sayhello.SayHelloStub.SayHello) getTestObject(org.example.www.sayhello.SayHelloStub.SayHello.class);
  request.setIn("Teamlet");
  System.out.println(stub.SayHello(request).getOut());
  assertNotNull(stub.SayHello(request));
 }

 

  从菜单中选择“RunQ?/span>>Run as->JUnit Test 完成试Q?/font>

<EOF>




Daniel 2008-03-10 23:02 发表评论
]]>
վ֩ģ壺 aëƬ| Ұ߹ۿ| ۺϹƷ| 1024ƷƵר| պɫƵһ| ޸ľƷ26U| ƬƵ| Ļ߹ۿƬ| Ľղ2020| Ƶ| 99ƵѹۿƵ | ССӰձۿ| Ļ˳й| ޾ƷAAƬ| av뾫Ʒվ| һƬѲ| ߹ۿavվ| ˿Ƶ| av߹ۿ| þ99޾Ʒۿ| ߹ۿĻ| ĻӰƬ߹ۿ| aƬ߲| HƬaaaֱ| ߹ۿ| AVպAV뵼| ߹ۿ㶮| ëƬƵ| 1000ڵƵۿ| һëƬȫѲ| ޾Ʒa߹ۿ| ŷഺɫУ԰С˵| ޳ɫۺվ| ޹ӰԺ| װ׹Ƶ| ŮߵƵѹۿڵ| һ| Ļ߿˶Ƭ| ҹƵ| С˵| ޹a˾Ʒ|