本文並非想介紹Web服務的原理、系統架構等,咱們假設您已經瞭解了關於Web服務的一些基本的概念、原理等知識。本文主要是針對那些已經瞭解Web服務概念,可是尚未親身體會Web服務所帶來使人歡欣鼓舞的特徵的開發人員。在此咱們認爲你已經具有了Java、XML等基礎知識,若是你還有其餘開發環境的經驗例如VB、VC那是再好不過的了。java
雖然咱們並不想詳細講述Web服務的體系結構,可是大概的介紹一下仍是有必要的。Web服務是一種新型的Web應用程序。不一樣於其餘Web應用程序,它是自適應、自我描述、模塊化的應用程序,並能夠跨越Web進行發佈、定位以及調用。簡單的Web服務能夠提供例如天氣預報或者航班信息的服務。一旦部署了Web服務,其餘的應用程序就能夠發現和調用所部署的服務。apache
Axis框架來自 Apache 開放源代碼組織,它是基於JAVA語言的最新的 SOAP 規範(SOAP 1.2)和 SOAP with Attachments 規範(來自 Apache Group )的開放源代碼實現。有不少流行的開發工具都使用AXIS做爲其實現支持Web服務的功能,例如JBuilder以及著名的Eclipse J2EE插件Lomboz。AXIS的最新版本是1.1,能夠從 http://ws.apache.org/axis/index.html下載。下圖是AXIS核心引擎的體系結構圖:api
圖1瀏覽器
整個AXIS項目包括如下幾個部分:安全
AXIS目前版本支持的標準是:W3C SOAP 1.1 和 1.2;WSDL 1.1;SAAJ 1.1(SUN公司:SOAP with Attachments API for Java);JAX-RPC(SUN公司:Java API for XML-Based RPC)1.0。服務器
除了前面介紹的AXIS外,本文中還將會用到TOMCAT,這裏再也不另行介紹。另外爲了演示Web服務真正與開發環境無關以及AXIS產生的是標準的、符合規範的Web服務,咱們還將用到微軟公司的SOAP TOOLKIT以及微軟的開發環境VB和VC來作爲Web服務的客戶端。架構
因爲AXIS自己是基於JAVA語言開發的項目,而且是以Web應用形式發佈的,所以它運行時須要一個應用服務器做爲支撐。爲了方便咱們這裏選用的是Tomcat。因爲AXIS自己須要用處處理XML信息的包,因此咱們建議使用JDK1.4並安裝Tomcat 4.1.24。下面是環境搭建步驟,讀取根據自身狀況進行安裝。
圖2
點擊超連接Validate後,AXIS會自動檢查所需的每個JAVA組件,這協組件分爲:必需組件以及可選組件,必須保證全部必需組件都存在,以下圖所示即爲驗證成功。
圖3
通過了前兩步以後咱們就能夠開始Web服務之旅了!大多數人在學習一種編程語言的第一步都是從Hello world程序開始的,咱們也不例外。咱們將提供這樣一個Web服務,經過給它傳入姓名,服務返回:你好[姓名],歡迎來到Web服務的世界。這就是咱們的需求。咱們將立刻根據AXIS的要求完成咱們的需求,你就會發現原來Web服務能夠這麼簡單!
編寫JAVA類Hello.java,內容以下:
public class Hello{ public String hello(String name){ if(name==null) name = ""; return "你好"+name+",歡迎來到Web服務的世界!"; } } |
僅此而已,無需編譯,將該文件更名爲Hello.jws並拷貝到AXIS應用目錄C:\Tomcat\webapps\axis下。
下面咱們就能夠測試該Web服務了,打開瀏覽器並輸入剛剛建立的文件名對應的URL地址 http://localhost:8080/axis/Hello.jws 瀏覽器顯示以下結果:
There is a Web Service here Click to see the WSDL |
點擊頁面上的連接查看該Web服務對應的WSDL信息以下所示(咱們將在下一小節簡單介紹WSDL)
- - + - - - - - - - - |
到此咱們已經完成了hello的Web服務了,那咱們怎麼告訴用戶如何來使用該服務呢?咱們只須要告訴用戶咱們的Web服務的URL地址: http://localhost:8080/axis/Hello.jws?wsdl 就能夠了!下一節咱們將介紹如何經過這個地址來訪問對應的Web服務。
在這一節中咱們將使用三種不一樣的語言來訪問剛剛建立的Web服務,分別是JAVA、VB、VC。爲了使用VB和VC訪問Web服務,咱們須要安裝微軟公司的Soap Toolkit 開發工具包,這個工具包能夠從微軟公司的主頁
http://download.microsoft.com/download/xml/soap/2.0/W98NT42KMe/EN-US/SoapToolkit20.exe
下載,下載該軟件包並使用默認方式安裝便可。
在開始客戶端開發以前有兩個概念咱們必須先粗略的介紹一下。
SOAP:簡單對象訪問協議。這是一種在鬆散的、分佈的環境中使用XML對等地交換結構化的和類型化的信息提供了一個簡單且輕量級的機制,它是一個基於XML的協議。它包括四個部分:SOAP封裝(envelop),封裝定義了一個描述消息中的內容是什麼,是誰發送的,誰應當接受並處理它以及如何處理它們的框架;SOAP編碼規則(encoding rules),用於表示應用程序須要使用的數據類型的實例; SOAP RPC表示(RPC representation),表示遠程過程調用和應答的協定;SOAP綁定(binding),使用底層協議交換信息。
雖然這四個部分都做爲SOAP的一部分,做爲一個總體定義的,但他們在功能上是相交的、彼此獨立的。特別的,信封和編碼規則是被定義在不一樣的XML命名空間(namespace)中,這樣使得定義更加簡單。
SOAP的主要設計目標是簡明性和可擴展性。這就意味着有一些傳統消息系統或分佈式對象系統中的特性將不包含在SOAP的核心規範中。這些特性包括:分佈式垃圾收集;批量消息傳輸/處理;對象引用;對象激活。
WSDL:Web Service描述語言。使用了WSDL,咱們就能夠經過這種跨平臺和跨語言的方法使Web Service代理的產生自動化。就像COM和CORBA的IDL文件,WSDL文件由客戶和服務器約定。因爲WSDL設計成能夠綁定除SOAP之外的其餘協議,這裏咱們主要關注WSDL在HTTP上和SOAP的關係。一樣,因爲SOAP目前主要用來調用遠程的過程和函數,WSDL支持SOAP傳輸的文檔規範。
WSDL文檔能夠分爲兩部分。頂部分由抽象定義組成,而底部分則由具體描述組成。抽象部分以獨立於平臺和語言的方式定義SOAP消息,它們並不包含任何隨機器或語言而變的元素。這就定義了一系列服務,大相徑庭的網站均可以實現。
使用AXIS的工具將使Web服務的訪問和咱們以前介紹的建立一個Web服務同樣的簡單。咱們前面安裝的AXIS環境中已經包含着這樣的工具,它是一個JAVA類,類名爲:org.apache.axis.wsdl.WSDL2Java。打開命令行窗口,轉到AXIS目錄下的WEB-INF子目錄。確保Tomcat服務已經處於啓動狀態,鍵入命令 :
Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/Hello.jws?wsdl |
該命令執行的結果是在當前所在目錄下產生一個子目錄 localhost/axis/Hello_jws,該目錄下有四個JAVA源文件,它們分別是:
Hello.java 定義了Web服務接口,此例中只有一個hello方法。
HelloService.java 定義了用於獲取Web服務接口的方法。
HelloServiceLocator.java 接口HelloService的具體實現。
HelloSoapBindingStub.java Web服務客戶端樁,經過該類與服務器交互。
這四個JAVA類幫咱們處理了大部分的邏輯,咱們須要的僅僅是把這些類加到咱們的項目而後建立一個咱們本身的類來調用它們便可。爲此咱們新加一個類Main.java,爲了方便,讓這個類與剛產生的四個類都在同一個包下。內容以下:
//Main.java package localhost.axis.Hello_jws; public class Main{ public static void main(String[] args) throws Exception{ HelloService service = new HelloServiceLocator(); Hello hello = service.getHello(); System.out.println("Response:"+hello.hello("罐頭")); } } |
使用如下命令進行編譯:
javac -classpath lib\axis.jar;lib\jaxrpc.jar localhost\axis\Hello_jws\*.java |
若是編譯沒有問題的話執行該測試程序:
java -Djava.ext.dirs=lib -cp . localhost.axis.Hello_jws.Main//運行結果:Response:你好罐頭,歡迎來到Web服務的世界! |
在WSDL2Java工具自動產生的幾個類中,類HelloServiceLocator中保存這一些跟服務器相關的信息,例如URL地址等,當服務器的地址更改後可是服務並無改動的時候直接修改該文件中的字符串定義,而無需從新生成這幾個類。具體須要修改的內容,打開該文件即可一目瞭然。
有了微軟SOAP toolkit,用VB調用Web服務也是一件使人愉快的事情。
打開VB開發環境新建一個標準EXE項目,打開工程(Project)菜單並選擇引用打開組件引用對話框以下圖所示:找到並選中Microsoft Soap Type Library。
圖 4
新建並編輯窗體以下圖所示:
圖 5
編輯按鈕Call的點擊事件處理程序以下:(注意窗體的控件名稱要與程序中的名稱對應)
Private Sub callBtn_Click() '這種作法須要在工程中引用Soap Type Library 'Dim soap As MSSOAPLib.SoapClient 'Set soap = New MSSOAPLib.SoapClient Dim soap Set soap = CreateObject("MSSOAP.SoapClient") On Error Resume Next 'soap.mssoapinit urlText.Text Call soap.mssoapinit(urlText.Text) If Err <> 0 Then MsgBox "初始化SOAP失敗: " + Err.Description urlText.SetFocus Else If Len(Trim(nameText.Text)) = 0 Then MsgBox "請輸入您的姓名!" nameText.SetFocus Else responseText.Text = soap.hello(nameText.Text) End If End If End Sub |
保存項目並運行,輸入姓名並點擊按鈕Call。
打開VC開發環境,新建項目HelloClient,項目類型爲 Win32 Console Application的空項目。新建C++ Source File文件名爲:HelloSoap.cpp,編輯文件內容以下:
//#include "stdafx.h" #include #import "msxml3.dll" using namespace MSXML2; //根據本身機器的狀況修改下面語句中指定的路徑 #import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap1.dll" \ exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", \ "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME") using namespace MSSOAPLib; void Hello(){ ISoapSerializerPtr Serializer; ISoapReaderPtr Reader; ISoapConnectorPtr Connector; // Connect to the service Connector.CreateInstance(__uuidof(HttpConnector)); Connector->Property["EndPointURL"] = "http://localhost:8080/axis/Hello.jws?wsdl"; Connector->Connect(); // Begin message Connector->BeginMessage(); // Create the SoapSerializer Serializer.CreateInstance(__uuidof(SoapSerializer)); // Connect the serializer to the input stream of the connector Serializer->Init(_variant_t((IUnknown*)Connector->InputStream)); // Build the SOAP Message Serializer->startEnvelope("","",""); Serializer->startBody(""); Serializer->startElement("hello","","",""); Serializer->startElement("name","","",""); Serializer->writeString("罐頭"); Serializer->endElement(); Serializer->endElement(); Serializer->endBody(); Serializer->endEnvelope(); // Send the message to the web service Connector->EndMessage(); // Let us read the response Reader.CreateInstance(__uuidof(SoapReader)); // Connect the reader to the output stream of the connector Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), ""); // Display the result printf("Response: %s\n", (const char*)Reader->RPCResult->text); } int main() { CoInitialize(NULL); Hello(); CoUninitialize(); return 0; } |
編譯並運行該項目。
本節只是爲了演示若是經過VC來訪問使用AXIS建立的Web服務,至於Soap toolkit的具體使用請參照soap toolkit的幫助手冊,其餘語言的訪問請查閱相關的文檔。
爲了讓咱們的WEB應用程序支持Web服務功能,咱們須要將AXIS集成到咱們的應用程序中。集成AXIS很簡單,首先須要拷貝AXIS用到的幾個JAR包文件,這些文件都在[AXIS]\WEB-INF\lib目錄下,將這些文件拷貝到咱們本身的應用目錄下的WEB-INF\lib。另外若是你用的不是TOMCAT服務器那就須要拷貝activation.jar,這個JAR文件能夠在[TOMCAT]\common\lib目錄下找到!
拷貝完JAR文件後就是web.xml的配置了,只須要把AXIS中的web.xml中的配置信息添加到咱們本身應用程序中的web.xml中便可。最重要的是下面的內容:
AxisServlet Apache-Axis Servlet org.apache.axis.transport.http.AxisServlet AxisServlet *.jws wsdl text/xml xsd text/xml |
到此文章告一段落,經過以上的演練,我相信你已經對Web服務有一個感性的認識,可是這個僅僅是開始,咱們也只是很簡單的介紹了Web服務的一些基本概念並演示了一個沒法再簡單的例子。Web服務還有不少其餘高級的內容例如複雜類型、數據安全等沒有涉及到,不過沒有關係,萬事開頭難,但願本文可以促進你們理解和應用下一代的應用模式並給尚未動手試驗的開發人員開一個好頭。
來源:http://www.ibm.com/developerworks/cn/webservices/ws-startaxis/