虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。
現在,簡單解釋一下《使用Axis發布簡單的Web服務》中發布的Web服務所對應WSDL文檔的內容和結構。請注意,同樣的Java類在不同的Web服務開發包中得到的WSDL文檔不一定完全相同,這里還是以使用Axis的情況作為例子。
雖然比較長,但為了方便起見還是把完整的WSDL貼在下面,然后進行說明。由于我對Web服務的認識還很不夠,所以幾乎可以肯定會存在一些誤解,僅作參考。
每個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中的各個元素的作用。
參考資料:
Powered by: BlogJava Copyright © 禮物