鷹翔宇空

          學習和生活

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
          原文引自:http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/

          作者:劉東
          本文介紹使用AXIS作為開發(fā)環(huán)境來體會Web服務(wù)的開發(fā)過程。

          一. 介紹


          本文并不是想介紹Web服務(wù)的原理、系統(tǒng)架構(gòu)等,我們假設(shè)您已經(jīng)了解了關(guān)于Web服務(wù)的一些基本的概念、原理等知識。本文主要是針對那些已經(jīng)了解Web服務(wù)概念,但是還沒有親身體會Web服務(wù)所帶來令人歡欣鼓舞的特征的開發(fā)人員。在此我們認為你已經(jīng)具備了Java、XML等基礎(chǔ)知識,如果你還有其他開發(fā)環(huán)境的經(jīng)驗例如VB、VC那是再好不過的了。

          1.Web服務(wù)


          雖然我們并不想詳細講述Web服務(wù)的體系結(jié)構(gòu),但是大概的介紹一下還是有必要的。Web服務(wù)是一種新型的Web應用程序。不同于其他Web應用程序,它是自適應、自我描述、模塊化的應用程序,并可以跨越Web進行發(fā)布、定位以及調(diào)用。簡單的Web服務(wù)可以提供例如天氣預報或者航班信息的服務(wù)。一旦部署了Web服務(wù),其他的應用程序就可以發(fā)現(xiàn)和調(diào)用所部署的服務(wù)。

          2.AXIS項目


          Axis框架來自 Apache 開放源代碼組織,它是基于JAVA語言的最新的 SOAP 規(guī)范(SOAP 1.2)和 SOAP with Attachments 規(guī)范(來自 Apache Group )的開放源代碼實現(xiàn)。有很多流行的開發(fā)工具都使用AXIS作為其實現(xiàn)支持Web服務(wù)的功能,例如JBuilder以及著名的Eclipse J2EE插件Lomboz。AXIS的最新版本是1.1,可以從 http://ws.apache.org/axis/index.html下載。下圖是AXIS核心引擎的體系結(jié)構(gòu)圖:



          圖1

          整個AXIS項目包括以下幾個部分:

          1. 消息流子系統(tǒng)
            消息流子系統(tǒng)提供了靈活的消息傳遞框架,這個消息傳遞框架包括處理程序、鏈、序列化程序和反序列化程序。處理程序是一個處理請求、響應和故障流的對象。處理程序可被組合在一起成為鏈,而且可以使用一個靈活的部署描述符來配置這些處理程序的順序。
          2. 傳輸框架子系統(tǒng)
            提供了一個傳輸框架,這個傳輸框架可以幫助您創(chuàng)建自己的可插式傳輸發(fā)送器和傳輸偵聽器。
          3. 數(shù)據(jù)編碼子系統(tǒng)
            AXIS完全按照 XML Schema 規(guī)范提供各種數(shù)據(jù)類型的自動序列化,并且提供功能擴展接口來使用您自己定制的序列化器和反序列化器。
          4. 其他
            AXIS完全支持 WSDL 以及日志記錄、出錯以及故障處理機制。它同時提供一些工具用來講WSDL文檔轉(zhuǎn)換成客戶端的調(diào)用框架以及根據(jù)類來產(chǎn)生WSDL定義文檔。

          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,這里不再另行介紹。另外為了演示W(wǎng)eb服務(wù)真正與開發(fā)環(huán)境無關(guān)以及AXIS產(chǎn)生的是標準的、符合規(guī)范的Web服務(wù),我們還將用到微軟公司的SOAP TOOLKIT以及微軟的開發(fā)環(huán)境VB和VC來做為Web服務(wù)的客戶端。





          回頁首


          二. 環(huán)境搭建


          由于AXIS本身是基于JAVA語言開發(fā)的項目,并且是以Web應用形式發(fā)布的,因此它運行時需要一個應用服務(wù)器作為支撐。為了方便我們這里選用的是Tomcat。由于AXIS本身需要用到處理XML信息的包,所以我們建議使用JDK1.4并安裝Tomcat 4.1.24。下面是環(huán)境搭建步驟,讀取根據(jù)自身情況進行安裝。

          1. 安裝JDK1.4.1
          2. 安裝Tomcat 4.1.24到C:\Tomcat并驗證安裝是否成功
          3. 下載AXIS項目打包文件axis-1_1.zip解壓縮后將目錄中的webapps目錄下的axis子目錄拷貝到C:\Tomcat\webapps下。
          4. 驗證AXIS的安裝:重新啟動Tomcat服務(wù)器后打開瀏覽器輸入網(wǎng)址http://localhost:8080/axis 后應該出現(xiàn)如下圖所示頁面,點擊鏈接"Validate"來驗證Axis所需的幾個JAVA包是否齊全。


          圖2

          點擊超鏈接Validate后,AXIS會自動檢查所需的每一個JAVA組件,這協(xié)組件分為:必需組件以及可選組件,必須保證所有必需組件都存在,如下圖所示即為驗證成功。



          圖3





          回頁首


          三. Web Service服務(wù)端開發(fā)


          經(jīng)過了前兩步之后我們就可以開始Web服務(wù)之旅了!大多數(shù)人在學習一種編程語言的第一步都是從Hello world程序開始的,我們也不例外。我們將提供這樣一個Web服務(wù),通過給它傳入姓名,服務(wù)返回:你好[姓名],歡迎來到Web服務(wù)的世界。這就是我們的需求。我們將馬上根據(jù)AXIS的要求完成我們的需求,你就會發(fā)現(xiàn)原來Web服務(wù)可以這么簡單!

          編寫JAVA類Hello.java,內(nèi)容如下:

          public class Hello{
           public String hello(String name){
            if(name==null)
             name = "";
            return "你好"+name+",歡迎來到Web服務(wù)的世界!";
          }
          }
          

          僅此而已,無需編譯,將該文件改名為Hello.jws并拷貝到AXIS應用目錄C:\Tomcat\webapps\axis下。

          下面我們就可以測試該Web服務(wù)了,打開瀏覽器并輸入剛剛創(chuàng)建的文件名對應的URL地址 http://localhost:8080/axis/Hello.jws 瀏覽器顯示如下結(jié)果:

          There is a Web Service here
          
                  
                  Click to see the WSDL 

          點擊頁面上的鏈接查看該Web服務(wù)對應的WSDL信息如下所示(我們將在下一小節(jié)簡單介紹WSDL)

          <?xml version="1.0" encoding="UTF-8" ?>
          -<wsdl:definitions
           targetNamespace="http://localhost:8080/axis/Hello.jws"
           xmlns="http://schemas.xmlsoap.org/wsdl/"
           xmlns="http://www.w3.org/2000/xmlns/"
           xmlns:apachesoap="http://xml.apache.org/xml-soap" 
           xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
           xmlns:impl="http://localhost:8080/axis/Hello.jws" 
           xmlns:intf="http://localhost:8080/axis/Hello.jws"
           xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
           - <wsdl:message name="helloRequest">
           <wsdl:part name="name" type="xsd:string" /> 
           </wsdl:message>
           + <wsdl:message name="helloResponse">
           - <wsdl:portType name="Hello">
           - <wsdl:operation name="hello" parameterOrder="name">
           <wsdl:input name="helloRequest" message="intf:helloRequest" /> 
           <wsdl:output name="helloResponse" message="intf:helloResponse" />
           </wsdl:operation> 
           </wsdl:portType>
           - <wsdl:binding name="HelloSoapBinding" type="intf:Hello"> 
           <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
           - <wsdl:operation name="hello"> 
           <wsdlsoap:operation soapAction="" />
           - <wsdl:input name="helloRequest">
           <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
            namespace="http://DefaultNamespace" />  
           </wsdl:input>- <wsdl:output name="helloResponse">  
           <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            namespace="http://localhost:8080/axis/Hello.jws" />   
           </wsdl:output> 
           </wsdl:operation> 
           </wsdl:binding>
           - <wsdl:service name="HelloService">
           - <wsdl:port name="Hello" binding="intf:HelloSoapBinding">
           <wsdlsoap:address location="http://localhost:8080/axis/Hello.jws" /> 
           </wsdl:port>  
           </wsdl:service> 
           </wsdl:definitions>
          

          到此我們已經(jīng)完成了hello的Web服務(wù)了,那我們怎么告訴用戶如何來使用該服務(wù)呢?我們只需要告訴用戶我們的Web服務(wù)的URL地址: http://localhost:8080/axis/Hello.jws?wsdl 就可以了!下一節(jié)我們將介紹如何通過這個地址來訪問對應的Web服務(wù)。





          回頁首


          四. Web Service客戶端開發(fā)


          在這一節(jié)中我們將使用三種不同的語言來訪問剛剛創(chuàng)建的Web服務(wù),分別是JAVA、VB、VC。為了使用VB和VC訪問Web服務(wù),我們需要安裝微軟公司的Soap Toolkit 開發(fā)工具包,這個工具包可以從微軟公司的主頁

          http://download.microsoft.com/download/xml/soap/2.0/W98NT42KMe/EN-US/SoapToolkit20.exe

          下載,下載該軟件包并使用默認方式安裝即可。

          在開始客戶端開發(fā)之前有兩個概念我們必須先粗略的介紹一下。

          SOAP:簡單對象訪問協(xié)議。這是一種在松散的、分布的環(huán)境中使用XML對等地交換結(jié)構(gòu)化的和類型化的信息提供了一個簡單且輕量級的機制,它是一個基于XML的協(xié)議。它包括四個部分:SOAP封裝(envelop),封裝定義了一個描述消息中的內(nèi)容是什么,是誰發(fā)送的,誰應當接受并處理它以及如何處理它們的框架;SOAP編碼規(guī)則(encoding rules),用于表示應用程序需要使用的數(shù)據(jù)類型的實例; SOAP RPC表示(RPC representation),表示遠程過程調(diào)用和應答的協(xié)定;SOAP綁定(binding),使用底層協(xié)議交換信息。

          雖然這四個部分都作為SOAP的一部分,作為一個整體定義的,但他們在功能上是相交的、彼此獨立的。特別的,信封和編碼規(guī)則是被定義在不同的XML命名空間(namespace)中,這樣使得定義更加簡單。

          SOAP的主要設(shè)計目標是簡明性和可擴展性。這就意味著有一些傳統(tǒng)消息系統(tǒng)或分布式對象系統(tǒng)中的特性將不包含在SOAP的核心規(guī)范中。這些特性包括:分布式垃圾收集;批量消息傳輸/處理;對象引用;對象激活。

          WSDL:Web Service描述語言。使用了WSDL,我們就可以通過這種跨平臺和跨語言的方法使Web Service代理的產(chǎn)生自動化。就像COM和CORBA的IDL文件,WSDL文件由客戶和服務(wù)器約定。由于WSDL設(shè)計成可以綁定除SOAP以外的其他協(xié)議,這里我們主要關(guān)注WSDL在HTTP上和SOAP的關(guān)系。同樣,由于SOAP目前主要用來調(diào)用遠程的過程和函數(shù),WSDL支持SOAP傳輸?shù)奈臋n規(guī)范。

          WSDL文檔可以分為兩部分。頂部分由抽象定義組成,而底部分則由具體描述組成。抽象部分以獨立于平臺和語言的方式定義SOAP消息,它們并不包含任何隨機器或語言而變的元素。這就定義了一系列服務(wù),截然不同的網(wǎng)站都可以實現(xiàn)。

          1. JAVA客戶端


          使用AXIS的工具將使Web服務(wù)的訪問和我們之前介紹的創(chuàng)建一個Web服務(wù)一樣的簡單。我們前面安裝的AXIS環(huán)境中已經(jīng)包含著這樣的工具,它是一個JAVA類,類名為:org.apache.axis.wsdl.WSDL2Java。打開命令行窗口,轉(zhuǎn)到AXIS目錄下的WEB-INF子目錄。確保Tomcat服務(wù)已經(jīng)處于啟動狀態(tài),鍵入命令 :

          Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/Hello.jws?wsdl
          

          該命令執(zhí)行的結(jié)果是在當前所在目錄下產(chǎn)生一個子目錄 localhost/axis/Hello_jws,該目錄下有四個JAVA源文件,它們分別是:

          Hello.java 定義了Web服務(wù)接口,此例中只有一個hello方法。

          HelloService.java 定義了用于獲取Web服務(wù)接口的方法。

          HelloServiceLocator.java 接口HelloService的具體實現(xiàn)。

          HelloSoapBindingStub.java Web服務(wù)客戶端樁,通過該類與服務(wù)器交互。

          這四個JAVA類幫我們處理了大部分的邏輯,我們需要的僅僅是把這些類加到我們的項目然后創(chuàng)建一個我們自己的類來調(diào)用它們即可。為此我們新加一個類Main.java,為了方便,讓這個類與剛產(chǎn)生的四個類都在同一個包下。內(nèi)容如下:

          //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
          

          如果編譯沒有問題的話執(zhí)行該測試程序:

          java -Djava.ext.dirs=lib -cp . localhost.axis.Hello_jws.Main//運行結(jié)果:Response:你好罐頭,歡迎來到Web服務(wù)的世界!
          

          在WSDL2Java工具自動產(chǎn)生的幾個類中,類HelloServiceLocator中保存這一些跟服務(wù)器相關(guān)的信息,例如URL地址等,當服務(wù)器的地址更改后但是服務(wù)并沒有改動的時候直接修改該文件中的字符串定義,而無需重新生成這幾個類。具體需要修改的內(nèi)容,打開該文件便可一目了然。

          2. VB客戶端


          有了微軟SOAP toolkit,用VB調(diào)用Web服務(wù)也是一件令人愉快的事情。

          打開VB開發(fā)環(huán)境新建一個標準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。

          3. VC客戶端


          打開VC開發(fā)環(huán)境,新建項目HelloClient,項目類型為 Win32 Console Application的空項目。新建C++ Source File文件名為:HelloSoap.cpp,編輯文件內(nèi)容如下:

          //#include "stdafx.h"
          #include <stdio.h>
          #import "msxml3.dll"
          using namespace MSXML2;
          //根據(jù)自己機器的情況修改下面語句中指定的路徑
          
          #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; 
          }
          

          編譯并運行該項目。

          本節(jié)只是為了演示如果通過VC來訪問使用AXIS創(chuàng)建的Web服務(wù),至于Soap toolkit的具體使用請參照soap toolkit的幫助手冊,其他語言的訪問請查閱相關(guān)的文檔。





          回頁首


          五. AXIS集成

          為了讓我們的WEB應用程序支持Web服務(wù)功能,我們需要將AXIS集成到我們的應用程序中。集成AXIS很簡單,首先需要拷貝AXIS用到的幾個JAR包文件,這些文件都在[AXIS]\WEB-INF\lib目錄下,將這些文件拷貝到我們自己的應用目錄下的WEB-INF\lib。另外如果你用的不是TOMCAT服務(wù)器那就需要拷貝activation.jar,這個JAR文件可以在[TOMCAT]\common\lib目錄下找到!

          拷貝完JAR文件后就是web.xml的配置了,只需要把AXIS中的web.xml中的配置信息添加到我們自己應用程序中的web.xml中即可。最重要的是下面的內(nèi)容:

          <servlet>  
           <servlet-name>AxisServlet</servlet-name>  
           <display-name>Apache-Axis Servlet</display-name>   
           <servlet-class> 
            org.apache.axis.transport.http.AxisServlet  
           </servlet-class>
          </servlet>
          
          <servlet-mapping>   
           <servlet-name>AxisServlet</servlet-name>  
           <url-pattern>*.jws</url-pattern>
          </servlet-mapping>
          
          <mime-mapping>    
           <extension>wsdl</extension>  
           <mime-type>text/xml</mime-type>
          </mime-mapping>
          
          <mime-mapping>   
           <extension>xsd</extension>   
           <mime-type>text/xml</mime-type>
          </mime-mapping>
          





          回頁首


          六 總結(jié)


          到此文章告一段落,通過以上的演練,我相信你已經(jīng)對Web服務(wù)有一個感性的認識,但是這個僅僅是開始,我們也只是很簡單的介紹了Web服務(wù)的一些基本概念并演示了一個無法再簡單的例子。Web服務(wù)還有很多其他高級的內(nèi)容例如復雜類型、數(shù)據(jù)安全等沒有涉及到,不過沒有關(guān)系,萬事開頭難,希望本文能夠促進大家理解和應用下一代的應用模式并給還沒有動手試驗的開發(fā)人員開一個好頭。

          posted on 2006-05-10 23:13 TrampEagle 閱讀(282) 評論(0)  編輯  收藏 所屬分類: web
          主站蜘蛛池模板: 贡觉县| 惠安县| 嘉禾县| 肇庆市| 枞阳县| 云霄县| 定西市| 隆林| 十堰市| 南溪县| 通海县| 蓬溪县| 丰台区| 尼勒克县| 黑山县| 馆陶县| 麻江县| 永修县| 南安市| 正安县| 汝南县| 东城区| 陕西省| 东阳市| 略阳县| 阜阳市| 财经| 邵阳县| 尖扎县| 辉南县| 广安市| 镇原县| 边坝县| 马山县| 临沧市| 泸州市| 中山市| 和林格尔县| 兴国县| 贵定县| 开平市|