本文介紹了一個比較簡單實用的基于Java的SOAP引擎——Apache組織推出的Axis——的安裝、配置和應用開發方法,希望對有興趣做基于Java的Web Services應用開發的朋友有所幫助。
服務的發布 Axis提供了兩種服務發布方式,一種是即時發布(Instant Deployment),一種是定制發布(Custom Deployment)。
使用即時發布
對即時發布的支持是Axis的特色之一,使用即時發布使用戶只需有提供服務的Java類的源代碼,即可將其迅速發布成Web服務。每當用戶調用這類服務的時候,Axis會自動進行編譯,即使服務器重啟了也不必對其做任何處理,使用非常簡單快捷。
使用即時發布首先需要一個實現服務功能的Java源文件,將其擴展名改為.jws(Java Web Service的縮寫),然后將該文件放到“……\webapps\axis”目錄下即可。
在此給出一個從英里到公里的長度單位轉換的服務,其源碼如下:
文件Distance.jws
/**
* @author 飛鷹
*/
public class Distance
{
public double convertMile2Kilometre( double mile )
{
//實現英里到公里的距離轉換
return mile * 1.609;
}//convertMile2Kilometre()
}/* Distance */
將其放到“……\webapps\axis”目錄,通過訪問http://localhost:8080/axis/Distance.jws?wsdl可以看到這個服務的WSDL描述文件,這說明Distance服務被成功發布了。如下圖所示:

使用定制發布
即時發布是一項令人激動的技術,它使Web服務的開發變得如此簡單;然而即時發布并不總是最好的選擇,比如有些應用系統是第三方提供的,我們沒有購買源代碼,只有.class文件,但我們又希望將這個應用系統的一些功能對外發布成Web服務,使其能夠在更大范圍內產生作用,這個時候即時發布技術就無能為力了。此外,即時發布技術并不靈活,無法進行更多的服務配置,這使得它并不能滿足一些特定系統的需求。
因此,Axis提供了另一種服務發布方式,這就是定制發布。
在此給出一個從加侖到升的容積單位轉換的服務,其源碼如下:
文件Capacity.java
package samples.capacity;
/**
* @author 飛鷹
*/
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>
將該文件也放到“……\webapps\axis\samples\capacity”目錄下,然后可以采用Axis提供的一個客戶端管理工具——AdminClient來完成服務的定制發布。
在“……\webapps\axis\samples\capacity”目錄下,運行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
可以看到以下運行結果:
Processing file deploy.wsdd
<Admin>Doneprocessing</Admin>
這表明Capacity服務定制發布完成。
通過訪問http://localhost:8080/axis/services/Capacity?wsdl可以看到這個服務的WSDL描述文件,這說明Capacity服務被成功發布了。如下圖所示:

作者:飛鷹出處:yesky責任編輯: 方舟 [ 2003-08-21 16:50 ]
本文介紹了一個比較簡單實用的基于Java的SOAP引擎的安裝、配置和應用開發方法
服務的訪問 GET方式的服務訪問 一般的SOAP消息都是采用POST方式實現傳遞,但也可以通過GET方式來訪問。比如以下給出的一個服務——“HelloWorld”,其源碼如下:
文件HelloWorld.jws
/**
* @author 飛鷹
*/
public class HelloWorld
{
public String helloWorld()
{
//在服務器端打印輸出
System.out.println( "Hello World!" );
//返回相應字符串
return "Hello World!";
}//helloWorld()
}/* HelloWorld */
這個服務給出一個名位“helloWorld”的無入口參數的操作,返回一個內容為“Hello World!的字符串”,同時在服務器端打印“Hello World!”,將該文件放到“……\webapps\axis”目錄下,即可通過GET方法直接訪問該服務,訪問的地址為http://localhost:8080/axis/HelloWorld.jws?method=helloWorld,可以看到返回的SOAP信封消息,同時服務器端給出了相應的顯示信息“Hello World!”這表明HelloWorld服務被成功訪問了。如下圖所示:

客戶端服務訪問編程
Axis提供了一套API來實現SOAP,從http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文檔。
其中,org.apache.axis.client.Call和org.apache.axis.client.Service是兩個比較常用的類,一般的客戶端程序欲訪問一個Web Service時,都要生成一個客戶端的Service對象和Call對象,在訪問服務之前,首先要對Call對象設置相應的參數,包括服務的位置、操作名、入口參數、返回值類型等,最后調用Call對象的invoke方法訪問服務。
以下給出了一個客戶端訪問Web服務的例程——AXISTest.java:
文件AXISTest.java
package axisexercise;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
/**
* @author 飛鷹
*/
public class AXISTest
{
public static void main( String[] args ) throws Exception
{
Service service = new Service();
Call call = ( Call ) service.createCall();
//////////訪問即時發布的Distance服務
//設置訪問點
call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );
//設置操作名
call.setOperationName( "convertMile2Kilometre" );
//設置入口參數
call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );
call.setReturnType( XMLType.XSD_DOUBLE );
Double d1 = new Double( 190 );
//調用服務
System.out.println( d1 + " 英里相當于 " +
call.invoke( new Object[] {d1} ) + " 公里!" );
//////////訪問定制發布的Capacity服務
call = ( Call ) service.createCall();
//設置訪問點
call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );
//設置操作名
call.setOperationName( "convertGallon2Litre" );
//設置入口參數
call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );
call.setReturnType( XMLType.XSD_DOUBLE );
d1 = new Double( 10.00 );
//調用服務
System.out.println( d1 + " 加侖相當于 " +
call.invoke( new Object[] {d1} ) + " 升!" );
} //main()
}/* AXISTest */
編譯運行后運行可以看到以下的結果:
190.0英里相當于305.71公里!
10.0加侖相當于45.46升!
注意程序在訪問即時發布的Distance服務和定制發布的Capacity服務時的不同,前者的服務訪問點地址為http://localhost:8080/axis/HelloWorld.jws,而后者的則為http://localhost:8080/axis/services/Capacity。
來自:http://hi.baidu.com/zxhcloth/blog/item/bb8637dbf28e0b67d0164ea5.html