http://www.yesky.com/SoftChannel/72342371961929728/20030821/1723269.shtml
概述
本文介紹了一個比較簡單實(shí)用的基于Java的SOAP引擎——Apache組織推出的Axis——的
安裝、配置和應(yīng)用開發(fā)方法,希望對有興趣做基于Java的Web Services應(yīng)用開發(fā)的朋友有所
幫助。
Axis簡介
Axis是Apache組織推出的SOAP引擎,Axis項(xiàng)目是Apache組織著名的SOAP項(xiàng)目的后繼項(xiàng)目
,目前最新版本是采用Java開發(fā)的1.1版本,C++的版本正在開發(fā)之中。Axis v1.1軟件包可
以從http://ws.apache.org/axis/dist/1_1/下載得到。
Axis的安裝
應(yīng)用Axis開發(fā)Web Services,你需要有一個支持Servlet的服務(wù)器引擎,比如廣為人知
的Tomcat(Tomcat也是由Apache組織所提供的,目前的最新版本為4.1.24,下載地址為http
://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/)。在此之前當(dāng)然
你機(jī)器必須已經(jīng)裝好了JDK1.3以上的版本,當(dāng)安裝好Tomcat之后,只需將下載的Axis軟件包
解壓縮,將其中的“webapps”目錄下的“axis”目錄整個拷貝到Tomcat安裝目錄下的“web
apps”目錄下即可。
Axis的配置
Axis基于Java開發(fā),可以部署于多種操作系統(tǒng),使用前需要配置一系列的系統(tǒng)變量,在
此假定你已經(jīng)在本機(jī)上裝好了Tomcat 4.0以上的版本,需要配置的系統(tǒng)變量如下表所示:
CATALINA_HOME
C:\Tomcat_4_1
(此處應(yīng)為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; %AXI
S_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar
如果你不愿做這么繁瑣的類路徑設(shè)置,可以直接將axis軟件包中“l(fā)ib”目錄下的所有.
jar文件加入到系統(tǒng)環(huán)境變量CLASSPATH中即可。
Axis的測試
安裝配置完畢后,應(yīng)測試一下是否Axis可以正確運(yùn)行了。
啟動Tomcat服務(wù)器,在瀏覽器中訪問http://localhost:8080/axis/happyaxis.jsp,如
果頁面顯示有錯誤,則需要回頭檢查一下相關(guān)配置是否正確,如果瀏覽頁面能正確顯示出系
統(tǒng)組件、屬性等參數(shù)配置信息,則表示安裝成功,如下圖所示:
服務(wù)的發(fā)布
Axis提供了兩種服務(wù)發(fā)布方式,一種是即時發(fā)布(Instant Deployment),一種是定制
發(fā)布(Custom Deployment)。
使用即時發(fā)布
對即時發(fā)布的支持是Axis的特色之一,使用即時發(fā)布使用戶只需有提供服務(wù)的Java類的
源代碼,即可將其迅速發(fā)布成Web服務(wù)。每當(dāng)用戶調(diào)用這類服務(wù)的時候,Axis會自動進(jìn)行編
譯,即使服務(wù)器重啟了也不必對其做任何處理,使用非常簡單快捷。
使用即時發(fā)布首先需要一個實(shí)現(xiàn)服務(wù)功能的Java源文件,將其擴(kuò)展名改為.jws(Java W
eb Service的縮寫),然后將該文件放到“……\webapps\axis”目錄下即可。
在此給出一個從英里到公里的長度單位轉(zhuǎn)換的服務(wù),其源碼如下:
文件Distance.jws
/**
* @author 飛鷹
*/
public class Distance
{
public double convertMile2Kilometre( double mile )
{
//實(shí)現(xiàn)英里到公里的距離轉(zhuǎn)換
return mile * 1.609;
}//convertMile2Kilometre()
}/* Distance */
將其放到“……\webapps\axis”目錄,通過訪問http://localhost:8080/axis/Distan
ce.jws?wsdl可以看到這個服務(wù)的WSDL描述文件,這說明Distance服務(wù)被成功發(fā)布了。如下
圖所示:
使用定制發(fā)布
即時發(fā)布是一項(xiàng)令人激動的技術(shù),它使Web服務(wù)的開發(fā)變得如此簡單;然而即時發(fā)布并
不總是最好的選擇,比如有些應(yīng)用系統(tǒng)是第三方提供的,我們沒有購買源代碼,只有.clas
s文件,但我們又希望將這個應(yīng)用系統(tǒng)的一些功能對外發(fā)布成Web服務(wù),使其能夠在更大范圍
內(nèi)產(chǎn)生作用,這個時候即時發(fā)布技術(shù)就無能為力了。此外,即時發(fā)布技術(shù)并不靈活,無法進(jìn)
行更多的服務(wù)配置,這使得它并不能滿足一些特定系統(tǒng)的需求。
因此,Axis提供了另一種服務(wù)發(fā)布方式,這就是定制發(fā)布。
在此給出一個從加侖到升的容積單位轉(zhuǎn)換的服務(wù),其源碼如下:
文件Capacity.java
package samples.capacity;
/**
* @author 飛鷹
*/
public class Capacity
{
public double convertGallon2Litre( double gallon )
{
//實(shí)現(xiàn)加侖到升的容積轉(zhuǎn)換
return gallon * 4.546;
}//convertGallon2Litre()
}/* Capacity */
將其編譯成.class文件,放置到“……\webapps\axis\samples\capacity”目錄下,即
可著手進(jìn)行發(fā)布。
定制發(fā)布不需要構(gòu)建.jws文件,但必須創(chuàng)建服務(wù)發(fā)布描述文件deploy.wsdd(Web Servi
ce Deployment Descriptor的縮寫),這個文件負(fù)責(zé)描述服務(wù)的名稱、入口等信息,其內(nèi)容
如下:
文件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”目錄下,然后可以采用Axi
s提供的一個客戶端管理工具——AdminClient來完成服務(wù)的定制發(fā)布。
在“……\webapps\axis\samples\capacity”目錄下,運(yùn)行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
可以看到以下運(yùn)行結(jié)果:
Processing file deploy.wsdd
<Admin>Doneprocessing</Admin>
這表明Capacity服務(wù)定制發(fā)布完成。
通過訪問http://localhost:8080/axis/services/Capacity?wsdl可以看到這個服務(wù)的W
SDL描述文件,這說明Capacity服務(wù)被成功發(fā)布了。如下圖所示:
服務(wù)的訪問
GET方式的服務(wù)訪問
一般的SOAP消息都是采用POST方式實(shí)現(xiàn)傳遞,但也可以通過GET方式來訪問。比如以下
給出的一個服務(wù)——“HelloWorld”,其源碼如下:
文件HelloWorld.jws
/**
* @author 飛鷹
*/
public class HelloWorld
{
public String helloWorld()
{
//在服務(wù)器端打印輸出
System.out.println( "Hello World!" );
//返回相應(yīng)字符串
return "Hello World!";
}//helloWorld()
}/* HelloWorld */
這個服務(wù)給出一個名位“helloWorld”的無入口參數(shù)的操作,返回一個內(nèi)容為“Hello
World!的字符串”,同時在服務(wù)器端打印“Hello World!”,將該文件放到“……\webap
ps\axis”目錄下,即可通過GET方法直接訪問該服務(wù),訪問的地址為http://localhost:808
0/axis/HelloWorld.jws?method=helloWorld,可以看到返回的SOAP信封消息,同時服務(wù)器
端給出了相應(yīng)的顯示信息“Hello World!”這表明HelloWorld服務(wù)被成功訪問了。如下圖
所示:
客戶端服務(wù)訪問編程
Axis提供了一套API來實(shí)現(xiàn)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對象,在訪問服務(wù)之前,首先要對Call對象設(shè)置相應(yīng)的參數(shù),包括服務(wù)的位置、操
作名、入口參數(shù)、返回值類型等,最后調(diào)用Call對象的invoke方法訪問服務(wù)。
以下給出了一個客戶端訪問Web服務(wù)的例程——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();
//////////訪問即時發(fā)布的Distance服務(wù)
//設(shè)置訪問點(diǎn)
call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );
//設(shè)置操作名
call.setOperationName( "convertMile2Kilometre" );
//設(shè)置入口參數(shù)
call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );
call.setReturnType( XMLType.XSD_DOUBLE );
Double d1 = new Double( 190 );
//調(diào)用服務(wù)
System.out.println( d1 + " 英里相當(dāng)于 " +
call.invoke( new Object[] {d1} ) + " 公里!" );
//////////訪問定制發(fā)布的Capacity服務(wù)
call = ( Call ) service.createCall();
//設(shè)置訪問點(diǎn)
call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );
//設(shè)置操作名
call.setOperationName( "convertGallon2Litre" );
//設(shè)置入口參數(shù)
call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );
call.setReturnType( XMLType.XSD_DOUBLE );
d1 = new Double( 10.00 );
//調(diào)用服務(wù)
System.out.println( d1 + " 加侖相當(dāng)于 " +
call.invoke( new Object[] {d1} ) + " 升!" );
} //main()
}/* AXISTest */
編譯運(yùn)行后運(yùn)行可以看到以下的結(jié)果:
190.0英里相當(dāng)于305.71公里!
10.0加侖相當(dāng)于45.46升!
注意程序在訪問即時發(fā)布的Distance服務(wù)和定制發(fā)布的Capacity服務(wù)時的不同,前者的
服務(wù)訪問點(diǎn)地址為http://localhost:8080/axis/HelloWorld.jws,而后者的則為http://lo
calhost:8080/axis/services/Capacity。
總結(jié)
Web Services是未來網(wǎng)絡(luò)應(yīng)用的發(fā)展方向,SOAP和WSDL是Web Services的核心協(xié)議,Ax
is給出了一個很好的SOAP實(shí)現(xiàn),它使得開發(fā)Web Services應(yīng)用變得輕松而有趣。
概述
本文介紹了一個比較簡單實(shí)用的基于Java的SOAP引擎——Apache組織推出的Axis——的
安裝、配置和應(yīng)用開發(fā)方法,希望對有興趣做基于Java的Web Services應(yīng)用開發(fā)的朋友有所
幫助。
Axis簡介
Axis是Apache組織推出的SOAP引擎,Axis項(xiàng)目是Apache組織著名的SOAP項(xiàng)目的后繼項(xiàng)目
,目前最新版本是采用Java開發(fā)的1.1版本,C++的版本正在開發(fā)之中。Axis v1.1軟件包可
以從http://ws.apache.org/axis/dist/1_1/下載得到。
Axis的安裝
應(yīng)用Axis開發(fā)Web Services,你需要有一個支持Servlet的服務(wù)器引擎,比如廣為人知
的Tomcat(Tomcat也是由Apache組織所提供的,目前的最新版本為4.1.24,下載地址為http
://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/)。在此之前當(dāng)然
你機(jī)器必須已經(jīng)裝好了JDK1.3以上的版本,當(dāng)安裝好Tomcat之后,只需將下載的Axis軟件包
解壓縮,將其中的“webapps”目錄下的“axis”目錄整個拷貝到Tomcat安裝目錄下的“web
apps”目錄下即可。
Axis的配置
Axis基于Java開發(fā),可以部署于多種操作系統(tǒng),使用前需要配置一系列的系統(tǒng)變量,在
此假定你已經(jīng)在本機(jī)上裝好了Tomcat 4.0以上的版本,需要配置的系統(tǒng)變量如下表所示:
CATALINA_HOME
C:\Tomcat_4_1
(此處應(yīng)為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; %AXI
S_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar
如果你不愿做這么繁瑣的類路徑設(shè)置,可以直接將axis軟件包中“l(fā)ib”目錄下的所有.
jar文件加入到系統(tǒng)環(huán)境變量CLASSPATH中即可。
Axis的測試
安裝配置完畢后,應(yīng)測試一下是否Axis可以正確運(yùn)行了。
啟動Tomcat服務(wù)器,在瀏覽器中訪問http://localhost:8080/axis/happyaxis.jsp,如
果頁面顯示有錯誤,則需要回頭檢查一下相關(guān)配置是否正確,如果瀏覽頁面能正確顯示出系
統(tǒng)組件、屬性等參數(shù)配置信息,則表示安裝成功,如下圖所示:
服務(wù)的發(fā)布
Axis提供了兩種服務(wù)發(fā)布方式,一種是即時發(fā)布(Instant Deployment),一種是定制
發(fā)布(Custom Deployment)。
使用即時發(fā)布
對即時發(fā)布的支持是Axis的特色之一,使用即時發(fā)布使用戶只需有提供服務(wù)的Java類的
源代碼,即可將其迅速發(fā)布成Web服務(wù)。每當(dāng)用戶調(diào)用這類服務(wù)的時候,Axis會自動進(jìn)行編
譯,即使服務(wù)器重啟了也不必對其做任何處理,使用非常簡單快捷。
使用即時發(fā)布首先需要一個實(shí)現(xiàn)服務(wù)功能的Java源文件,將其擴(kuò)展名改為.jws(Java W
eb Service的縮寫),然后將該文件放到“……\webapps\axis”目錄下即可。
在此給出一個從英里到公里的長度單位轉(zhuǎn)換的服務(wù),其源碼如下:
文件Distance.jws
/**
* @author 飛鷹
*/
public class Distance
{
public double convertMile2Kilometre( double mile )
{
//實(shí)現(xiàn)英里到公里的距離轉(zhuǎn)換
return mile * 1.609;
}//convertMile2Kilometre()
}/* Distance */
將其放到“……\webapps\axis”目錄,通過訪問http://localhost:8080/axis/Distan
ce.jws?wsdl可以看到這個服務(wù)的WSDL描述文件,這說明Distance服務(wù)被成功發(fā)布了。如下
圖所示:
使用定制發(fā)布
即時發(fā)布是一項(xiàng)令人激動的技術(shù),它使Web服務(wù)的開發(fā)變得如此簡單;然而即時發(fā)布并
不總是最好的選擇,比如有些應(yīng)用系統(tǒng)是第三方提供的,我們沒有購買源代碼,只有.clas
s文件,但我們又希望將這個應(yīng)用系統(tǒng)的一些功能對外發(fā)布成Web服務(wù),使其能夠在更大范圍
內(nèi)產(chǎn)生作用,這個時候即時發(fā)布技術(shù)就無能為力了。此外,即時發(fā)布技術(shù)并不靈活,無法進(jìn)
行更多的服務(wù)配置,這使得它并不能滿足一些特定系統(tǒng)的需求。
因此,Axis提供了另一種服務(wù)發(fā)布方式,這就是定制發(fā)布。
在此給出一個從加侖到升的容積單位轉(zhuǎn)換的服務(wù),其源碼如下:
文件Capacity.java
package samples.capacity;
/**
* @author 飛鷹
*/
public class Capacity
{
public double convertGallon2Litre( double gallon )
{
//實(shí)現(xiàn)加侖到升的容積轉(zhuǎn)換
return gallon * 4.546;
}//convertGallon2Litre()
}/* Capacity */
將其編譯成.class文件,放置到“……\webapps\axis\samples\capacity”目錄下,即
可著手進(jìn)行發(fā)布。
定制發(fā)布不需要構(gòu)建.jws文件,但必須創(chuàng)建服務(wù)發(fā)布描述文件deploy.wsdd(Web Servi
ce Deployment Descriptor的縮寫),這個文件負(fù)責(zé)描述服務(wù)的名稱、入口等信息,其內(nèi)容
如下:
文件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”目錄下,然后可以采用Axi
s提供的一個客戶端管理工具——AdminClient來完成服務(wù)的定制發(fā)布。
在“……\webapps\axis\samples\capacity”目錄下,運(yùn)行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
可以看到以下運(yùn)行結(jié)果:
Processing file deploy.wsdd
<Admin>Doneprocessing</Admin>
這表明Capacity服務(wù)定制發(fā)布完成。
通過訪問http://localhost:8080/axis/services/Capacity?wsdl可以看到這個服務(wù)的W
SDL描述文件,這說明Capacity服務(wù)被成功發(fā)布了。如下圖所示:
服務(wù)的訪問
GET方式的服務(wù)訪問
一般的SOAP消息都是采用POST方式實(shí)現(xiàn)傳遞,但也可以通過GET方式來訪問。比如以下
給出的一個服務(wù)——“HelloWorld”,其源碼如下:
文件HelloWorld.jws
/**
* @author 飛鷹
*/
public class HelloWorld
{
public String helloWorld()
{
//在服務(wù)器端打印輸出
System.out.println( "Hello World!" );
//返回相應(yīng)字符串
return "Hello World!";
}//helloWorld()
}/* HelloWorld */
這個服務(wù)給出一個名位“helloWorld”的無入口參數(shù)的操作,返回一個內(nèi)容為“Hello
World!的字符串”,同時在服務(wù)器端打印“Hello World!”,將該文件放到“……\webap
ps\axis”目錄下,即可通過GET方法直接訪問該服務(wù),訪問的地址為http://localhost:808
0/axis/HelloWorld.jws?method=helloWorld,可以看到返回的SOAP信封消息,同時服務(wù)器
端給出了相應(yīng)的顯示信息“Hello World!”這表明HelloWorld服務(wù)被成功訪問了。如下圖
所示:
客戶端服務(wù)訪問編程
Axis提供了一套API來實(shí)現(xiàn)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對象,在訪問服務(wù)之前,首先要對Call對象設(shè)置相應(yīng)的參數(shù),包括服務(wù)的位置、操
作名、入口參數(shù)、返回值類型等,最后調(diào)用Call對象的invoke方法訪問服務(wù)。
以下給出了一個客戶端訪問Web服務(wù)的例程——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();
//////////訪問即時發(fā)布的Distance服務(wù)
//設(shè)置訪問點(diǎn)
call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );
//設(shè)置操作名
call.setOperationName( "convertMile2Kilometre" );
//設(shè)置入口參數(shù)
call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );
call.setReturnType( XMLType.XSD_DOUBLE );
Double d1 = new Double( 190 );
//調(diào)用服務(wù)
System.out.println( d1 + " 英里相當(dāng)于 " +
call.invoke( new Object[] {d1} ) + " 公里!" );
//////////訪問定制發(fā)布的Capacity服務(wù)
call = ( Call ) service.createCall();
//設(shè)置訪問點(diǎn)
call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );
//設(shè)置操作名
call.setOperationName( "convertGallon2Litre" );
//設(shè)置入口參數(shù)
call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );
call.setReturnType( XMLType.XSD_DOUBLE );
d1 = new Double( 10.00 );
//調(diào)用服務(wù)
System.out.println( d1 + " 加侖相當(dāng)于 " +
call.invoke( new Object[] {d1} ) + " 升!" );
} //main()
}/* AXISTest */
編譯運(yùn)行后運(yùn)行可以看到以下的結(jié)果:
190.0英里相當(dāng)于305.71公里!
10.0加侖相當(dāng)于45.46升!
注意程序在訪問即時發(fā)布的Distance服務(wù)和定制發(fā)布的Capacity服務(wù)時的不同,前者的
服務(wù)訪問點(diǎn)地址為http://localhost:8080/axis/HelloWorld.jws,而后者的則為http://lo
calhost:8080/axis/services/Capacity。
總結(jié)
Web Services是未來網(wǎng)絡(luò)應(yīng)用的發(fā)展方向,SOAP和WSDL是Web Services的核心協(xié)議,Ax
is給出了一個很好的SOAP實(shí)現(xiàn),它使得開發(fā)Web Services應(yīng)用變得輕松而有趣。