Web Service概述

  Web Service的定义

  W3C组织对其的定义如下,它是一个软件编制,为了支持跨网络的机器间相互操作交互而陈设。Web Service效劳通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行长途编制的请求效劳。 

  这里银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站从一个程序员的视角来观察web service。正正在传统的程序编码中,存正正在这种种的函数方法调用。通常,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站知途一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数P,方法A执行杀青后,返回治理结果R。这种函数或方法调用通常发生正正在同一台机器上的同一程序言语情况下。现正正在的银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站需要一种可以正正在折柳打算机间的折柳言语编写的运用程序编制中,通过网络通讯实现函数和方法调用的能力,而Web service正是应这种需求而降生的。

   最普遍的一种说法就是,Web Service = SOAP + HTTP + WSDL。其中,SOAP Simple Object Access Protocol)协议是web service的主体,它通过HTTP或者SMTP等运用层协议进行通讯,自身运用XML文件来描绘程序的函数方法和参数信歇,从而完成折柳主机的异构编制间的打算效劳治理。这里的WSDL(Web Services Description Language)web 效劳描绘言语也是一个XML文档,它通过HTTP向大众楬橥,颁发客户端程序关于某个举座的 Web service效劳的URL信歇、方法的定名,参数,返回值等。

   下面,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站先来熟习一下SOAP协议,看看它是怎样描绘程序中的函数方法、参数及结果对象的。 

  SOAP协议简介 

  什么是SOAP

  SOAP 指简单对象拜访协议,它是一种基于XML的消歇通讯格式,用于网络上,折柳平台,折柳言语的运用程序间的通讯。可自定义,易于扩展。一条 SOAP 消歇就是一个普通的 XML 文档,包含下列元素:

  Envelope 元素,标识XML 文档一条 SOAP 消歇

  Header 元素,包含头部信歇的XML标签

   Body 元素,包含所有的调用和照应的主体信歇的标签

  Fault 元素,错误信歇标签。 

   以上的元素都正正在 SOAP的定名空间http://www.w3.org/2001/12/soap-envelope中声明;

   SOAP的语法法则

   SOAP 消歇必须用 XML 来编码

   SOAP 消歇必须运用 SOAP Envelope 定名空间

   SOAP 消歇必须运用 SOAP Encoding 定名空间

  SOAP 消歇不行包含 DTD 援用

   SOAP 消歇不行包含 XML 治理指令

  SOAP 消歇的根蒂构制

XML/HTML代码
  1. <? xml version="1.0"?>    
  2. <soap:Envelope    
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">    
  5. <soap:Header>    
  6.   ...    
  7.   ...    
  8. </soap:Header>    
  9. <soap:Body>    
  10.   ...    
  11.   ...    
  12.   <soap:Fault>    
  13.     ...    
  14.     ...    
  15.   </soap:Fault>    
  16. </soap:Body>    
  17. </soap:Envelope>    

  SOAP Envelope 元素

   Envelope 元素是 SOAP 消歇的根元素。它指明 XML 文档是一个SOAP 消歇。它的属性 xmlns:soap的值必须是http://www.w3.org/2001/12/soap-envelope。

   encodingStyle 属性,语法:soap:encodingStyle="URI"

   encodingStyle 属性用于定义文档中运用的数据样板。此属性可显现正正在任何 SOAP 元素中,并会被运用到元素的实质及元素的所有子元素上。 

XML/HTML代码
  1. <? xml version="1.0"?>  
  2. <soap:Envelope  
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  5.   ...  
  6.   Message information goes here  
  7.   ...  
  8. </soap:Envelope>  

  SOAP Header 元素 

  actor 属性,语法soap:actor="URI" 

   通过沿着消歇路径经过折柳的端点,SOAP 消歇可从某个发送者散布到某个接收者。并非 SOAP 消歇的所有限制均打算传送到 SOAP 消歇的最着末点,不过,另一个方面,也许打算传送给消歇路径上的一个或众个端点。SOAP 的 actor 属性可被用于将 Header 元素寻址到一个特定的端点。 

   mustUnderstand 属性 ,语法soap:mustUnderstand="0|1" 

  SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行治理的接收者来说是强逼的还是可选的。假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则要求治理此头部的接收者必须认可此元素。

XML/HTML代码
  1. <? xml version="1.0"?>  
  2. <soap:Envelope  
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  5. <soap:Header>  
  6. <m:Trans  
  7. xmlns:m="http://www.jsoso.net/transaction/"   
  8. soap:mustUnderstand="1"   
  9. soap:actor="http://www.w3schools.com/appml/ “  >234</m:Trans>  
  10. </soap:Header>  
  11. ...  
  12. ...  
  13. </soap:Envelope>  

  SOAP Body 元素

  必需的 SOAP Body 元素可包含打算传送到消歇最着末点的执行 SOAP 消歇。Body元素中既可以包含SOAP定义的定名空间中的元素,如Fault,也可以是用户的运用程序自定义的元素。以下是一个用户定义的请求:

XML/HTML代码
  1. <? xml version="1.0"?>  
  2. <soap:Envelope  
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  5. <soap:Body>  
  6.    <m:GetPrice xmlns:m="http://www.jsoso.net/prices">  
  7.       <m:Item>Apples</m:Item>  
  8.    </m:GetPrice>  
  9. </soap:Body>  
  10. </soap:Envelope>  

   上面的例子请求苹果的价格。请帮理,上面的 m:GetPrice 和 Item 元素是运用程序专用的元素。它们并不是 SOAP 标准的一限制。而对应的 SOAP 照应应该雷同这样:

  SOAP Fault 元素

  Fault 元素表示 SOAP的错误消歇。它必须是 Body 元素的子元素,且正正在一条 SOAP 消歇中,Fault 元素只可显现一次。Fault 元素具有下列子元素:

 Web Service初学教程

   常用的SOAP Fault Codes

 Web Service初学教程

  HTTP协议中的SOAP 实例

  下面的例子中,一个 GetStockPrice 请求被发送到了效劳器。此请求有一个 StockName 参数,而正正在照应中则会返回一个 Price 参数。此功能的定名空间被定义正正在此地址中: "http://www.jsoso.net/stock"

  SOAP 请求:(帮理HTTP的Head属性)

XML/HTML代码
  1. POST /InStock HTTP/1.1  
  2. Host: www.jsoso.net  
  3. Content-Type: application/soap+xml; charset=utf-8  
  4. Content-Length: XXX  
  5.   
  6. <? xml version="1.0"?>  
  7. <soap:Envelope  
  8. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  9. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  10.   <soap:Body xmlns:m="http://www.jsoso.net/stock">  
  11.     <m:GetStockPrice>  
  12.       <m:StockName>IBM</m:StockName>  
  13.     </m:GetStockPrice>  
  14.   </soap:Body>    
  15. </soap:Envelope>  

   SOAP 照应:(帮理HTTP的Head属性)

XML/HTML代码
  1. HTTP/1.1 200 OK  
  2. Content-Type: application/soap+xml; charset=utf-8  
  3. Content-Length: XXX  
  4.   
  5. <? xml version="1.0"?>  
  6. <soap:Envelope  
  7. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  8. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  9.   <soap:Body xmlns:m="http://www.jsoso.net/stock">  
  10.     <m:GetStockPriceResponse>  
  11.       <m:Price>34.5</m:Price>  
  12.     </m:GetStockPriceResponse>  
  13.   </soap:Body>    
  14. </soap:Envelope>  

  HTTP协议中的SOAP RPC工作流程

 Web Service初学教程

  WSDL简介

   先容过了SOAP,让银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站体贴Web Service中另外一个浸要的组成WSDL。

  WSDL的浸要文档元素

 Web Service初学教程

  WSDL文档可以分为两限制。顶限制由抽象定义组成,而底限制则由举座描绘组成。抽象限制以单独于平台和言语的格事务署定义SOAP消歇,它们并不包含任何随机器或言语而变的元素。这就定义了一系列效劳,截然折柳的运用都可以实现。举座限制,如数据的序列化则归入底限制,由于它包含举座的定义。正正在上述的文档元素中,<types>、<message>、<portType>属于抽象定义层,<binding>、<service>属于举座定义层。所有的抽象可以是单独存正正在于别的文件中,也可以从主文档中导入。 

  WSDL文档的构制实例解析

  下面银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站将通过一个执行的WSDL文档例子来详细说明各标签的作用及关系。

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <definitions  
  3.  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
  4.  xmlns:tns="http://www.jsoso.com/wstest"  
  5.  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
  6.  xmlns="http://schemas.xmlsoap.org/wsdl/"  
  7.  targetNamespace="http://www.jsoso.com/wstest"  
  8.  name="Example">  
  9.   
  10. <types>  
  11.   <xsd:schema>  
  12.   <xsd:import  
  13.    namespace="http://www.jsoso.com/wstest"  
  14.    schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>  
  15.   </xsd:schema>  
  16. </types>  
  17.   
  18. <message name="toSayHello">  
  19.   <part name="userName" type="xsd:string"></part>  
  20. </message>  
  21. <message name="toSayHelloResponse">  
  22.   <part name="returnWord" type="xsd:string"></part>  
  23. </message>  
  24.   
  25. <message name="sayHello">  
  26.   <part name="person" type="tns:person"></part>  
  27.   <part name="arg1" type="xsd:string"></part>  
  28. </message>  
  29. <message name="sayHelloResponse">  
  30.   <part name="personList" type="tns:personArray"></part>  
  31. </message>  
  32. <message name="HelloException">  
  33.   <part name="fault" element="tns:HelloException"></part>  
  34. </message>  
  35.   
  36. <portType name="Example">  
  37.   <operation name="toSayHello" parameterOrder="userName">  
  38.     <input message="tns:toSayHello"></input>  
  39.     <output message="tns:toSayHelloResponse"></output>  
  40.   </operation>  
  41.   <operation name="sayHello" parameterOrder="person arg1">  
  42.     <input message="tns:sayHello"></input>  
  43.     <output message="tns:sayHelloResponse"></output>  
  44.     <fault message="tns:HelloException" name="HelloException"></fault>  
  45.   </operation>  
  46. </portType>  
  47.   
  48. <binding name="ExamplePortBinding" type="tns:Example">  
  49.   <soap:binding  
  50.     transport="http://schemas.xmlsoap.org/soap/http"   
  51.     style="rpc"></soap:binding>  
  52.   <operation name="toSayHello">  
  53.     <soap:operation soapAction="sayHello"></soap:operation>  
  54.     <input>  
  55.       <soap:body use="literal"  
  56.         namespace="http://www.jsoso.com/wstest"></soap:body>  
  57.     </input>  
  58.     <output>  
  59.       <soap:body use="literal"  
  60.          namespace="http://www.jsoso.com/wstest"></soap:body>  
  61.     </output>  
  62.   </operation>  
  63.   <operation name="sayHello">  
  64.     <soap:operation soapAction="sayHello"></soap:operation>  
  65.     <input>  
  66.       <soap:body use="literal"  
  67.         namespace="http://www.jsoso.com/wstest"></soap:body>  
  68.     </input>  
  69.     <output>  
  70.       <soap:body use="literal"  
  71.         namespace="http://www.jsoso.com/wstest"></soap:body>  
  72.     </output>  
  73.     <fault name="HelloException">  
  74.       <soap:fault name="HelloException" use="literal"></soap:fault>  
  75.     </fault>  
  76.     </operation>  
  77. </binding>  
  78.   
  79. <service name="Example">  
  80.   <port name="ExamplePort" binding="tns:ExamplePortBinding">  
  81.     <soap:address location="http://localhost:8080/hello"></soap:address>  
  82.   </port>  
  83. </service>  
  84. </definitions>  

  由于上面的事例XML较长,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站将其逐段分解解说 

  WSDL文档的根元素:<definitions>

XML/HTML代码
  1. <definitions  
  2.  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
  3.  xmlns:tns="http://www.jsoso.com/wstest"  
  4.  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
  5.  xmlns="http://schemas.xmlsoap.org/wsdl/"  
  6.  targetNamespace="http://www.jsoso.com/wstest"  
  7.  name="Example">  
  8. ……  
  9. ……  
  10. </definitions>  

  <definitions>定义了文档顶用到的各个xml元素的namespace缩写,也界定了本文档自己的targetNamespace="http://www.jsoso.com/wstest",这意味着其它的XML要援用当前XML中的元素时,要声明这个namespace。帮理xmlns:tns="http://www.jsoso.com/wstest"这个声明,它标示了运用tns这个前缀指向自身的定名空间。

  援用

  WSDL文档数据样板定义元素:<types>

XML/HTML代码
  1. <types>  
  2.   <xsd:schema>  
  3.   <xsd:import  
  4.    namespace="http://www.jsoso.com/wstest"  
  5.    schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>  
  6.   </xsd:schema>  
  7. </types>  

   <types>标签定义了当前的WSDL文档用到的数据样板。要说明的是,为了最大程度的平台中立性,WSDL 运用 XML Schema 语法来定义数据样板。这些数据样板用来定义web service方法的参数和返回指。对于通用的原生数据样板如:integer , boolean , char , float等,正正在W3C的标准文档http://www.w3.org/2001/XMLSchema中曾经做了定义。这里银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站要引入的schema定义schemaLocation="http://localhost:8080/hello?xsd=1"是银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站自定义的Java对象样板。 

  WSDL文档消歇体定义元素:< message >

XML/HTML代码
  1. <message name="toSayHello">  
  2.   <part name="userName" type="xsd:string"></part>  
  3. </message>  
  4. <message name="toSayHelloResponse">  
  5.   <part name="returnWord" type="xsd:string"></part>  
  6. </message>  
  7.   
  8. <message name="sayHello">  
  9.   <part name="person" type="tns:person"></part>  
  10.   <part name="arg1" type="xsd:string"></part>  
  11. </message>  
  12. <message name="sayHelloResponse">  
  13.   <part name="personList" type="tns:personArray"></part>  
  14. </message>  
  15. <message name="HelloException">  
  16.   <part name="fault" element="tns:HelloException"></part>  
  17. </message>  

   <message>元素定义了web service函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数正正在<message>元素中定义,与输出参数相隔离,输出参数有自己的<message>元素。兼作输入、输出的参数正正在输入输出的<message>元素中有它们相应的<part>元素。输出<message>元素以"Response"结尾,对Java而言方法得返回值就对应一个输出的<message>。每个<part>元素都知名字和样板属性,就像函数的参数有参数名和参数样板。

   正正在上面的文档中有两个输入参数、两个输出参数和一个错误参数(对应Java中的Exception)。

   输入参数<message>的name属性分别定名为toSayHello,sayHello。

  toSayHello对应输入参数userName,参数样板为xsd:string,正正在Java言语中就是String;

  sayHello对应两个输入参数person和arg1,样板为tns:person和xsd:string。这里tns:person样板就是援用了< types >标签中的样板定义。 

  输出参数<message>的name属性分别定名为toSayHelloResponse和sayHelloResponse。

  这个名称和输入参数的<message>标签name属性对应,正正在其后面加上Response尾缀。

  toSayHelloResponse对应的返回值是returnWord,参数样板为xsd:string;

  sayHelloResponse对应的返回值是personList,参数样板为tns:personArray(自定义样板); 

  错误参数<message>的name属性为HelloException。

   它的<part>子标签element而不是type来定义样板。 

  以上的message标签的name属性通常运用web service函数方法名作为参照,错误参数标签则运用分外类名为参照。标签中的参数名称,即part子元素的name属性是可自定义的(下一章节详细说明)。message标签的参数样板将援用types标签的定义。 

   WSDL文档函数体定义元素:< portType >

XML/HTML代码
  1. <portType name="Example">  
  2.   <operation name="toSayHello" parameterOrder="userName">  
  3.     <input message="tns:toSayHello"></input>  
  4.     <output message="tns:toSayHelloResponse"></output>  
  5.   </operation>  
  6.   <operation name="sayHello" parameterOrder="person arg1">  
  7.     <input message="tns:sayHello"></input>  
  8.     <output message="tns:sayHelloResponse"></output>  
  9.     <fault message="tns:HelloException" name="HelloException"></fault>  
  10.   </operation>  
  11. </portType>  

   <portType> 元素是最浸要的 WSDL 元素。它可描绘一个 web service、可被执行的操作,以及相干的消歇。portType的name属性对应Java中的一个效劳类的类名。<portType> 元素运用其子元素< operation>描绘一个web service的效劳方法。

  正正在<operation>元素中,name属性表示效劳方法名,parameterOrder属性表示方法的参数顺序,运用空格符分割众个参数,如:“parameterOrder="person arg1”。<operation>元素的子标签<input>表示输入参数说明,它援用<message>标签中的输入参数。<output>表示输出参数说明,它援用<message>标签中的输出参数。<fault>标签正正在Java方法中的特别用来表示分外(其它言语有对应的错误治理机制),它援用<message>标签中的错误参数。 

  WSDL绑定实现定义元素:< binding >

XML/HTML代码
  1. <binding name="ExamplePortBinding" type="tns:Example">  
  2.   <soap:binding  
  3.     transport="http://schemas.xmlsoap.org/soap/http"   
  4.     style="rpc"></soap:binding>  
  5.   <operation name="toSayHello">  
  6.     <soap:operation soapAction="sayHello"></soap:operation>  
  7.     <input>  
  8.       <soap:body use="literal"  
  9.         namespace="http://www.jsoso.com/wstest"></soap:body>  
  10.     </input>  
  11.     <output>  
  12.       <soap:body use="literal"  
  13.          namespace="http://www.jsoso.com/wstest"></soap:body>  
  14.     </output>  
  15.   </operation>  
  16.   <operation name="sayHello">  
  17.     <soap:operation soapAction="sayHello"></soap:operation>  
  18.     <input>  
  19.       <soap:body use="literal"  
  20.         namespace="http://www.jsoso.com/wstest"></soap:body>  
  21.     </input>  
  22.     <output>  
  23.       <soap:body use="literal"  
  24.         namespace="http://www.jsoso.com/wstest"></soap:body>  
  25.     </output>  
  26.     <fault name="HelloException">  
  27.       <soap:fault name="HelloException" use="literal"></soap:fault>  
  28.     </fault>  
  29.     </operation>  
  30. </binding>  

  <binding>标签是一切描绘协议、序列化和编码的地方,<types>,<message>和<portType>标签治理抽象的数据实质,而<binding>标签是治理数据传输的物理实现。

  <binding>标签把前三限制的抽象定义举座化。

  起首<binding>标签运用<soap:binding>的transport和style属性定义了Web Service的通讯协议HTTP和SOAP的请求风格RPC。其次<operation>子标签将portType中定义的operation同SOAP的请求绑定,定义了操作名称soapAction,输出输入参数和分外的编码格事务署及定名空间。

  WSDL效劳地址绑定元素:< service >

XML/HTML代码
  1. <service name="Example">  
  2.   <port name="ExamplePort" binding="tns:ExamplePortBinding">  
  3.     <soap:address location="http://localhost:8080/hello"></soap:address>  
  4.   </port>  
  5. </service>  

  service是一套<port>元素。正正在逐一对应时局务署下,每个<port>元素都和一个location联系。如果同一个<binding>有众个<port>元素与之联系,可以运用分外的URL地址作为交换。

  一个WSDL文档中可以有众个<service>元素,而且众个<service>元素十分有效,其中之一就是可以依据目标URL来组织端口。正正在一个WSDL文档中,<service>的name属性用来辨别折柳的service。正正在同一个service中,折柳端口,运用端口的"name"属性辨别。

  这一章节,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站简单的描绘了WSDL对SOAP协议的支持,以及正正在Web Service中的作用。正正在接下来的章节中,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站将学习怎样运用Java6.0的Annotation标签来定义和天生对应的WSDL。 

  JavaSE6.0下的Web Service

   从JavaSE6.0开始,Java引入了对Web Service的原生支持。银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站只需要简单的运用Java的Annotation标签即可将标准的Java方法楬橥成Web Service。

   但不是所有的Java类都可以楬橥成Web Service。Java类若要成为一个实现了Web Service的bean,它需要遵循下边这些原则:

  这个类必须是public类

   这些类不行是final的或者abstract

  这个类必须有一个公共的默认构制函数

   这个类绝对不行有finalize()方法 

   下面银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站将通过一个举座的Java Web Service代码例子,配合上述的WSDL文件,讲述怎样编写JavaSE6.0的原生Web Service运用。

  一切的Java Web Service类代码

Java代码
  1. package org.jsoso.jws.server;  
  2.   
  3. import java.util.ArrayList;  
  4. import javax.jws.WebMethod;  
  5. import javax.jws.WebParam;  
  6. import javax.jws.WebResult;  
  7. import javax.jws.WebService;  
  8. import javax.jws.WebParam.Mode;  
  9. import javax.jws.soap.SOAPBinding;  
  10. /  
  11.  * 提供WebService效劳的类  
  12.  */  
  13. @WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")  
  14. @SOAPBinding(style=SOAPBinding.Style.RPC)  
  15. public class Example {  
  16.     private ArrayList<Person> persons = new ArrayList<Person>();;  
  17.     /** 
  18.      *  
  19.      * 返回一个字符串 
  20.      * @param userName 
  21.      * @return 
  22.      */  
  23.     @WebMethod(operationName="toSayHello",action="sayHello",exclude=false)  
  24.     @WebResult(name="returnWord")//自定义该方法返回值正正在WSDL中相干的描绘  
  25.     public String sayHello(@WebParam(name="userName")String userName) {  
  26.         return "Hello:" + userName;  
  27.     }  
  28.   
  29.     /** 
  30.      * web services 方法的返回值与参数的样板不行为接口 
  31.      * @param person 
  32.      * @return 
  33.      * @throws HelloException 
  34.      */  
  35.     @WebMethod(operationName="sayHello", action="sayHello")  
  36.     @WebResult(partName="personList")  
  37.     public Person[] sayHello(@WebParam(partName="person", mode=Mode.IN)Person person,   
  38.             String userName) throws HelloException {  
  39.         if (person == null || person.getName() == null) {  
  40.             throw new HelloException("说hello出错,对像为空。。");  
  41.         }  
  42.         System.out.println(person.getName() + " 对 " + userName + " 说:Hello,我本年" + person.getAge() + "岁");  
  43.         persons.add(person);  
  44.         return persons.toArray(new Person[0]);  
  45.     }  
  46. }  

  Annotation 1@WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")

  @WebService标签浸要将类显现为WebService,其中targetNamespace属性定义了自己的定名空间,serviceName则定义了< definitions >标签和<service>标签的name属性。 

  Annotation 2:@SOAPBinding(style=SOAPBinding.Style.RPC)

   @SOAPBinding标签定义了WSDL文档中SOAP的消歇协议,其中style属性对应SOAP的文档样板,可选的有RPC和DOCUMENT 

  Annotation 3:@WebMethod(operationName="toSayHello",action="sayHello",exclude=false)

   @WebMethod定义Web Service运作的方法,

  属性action 对应操作的活动 ,如<soap:operation soapAction="sayHello" />

  属性operationName匹配的wsdl:operation 的名称,如<operation name="toSayHello" parameterOrder="userName">

  属性exclude 用于阻止将某一继承方法公开为web效劳,默以为false 

  Annotation 4:@WebResult(name="returnWord")

   @ WebResult定义方法返回值得名称,如<part name="returnWord" type="xsd:string" /> 

  Annotation 5:@WebParam(partName="person", mode=Mode.IN

  @WebParam定义方法的参数名称,如<part name="person" type="tns:person" />,其中mode属性表示参数的流向,可选值有IN / OUT / INOUT 

  这里要着浸说明的是,上述Web Service类的sayHello方法中,带有HelloException这个分外声明,制成该效劳类不行直接楬橥成Web Service。需要运用wsgen东西为其保存分外Bean。关于wsgen东西的运用,请参考wsgen与wsimport下令说明 

  楬橥一个的Java Web Service

  正正在完成了上述的Web Service Annotation注释后,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站运用wsgen东西为其进行效劳资源文件的构制(这里浸要是天生一个名为org.jsoso.jws.server.jaxws.HelloExceptionBean的分外bean类),着末运用以下的类楬橥Web 效劳:

Java代码
  1. package org.jsoso.jws.server;  
  2.   
  3. import java.util.LinkedList;  
  4. import java.util.List;  
  5. import javax.xml.ws.Binding;  
  6. import javax.xml.ws.Endpoint;  
  7. import javax.xml.ws.handler.Handler;  
  8.   
  9. /** 
  10.  * @author zsy 启动web services效劳 
  11.  */  
  12. public class StartServer {  
  13.   
  14.     /** 
  15.      * @param args 
  16.      */  
  17.     public static void main(String[] args) {  
  18.         /* 
  19.          * 天生Example 效劳实例 
  20.          */  
  21.         Example serverBean = new Example();  
  22.         /* 
  23.          * 楬橥Web Service到http://localhost:8080/hello地址 
  24.          */  
  25.         Endpoint endpoint =   
  26.            Endpoint.publish("http://localhost:8080/hello", serverBean);  
  27.         Binding binding = endpoint.getBinding();  
  28.         /* 
  29.          * 设置一个SOAP协议治理栈 
  30.          * 这里就简单得打印SOAP的消歇文本 
  31.          */  
  32.         List<Handler> handlerChain = new LinkedList<Handler>();  
  33.         handlerChain.add(new TraceHandler());  
  34.         binding.setHandlerChain(handlerChain);  
  35.         System.out.println("效劳已启动 http://localhost:8080/hello");  
  36.     }  
  37. }  

   正正在控制台运行这个类,就可以运用URL :http://localhost:8080/hello?wsdl 浏览到上文所描绘的WSDL的全文了。这说明您的第一个Web Service运用楬橥成功!

  构建Web Service客户端

   运用JavaSE6.0构建Web Service的客户端是一件相当简单的事。这里银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站要运用到JDK中的另一个下令行东西wsimport。正正在控制台下输入以下下令:

  援用

  wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http://localhost:8080/hello?wsdl 

  即可正正在包org.jsoso.jws.client.ref中天生客户端的存根及框架文件。其中银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站要运用的类只有两个:效劳类Example_Service和当地接口Example。编写如下客户端,即可调用Web Service效劳:

Java代码
  1. package org.jsoso.jws.client;  
  2.   
  3. import org.jsoso.jws.client.ref.*;  
  4.   
  5. public class RunClient {  
  6.   
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args) {  
  11.         //初始化效劳框架类  
  12.         Example_Service service = new Example_Service();  
  13.         //或者当地效劳借口的实例  
  14.         Example server = (Example) service.getExamplePort();  
  15.         try {  
  16.             //调用web service的toSayHello方法  
  17.             System.out.println("输入toSayHello的返回值——" + server.toSayHello("阿土"));           
  18.              Person person = new Person();  
  19.              person.setName("阿土");  
  20.              person.setAge(25);  
  21.              //调用web service的sayHello方法  
  22.              server.sayHello(person, "机器人");  
  23.                
  24.              person = new Person();  
  25.              person.setName("aten");  
  26.              person.setAge(30);  
  27.              //调用web service的sayHello方法  
  28.              PersonArray list = server.sayHello(person, "机器人");  
  29.             //输出返回值  
  30.              System.out.println("\n以下输入sayHello的返回值——");  
  31.             for (Person p : list.getItem()) {  
  32.                 System.out.println(p.getName() + ":" + p.getAge());  
  33.             }             
  34.         } catch (HelloException_Exception e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38. }  

  届此,本次Web Service的学习暂告一个段落。Java Web Service是一个相当宏伟的知识姿态,其中涉及的相干技术较众,这里无法逐一途来,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站将会正正在以后的开发和运用中,同大家做进一步深化的推敲和学习。 

  附录:wsgen与wsimport下令说明 

  wsgen

   wsgen是正正在JDK的bin目录下的一个exe文件(Windows版),该下令的浸要功能是用来天生悦目的JAX-WS。它读取Web Service的着末类文件,同时天生所有效于楬橥Web Service所依赖的源代码文件和经过编译过的二进制类文件。这里要特别说明的是,通常正正在Web Service Bean顶用到的分外类会另外天生一个描绘Bean,如果Web Service Bean中的方法有申明扔出分外,这一步是必需的,不然效劳器无法绑定该对像。此外,wsgen还能辅帮天生WSDL和相干的xsd文件。wsgen从资源文件天生一个一切的操作列表并验证web service是否合法,可以一切楬橥。

  下令参数说明:

   -cp 定义classpath

   -r 天生 bean的wsdl文件的存放目录

   -s 天生楬橥Web Service的源代码文件的存放目录(如果方法有扔出分外,则会天生该分外的描绘类源文件)

   -d 天生楬橥Web Service的编译过的二进制类文件的存放目录(该分外的描绘类的class文件) 

  下令范例 :wsgen -cp ./bin -r ./wsdl -s ./src -d ./bin -wsdl org.jsoso.jws.server.Example 

  wsimport

  wsimport也是正正在JDK的bin目录下的一个exe文件(Windows版),浸要功能是依据效劳端楬橥的wsdl文件天生客户端存根及框架,负责与Web Service 效劳器通讯,并正正在将其封装成实例,客户端可以直接运用,就像运用当地实例往往。对Java而言,wsimport帮帮程序员保存调用web service所需要的客户端类文件.java和.class。要提示指出的是,wsimport可以用于非Java的效劳器端,如:效劳器端也许是C#编写的web service,通过wsimport则天生Java的客户端实现。

  下令参数说明

   -d 天生客户端执行类的class文件的存放目录

   -s 天生客户端执行类的源文件的存放目录

   -p 定义天生类的包名 

  下令范例:wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http://localhost:8080/hello?wsdl

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.sygjbus.cn/software/345.html
2014年5月6日
作家:鸡啄米 分类:软件开发 浏览: 评论:10