一、Axis簡介
1. 什麼是SOAP
SOAP是一個基於XML的用於應用程式之間通訊資料編碼的傳輸協議。最初由微軟和Userland Software提出,隨著不斷地完善和改進,SOAP很快被業界廣泛應用,目前完全發布版本是1.1。在其發展過程中,W3C XML標準工作小組積極促成SOAP成為一個真正的開放標準。在寫作此文檔之時,SOAP1.2草案已經發布,1.2對1.1中相對混亂的部分做了改進。
SOAP被廣泛作為新一代跨平台、跨語言分布計算Web Services的重要部分。
2. 什麼是Axis
Axis是Apache組織推出的SOAP引擎,Axis項目是Apache組織著名的SOAP項目的後繼項目,目前最新版本是採用Java開發的1.1版本,C++的版本正在開發之中。Axis v1.1軟體包可以從http://ws.apache.org/axis/dist/1_1/下載得到。
但是Axis不僅僅是一個SOAP引擎,它還包括:
一個獨立啟動並執行SOAP伺服器
一個servlet引擎的外掛程式,這個servlet引擎可以是Tomcat
對WSDL的擴充支援
一個將WSDL的描述產生JAVA類的工具
一些範例程式碼
還有一個監控TCP/IP包的工具
二、Axis的安裝
應用Axis開發Web Services,你需要安裝如下軟體:
1.JDK1.4.2
2.一個支援Servlet的伺服器引擎,比如廣為人知的Tomcat。
當安裝好Tomcat之後,只需將下載的Axis軟體包解壓縮,將其中的“webapps”目錄下的“axis”目錄整個拷貝到Tomcat安裝目錄下的“webapps”目錄下即可。
三、Axis的配置
Axis基於Java開發,可以部署於多種作業系統,使用前需要配置一系列的系統變數,在此假定你已經在本機上裝好了Tomcat 4.0以上的版本,需要配置的系統變數如下表所示:
CATALINA_HOME
C:/Tomcat_4_1
(此處應為Tomcat的安裝位置,注意路徑名中不要有空格)
AXIS_HOME
%CATALINA_HOME%/webapps/axis
AXIS_LIB
%AXIS_HOME%/lib
AXISCLASSPATH
%AXIS_LIB%/axis.jar;%AXIS_LIB%/commons-discovery.jar; %AXIS_LIB%/commons-logging.jar;%AXIS_LIB%/jaxrpc.jar; %AXIS_LIB%/saaj.jar;%AXIS_LIB%/log4j-1.2.8.jar; %AXIS_LIB%/xml-apis.jar;%AXIS_LIB%/xercesImpl.jar
CLASSPATH 中加入:
%AXIS_LIB%/axis.jar;%AXIS_LIB%/commons-discovery.jar; %AXIS_LIB%/commons-logging.jar;%AXIS_LIB%/jaxrpc.jar; %AXIS_LIB%/saaj.jar;%AXIS_LIB%/log4j-1.2.8.jar; %AXIS_LIB%/xml-apis.jar;%AXIS_LIB%/xercesImpl.jar
四、Axis的測試
安裝配置完畢後,應測試一下是否Axis可以正確運行了。
啟動Tomcat伺服器,在瀏覽器中訪問http://localhost:8080/axis/happyaxis.jsp,如果頁面顯示有錯誤,則需要回頭檢查一下相關配置是否正確,如果瀏覽頁面能正確顯示出系統組件、屬性等參數配置資訊,則表示安裝成功。現在可以開始開發你的Web Services應用了。
五、服務的發布
Axis提供了兩種服務發布方式,一種是即時發布(Instant Deployment),一種是定製發布(Custom Deployment)。
1. 使用即時發布 Java Web Service(JWS)
對即時發布的支援是Axis的特色之一,使用即時發布使使用者只需有提供服務的Java類的原始碼,即可將其迅速發布成Web服務。每當使用者調用這類服務的時候,Axis會自動進行編譯,即使伺服器重啟了也不必對其做任何處理,使用非常簡單快捷。
使用即時發布首先需要一個實現服務功能的Java源檔案,將其副檔名改為.jws(Java Web Service的縮寫),然後將該檔案放到“……/webapps/axis”目錄下即可。
在此給出一個從英裡到公裡的長度單位轉換的服務,其源碼如下:
檔案Distance.jws
public class Distance
{
public double convertMile2Kilometre( double mile )
{
return mile * 1.609; //實現英裡到公裡的距離轉換
}
}
將其放到“……/webapps/axis”目錄,通過訪問http://localhost:8080/axis/Distance.jws?wsdl可以看到這個服務的WSDL描述檔案,這說明Distance服務被成功發布了。描述的WDSL代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions targetNamespace="http://192.168.0.26:8080/axis/Distance.jws" xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://192.168.0.26:8080/axis/Distance.jws" xmlns:intf="http://192.168.0.26:8080/axis/Distance.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wsdl:message name="convertMile2KilometreRequest">
<wsdl:part name="mile" type="xsd:double" />
</wsdl:message>
- <wsdl:message name="convertMile2KilometreResponse">
<wsdl:part name="convertMile2KilometreReturn" type="xsd:double" />
</wsdl:message>
- <wsdl:portType name="Distance">
- <wsdl:operation name="convertMile2Kilometre" parameterOrder="mile">
<wsdl:input message="impl:convertMile2KilometreRequest" name="convertMile2KilometreRequest" />
<wsdl:output message="impl:convertMile2KilometreResponse" name="convertMile2KilometreResponse" />
</wsdl:operation>
</wsdl:portType>
- <wsdl:binding name="DistanceSoapBinding" type="impl:Distance">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="convertMile2Kilometre">
<wsdlsoap:operation soapAction="" />
- <wsdl:input name="convertMile2KilometreRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded" />
</wsdl:input>
- <wsdl:output name="convertMile2KilometreResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://192.168.0.26:8080/axis/Distance.jws" use="encoded" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="DistanceService">
- <wsdl:port binding="impl:DistanceSoapBinding" name="Distance">
<wsdlsoap:address location="http://192.168.0.26:8080/axis/Distance.jws" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
需要注意的是:JWS的web服務發布是一個很簡單的Web服務發布方式,在頁面中你不能使用包,而且由於代碼是在運行期被編譯的,所以在部署之後,你也很難找到錯誤所在。
2. 使用定製發布 Web Service Deployment Descriptor(WSDD)
即時發布是一項令人激動的技術,它使Web服務的開發變得如此簡單;然而即時發布並不總是最好的選擇,比如有些應用系統是第三方提供的,我們沒有購買原始碼,只有.class檔案,但我們又希望將這個應用系統的一些功能對外發布成Web服務,使其能夠在更大範圍內產生作用,這個時候即時發布技術就無能為力了。此外,即時發布技術並不靈活,無法進行更多的服務配置,這使得它並不能滿足一些特定系統的需求。
因此,Axis提供了另一種服務發布方式,這就是定製發布。
在此給出一個從加侖到升的容積單位轉換的服務,其源碼如下:
檔案Capacity.java
package samples.capacity;
public class Capacity
{
public double convertGallon2Litre( double gallon )
{
return gallon * 4.546;//實現加侖到升的容積轉換
}//convertGallon2Litre()
}/* Capacity */
將其編譯成.class檔案,放置到“……/webapps/axis/samples/capacity”目錄下,即可著手進行發布。
定製發布不需要構建.jws檔案,但必須建立服務發布描述檔案deploy.wsdd(Web Service Deployment Descriptor的縮寫),這個檔案負責描述服務的名稱、入口等資訊,其內容如下:
檔案deploy.wsdd
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="Capacity" provider="java:RPC">
<parameter name="className" value="samples.capacity.Capacity"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
在這裡服務的提供者是“java:RPC”,它被內建在Axis中,而且指明了一個JAVA RPC服務,做這個處理的類是org.apache.axis.providers.java.RPCProvider。
我們是通過一個<parameter>標籤告訴RPC服務應該調用的類,而另外一個<parameter>標籤則告訴引擎,它可以調用這個類中的任何的Public方法。你也可以指定通過使用名字空間或者一些可以調用的方法列表,來指明那些方法可以被調用。
將該檔案也放到“……/webapps/axis/samples/capacity”目錄下,然後可以採用Axis提供的一個用戶端管理工具——AdminClient來完成服務的定製發布。
在“……/webapps/axis/samples/capacity”目錄下,運行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
如果運行時說沒有找到類,那麼可能是類路徑沒有配置好,建議將所有的與axis相關的jar都寫到classpath中去。這樣只要運行:
java org.apache.axis.client.AdminClient deploy.wsdd
可以看到以下運行結果:
Processing file deploy.wsdd
<Admin>Doneprocessing</Admin>
這表明Capacity服務定製發布完成。
你也可以調用:
java org.apache.axis.client.AdminClient undeploy.wsdd 來取消部署。
你也可以調用:
java org.apache.axis.client.AdminClient list 來獲得所有的已經部署的服務的列表。在這裡你會看到services, handlers, transports等等,注意這個調用只是列出了WEB-INF/server-config.wsdd的檔案內容。
一定要注意:編譯後的class檔案要拷貝到web-inf/classes的目錄中,如果該檔案中有包存在的話,別忘了還要在classes目錄下建立包的目錄
通過訪問http://localhost:8080/axis/services/Capacity?wsdl可以看到這個服務的WSDL描述檔案,這說明Capacity服務被成功發布了。
你也可以通過訪問http://localhost:8080/axis/servlet/AxisServlet查看所有定製發布的服務。
WDSL如下:
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions targetNamespace="http://localhost:8080/axis/services/Capacity" xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/axis/services/Capacity" xmlns:intf="http://localhost:8080/axis/services/Capacity" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wsdl:message name="convertGallon2LitreResponse">
<wsdl:part name="convertGallon2LitreReturn" type="xsd:double" />
</wsdl:message>
- <wsdl:message name="convertGallon2LitreRequest">
<wsdl:part name="in0" type="xsd:double" />
</wsdl:message>
- <wsdl:portType name="Capacity">
- <wsdl:operation name="convertGallon2Litre" parameterOrder="in0">
<wsdl:input message="impl:convertGallon2LitreRequest" name="convertGallon2LitreRequest" />
<wsdl:output message="impl:convertGallon2LitreResponse" name="convertGallon2LitreResponse" />
</wsdl:operation>
</wsdl:portType>
- <wsdl:binding name="CapacitySoapBinding" type="impl:Capacity">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="convertGallon2Litre">
<wsdlsoap:operation soapAction="" />
- <wsdl:input name="convertGallon2LitreRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://capacity.samples" use="encoded" />
</wsdl:input>
- <wsdl:output name="convertGallon2LitreResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/Capacity" use="encoded" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="CapacityService">
- <wsdl:port binding="impl:CapacitySoapBinding" name="Capacity">
<wsdlsoap:address location="http://localhost:8080/axis/services/Capacity" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
WSDD 的進階功能:
(1) AXIS支援三種物件範圍:
"request"範圍:這是預設的情況,每一次Soap請求的時候都將建立新的對象。
"application"範圍:將會為所有的請求產生一個單獨的共用的對象。
"session"範圍:為每一個session期的用戶端請求建立一個對象。
指定方法如下:
<service name="MyService"...>
<parameter name="scope" value="value"/>
...
</service>
(2) 更多部署內容:Handlers and Chains
讓我們來深入挖掘一下Axis引擎的更強大的特性。如果我們想跟蹤我們的服務被調用了多少次,那麼我們只需要包含一個簡單的handler,它存放在samples/log目錄下。要使用這個handler,你就首先應該部署這個handler,然後使用在部署服務時給它指定的名字。下面是一個wsdd檔案的例子:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- define the logging handler configuration -->
<handler name="track" type="java:samples.userguide.example4.LogHandler">
<parameter name="filename" value="MyService.log"/>
</handler>
<!-- define the service, using the log handler we just defined -->
<service name="LogTestService" provider="java:RPC">
<requestFlow>
<handler type="track"/>
</requestFlow>
<parameter name="className" value="samples.userguide.example4.Service"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
第一段指明了一個名為track的handler,它是samples.userguide.example4.LogHandler類的執行個體。另外還指定了一個參數filename,用於指定記錄檔名稱。
下面的那段指明了一個RPC服務,和我們在上面的例子中看到的一樣,所不同的是在service標籤中的<requestFlow>標籤,它指定了一些在調用服務前應該被調用的handler集。也就是由於我們在部署中插入了這個"track"的引用,所以我們確定每次調用服務的時候都將被記錄到記錄檔中去。
(3)遠端管理:
<service name="AdminService" provider="java:MSG">
<parameter name="className" value="org.apache.axis.util.Admin"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="enableRemoteAdmin" value="true"/>
</service>
WARNING: enabling remote administration may give unauthorized parties access to your machine. If you do this, please make sure to add security to your configuration!
所以遠端管理涉及到安全問題,不建議採用。
轉自:http://blog.csdn.net/happydaytx/archive/2007/05/08/1600318.aspx