Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          現在,簡單解釋一下《使用Axis發布簡單的Web服務》中發布的Web服務所對應WSDL文檔的內容和結構。請注意,同樣的Java類在不同的Web服務開發包中得到的WSDL文檔不一定完全相同,這里還是以使用Axis的情況作為例子。

          雖然比較長,但為了方便起見還是把完整的WSDL貼在下面,然后進行說明。由于我對Web服務的認識還很不夠,所以幾乎可以肯定會存在一些誤解,僅作參考。

          <?xml version="1.0" encoding="UTF-8"?>
          <wsdl:definitions targetNamespace="http://localhost:8080/bookstore/services/BookSvc" 
            xmlns
          ="http://schemas.xmlsoap.org/wsdl/" 
            xmlns:apachesoap
          ="http://xml.apache.org/xml-soap" 
            xmlns:impl
          ="http://localhost:8080/bookstore/services/BookSvc" 
            xmlns:intf
          ="http://localhost:8080/bookstore/services/BookSvc" 
            xmlns:soapenc
          ="http://schemas.xmlsoap.org/soap/encoding/" 
            xmlns:tns1
          ="http://model.bookstore.com" 
            xmlns:wsdl
          ="http://schemas.xmlsoap.org/wsdl/" 
            xmlns:wsdlsoap
          ="http://schemas.xmlsoap.org/wsdl/soap/" 
            xmlns:xsd
          ="http://www.w3.org/2001/XMLSchema">
            
          <wsdl:types>
              
          <schema targetNamespace="http://model.bookstore.com" xmlns="http://www.w3.org/2001/XMLSchema">
                
          <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
                
          <complexType name="Book">
                  
          <sequence>
                    
          <element name="ISDN" nillable="true" type="xsd:string"/>
                    
          <element name="name" nillable="true" type="xsd:string"/>
                    
          <element name="page" type="xsd:int"/>
                  
          </sequence>
                
          </complexType>
              
          </Schema>
            
          </wsdl:types>
            
          <wsdl:message name="addBookResponse">
            
          </wsdl:message>
            
          <wsdl:message name="addBookRequest">
              
          <wsdl:part name="book" type="tns1:Book"/>
            
          </wsdl:message>
            
          <wsdl:portType name="BookSvc">
              
          <wsdl:operation name="addBook" parameterOrder="book">
                
          <wsdl:input message="intf:addBookRequest" name="addBookRequest"/>
                
          <wsdl:output message="intf:addBookResponse" name="addBookResponse"/>
              
          </wsdl:operation>
            
          </wsdl:portType>
            
          <wsdl:binding name="BookSvcSoapBinding" type="intf:BookSvc">
              
          <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
              
          <wsdl:operation name="addBook">
                
          <wsdlsoap:operation soapAction=""/>
                
          <wsdl:input name="addBookRequest">
                  
          <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://bookstore.com" use="encoded"/>
                
          </wsdl:input>
                
          <wsdl:output name="addBookResponse">
                  
          <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/bookstore/services/BookSvc" use="encoded"/>
                
          </wsdl:output>
              
          </wsdl:operation>
            
          </wsdl:binding>
            
          <wsdl:service name="BookSvcService">
              
          <wsdl:port binding="intf:BookSvcSoapBinding" name="BookSvc">
                
          <wsdlsoap:address location="http://localhost:8080/bookstore/services/BookSvc"/>
              
          </wsdl:port>
            
          </wsdl:service>
          </wsdl:definitions>

          每個WSDL的根元素都是<definitions>,一般都在這里定義文檔中的各種名稱空間。對于上面的WSDL,定義了不少名稱空間,現在來說說它們的作用。

          我們都知道,WSDL應該是格式正確的XML文檔。進一步,還應該把它看作一個Schema,因此,<definitions>元素中可以定義targetNamespace屬性,表示在這個元素下的所有元素都屬于這個目標名稱空間。

          xmlns表示缺省的名稱空間,請注意在上面的文檔中,這個缺省名稱空間的值和xmlns:wsdl的值是相同的(都是http://schemas.xmlsoap.org/wsdl/)。因此,在這個WSDL中的很多<wsdl:XXX>元素,例如<wsdl:types>、<wsdl:portType>等等,實際上省略掉前面的“wsdl:”效果也是一樣的。

          名稱空間xmlns:apachesoap在文檔中并沒有使用到,這個應該是Axis為某些情況預留的名稱空間,或者是為了兼容以前的版本使用,因為Axis的前身是Apache Soap項目。

          名稱空間xmlns:intf和xmlns:impl分別代表接口(interface)和實現(implement),可以看出它們的值也是相同的,并且和<definitions>的targetNamespace一致。這是為了在文檔中引用已定義的屬于該目標名稱空間的元素使用的,例如“<wsdl:binding name="BookSvcSoapBinding" type="intf:BookSvc">”,其中的BookSvc一定是在前面某個元素中定義的,并且屬于<definitions>中指定的目標名稱空間。Axis把intf和impl分開是有道理的,因為在很多情況下,一個WSDL會引用另外一個WSDL,后者可能只定義了數據類型、消息和端口類型這些抽象元素,而前者中定義綁定和服務端口等和實現有關的內容。這里先不做討論。

          名稱空間xmlns:soapenc在這個文檔里也沒有用到,所以先不解釋了。

          名稱空間xmlns:tns1,在很多WSDL里這個名字都叫tns的,沒有后面的數字1,不知道Axis為什么起這樣的名字。不過沒有關系,名稱空間的名字本來就沒有實際的意義,只是一個代號而已。tns是This NameSpace的縮寫,用來對當前WSDL進行引用。由于一個WSDL映射一個包(package),所以Axis為我們生成的WSDL里,tns1的值(http://model.bookstore.com)包含java包(com.bookstore.model)的信息就是順理成章的了。請注意,tns1的值和<wsdl:types>里的<schema>元素的targetNamespace值是相同的。

          名稱空間xmlns:wsdlsoap是在與soap綁定時使用的,例如<wsdlsoap:binding>、<wsdlsoap:operation>等元素會用到。

          名稱空間xmlns:xsd是對XML Schema中各種數據類型的引用,例如string、boolean等等。想知道XML Schema中一共都定義了哪些數據類型,只要查看該名稱空間的值(http://www.w3.org/2000/10/XMLSchema)即可。

          沒想到只是名稱空間就寫了這么多,而WSDL的結構還有不少內容,所以還是分為兩部分吧,下一篇說說這個WSDL中的各個元素的作用。

          參考資料:

          posted on 2007-11-24 23:42 禮物 閱讀(673) 評論(0)  編輯  收藏 所屬分類: webservice
          主站蜘蛛池模板: 慈利县| 百色市| 哈巴河县| 阳江市| 许昌市| 阿拉善右旗| 延吉市| 扶风县| 林甸县| 寿宁县| 铅山县| 榆中县| 科尔| 敖汉旗| 安溪县| 三门峡市| 上犹县| 淮安市| 宜章县| 临海市| 嘉定区| 芜湖县| 石景山区| 平安县| 称多县| 英德市| 嘉定区| 紫阳县| 禹城市| 丽水市| 鹤庆县| 兴城市| 吐鲁番市| 潮安县| 祁连县| 尚义县| 海城市| 南部县| 遵义县| 塔城市| 巴彦县|