用Axis開發基於Java的Web服務

概述

  本文介紹了一個比較簡單實用的基於 Java的SOAP引擎——Apache組織推出的Axis——的安裝、配置和應用開發方法,但願對有興趣作基於Java的Web Services應用開發的朋友有所幫助。
  
Axis簡介

  Axis是Apache組織推出的SOAP引擎,Axis項目是Apache組織著名的SOAP項目的後繼項目,目前最新版本是採用Java開發的1.1版本,C++的版本正在開發之中。Axis v1.1 軟件包能夠從[url]http://ws.apache.org/axis/dist/1_1/[/url]下載獲得。
  
Axis的安裝

  應用Axis開發Web Services,你須要有一個支持Servlet的服務器引擎,好比廣爲人知的Tomcat(Tomcat也是由Apache組織所提供的,目前的最新版本爲4.1.24,下載地址爲[url]http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/[/url])。在此以前固然你機器必須已經裝好了JDK1.3以上的版本,當安裝好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
  若是你不肯作這麼繁瑣的類路徑設置,能夠直接將axis軟件包中「lib」目錄下的全部.jar文件加入到系統環境變量CLASSPATH中便可。
  
Axis的測試

  安裝配置完畢後,應測試一下是否Axis能夠正確運行了。
  啓動Tomcat服務器,在瀏覽器中訪問 [url]http://localhost:8080/axis/happyaxis.jsp[/url],若是頁面顯示有錯誤,則須要回頭檢查一下相關配置是否正確,若是瀏覽頁面能正確顯示出系統組件、屬性等參數配置信息,則表示安裝成功,以下圖所示:


  如今能夠開始開發你的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」目錄,經過訪問 [url]http://localhost:8080/axis/Distance.jws?wsdl[/url]能夠看到這個服務的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服務定製發佈完成。
  經過訪問 [url]http://localhost:8080/axis/services/Capacity?wsdl[/url]能夠看到這個服務的WSDL描述文件,這說明Capacity服務被成功發佈了。以下圖所示:

 
 
服務的訪問

  
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方法直接訪問該服務,訪問的地址爲[url]http://localhost:8080/axis/HelloWorld.jws?method=helloWorld[/url],能夠看到返回的SOAP信封消息,同時服務器端給出了相應的顯示信息「Hello World!」這代表HelloWorld服務被成功訪問了。以下圖所示:


  
客戶端服務訪問編程

  Axis提供了一套API來實現SOAP,從[url]http://localhost:8080/axis/docs/apiDocs/index.html[/url]能夠看到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服務時的不一樣,前者的服務訪問點地址爲[url]http://localhost:8080/axis/HelloWorld.jws[/url],然後者的則爲[url]http://localhost:8080/axis/services/Capacity[/url]。
  
總結

  Web Services是將來 網絡應用的發展方向,SOAP和WSDL是Web Services的核心協議,Axis給出了一個很好的SOAP實現,它使得開發Web Services應用變得輕鬆而有趣。
相關文章
相關標籤/搜索