1. 程式人生 > >如何使用axis構建SOAP應用程式

如何使用axis構建SOAP應用程式

你可以根據將其中的SoapServer和SoapClient匯入Eclipse,將axis放入tomcat的webapps中。

1.基本概念

1.1 SOAP的概念

        SOAP即簡單物件訪問協議,是交換資料的一種協議規範,是一種輕量的、簡單的、基於XML(標準通用標記語言下的一個子集)的協議。簡單的說,SOAP也是web service的一種實現形式,是一個系統對外發布的一種服務,但其資料的交換形式是XML。

        SOAP的三大重要的部件是:介面程式(即服務端程式碼)、WSDL(即web servicedescription language)、WSDD(web servicedeploy description),不是很清楚基本概念的讀者可以先百度下這些基本概念。

1.2 為什麼要使用SOAP

        實現webservice的形式的有多重多樣,而SOAP也只是實現介面的其中一種形式。首先我們得明白,我們的系統為什麼要對外發布介面,就拿電信軟體來說吧,我們知道一個電信執行商需要支撐其各種業務需要各種系統,雖然都是一個執行商,但其內的各個系統並不一定是一個軟體廠家開發,比如BOSS(運營支撐系統)有A公司開發,而彩鈴業務系統有B公司開發,某營銷系統有C公司開發,雖然這些系統同屬一個公司,但很明顯A公司的BOSS系統得原始碼是不可能對其他系統開放的,因此這些系統之間的互動就需要通過相互呼叫介面來實現,而這個介面各個系統釋出的介面包括HTTP介面、SOAP介面等等。

2.使用axis開發SOAP應用程式

2.1 axis簡介

        Axis是對Java官方提供的Javawebservice的一種封裝,axis最大的優點在於可以根據服務端提供的wsdl直接生成客戶端程式碼,作為呼叫者可以透明地呼叫服務端介面,就如同伺服器端介面在本地一樣。

2.2 服務端介面開發

        下面我們將做一個實驗,開發一個簡單的介面,並描述如何通過ant指令碼構建專案,生成伺服器端介面程式碼、wsdl、wsdd以及客戶端用jar包,這幾個就是我們在1.1中提過的SOAP應用程式的四個要素。

構建過程如下圖所示:


下面給出最為重要的build.xml原始碼,這個構建過程是完全按照上圖的構建順序進行構建的,其中有註解,讀者可以查閱理解:

<?xml version="1.0"?>

<project name="SoapServer" basedir=".">
	
	<!-- 定義各種路徑 -->
	<property name="srcDir" location="src" />
	<property name="outputDir" location="output" />
	<property name="classDir" location="output/classes" />
	<property name="jarDir" location="output/lib" />
	<property name="srcJarFile" location="${jarDir}/SoapServer.jar" />
	<property name="java2wsdlDir" location="output/wsdl" />
	<property name="genwsddDir" location="output/wsdd" />
	<property name="wsdl2javaDir" location="output/java" />
	
	<property name="wsdl2classDir" location="output/class" />
	<property name="wsdl2jarFile" location="${jarDir}/SoapServer_axis.jar" />
	
	<!-- 定義axis支援包 -->
	<property name="axisHome" location="lib" />
	<property name="name" value="TestSoap" />
	<property name="version" value="1.0" />
	<property name="author" value="author:Martin" />
	
	<!-- 指定axis classpath -->
	<path id="axis.classpath">
		<fileset dir="${axisHome}">
			<include name="**/*.jar" />
		</fileset>
	</path>
	<taskdef resource="axis-tasks.properties" classpathref="axis.classpath" />
	
	<!-- 一些基本資訊-->
	<echo message="----------- ${name} ${version} [${author}] ------------" />
	
	<!-- 檔案目錄初始化 -->
	<target name="init">
		<delete dir="${outputDir}" />
		<delete dir="${classDir}" />
		<delete dir="${jarDir}" />
		<delete dir="${java2wsdlDir}" />
		<delete dir="${wsdl2javaDir}" />
		<delete dir="${wsdl2classDir}" />
        <delete dir="${genwsddDir}" />
		
		<mkdir dir="${outputDir}" />
		<mkdir dir="${classDir}" />
		<mkdir dir="${jarDir}" />
		<mkdir dir="${java2wsdlDir}" />
		<mkdir dir="${genwsddDir}" />
		<mkdir dir="${wsdl2javaDir}" />
		<mkdir dir="${wsdl2classDir}" />
	</target>
	
	<!-- 開始編譯,生成classes檔案 -->
	<target name="compile" depends="init">
		<javac srcdir="${srcDir}" destdir="${classDir}" />
	</target>
	
	<!-- 根據生成的classes, 打包生成jar -->
	<target name="makeJar" depends="init,compile">
		<jar destfile="${srcJarFile}" basedir="${classDir}" />
	</target>

	<!-- 生成wsdl -->
	<target name="buildJava2Wsdl">
		<axis-java2wsdl classname="com.martin.intrefaces.SoapiSayHello" 
			            location="http://localhost:8080/axis/services/SoapiSayHello" 
			            namespace="http://intrefaces.martin.com" 
			            output="${java2wsdlDir}/SoapiSayHello.wsdl" style="RPC">

			<classpath>
				<pathelement path="${classDir}" />
			</classpath>
		</axis-java2wsdl>
	</target>
	
	<!-- 根據生成的wsdl生成對應的java程式碼以及wsdd檔案 -->
	<target name="buildWsdl2Java">
		<axis-wsdl2java all="true" 
			            url="${java2wsdlDir}\SoapiSayHello.wsdl" 
			            deployscope="Request" 
			            output="${wsdl2javaDir}" 
			            serverside="true"
			            testcase="false" 
			            noimports="false" 
			            typemappingversion="1.2">

		</axis-wsdl2java>
		<!-- 將生成的deploy.wsdd移動至指定位置,並重命名 -->
		<move tofile="${genwsddDir}/SoapiSayHello.wsdd" file="${wsdl2javaDir}/com/martin/intrefaces/deploy.wsdd"></move>
	</target>
	
	<!-- 將wsdl生成的Java程式碼編譯打包 -->
	<target name="compileWsdl2Jar">
		<!--編譯成class檔案 -->
		<javac srcdir="${wsdl2javaDir}" destdir="${wsdl2classDir}">
			<!-- 編譯時 引用axis的jar包 -->
			<classpath>
				<fileset dir="${axisHome}">
					<include name="**/*.jar" />
				</fileset>
			</classpath>
		</javac>
		<!--將class檔案打包成jar -->
		<jar destfile="${wsdl2jarFile}" basedir="${wsdl2classDir}" />
	</target>

</project>

構建完畢後,我們來檢視構建出來的產物,如下圖所示:


classes資料夾:server端介面編譯後的class檔案;

java資料夾:根據wsdl生成的客戶端用Java程式碼;

class資料夾:客戶端程式碼編譯後的class檔案;

lib資料夾:SoapServer_axis.jar為客戶端呼叫介面的介面包,該包用於放置在客戶端工程的引用包下;

                    SoapServer.jar為伺服器端用的介面實現包,改包用於放置在axis下lib包下;

wsdl和wsdd包:生成的wsdl和wsdd檔案

3.測試SOAP介面

注:本文提供的原始碼中已經做了如下步驟,你可以根據以下步驟來自己做測試

3.1部署介面

       部署伺服器端有兩步:1 將對應的伺服器端實現包放置在axis對應的lib下;

                                               2 將生成的wsdd檔案中的service節點的內容新增進axis的wsdd檔案中,此時需要注意的是,需要手動將:

<parameter name="className"value="com.martin.intrefaces.SoapiSayHelloSoapBindingImpl"/>替換成:

<parameter name="className"value="com.martin.intrefaces.SoapiSayHello"/>

因為前者是axis生成時預設的類名,如果我們不是這麼取名的,需要手動更改。

3.2 測試介面

1、首先我們訪問如下地址,來檢視服務是否釋出成功:

2、我們將構建出的SoapServer_axis.jar放入SoapClient工程中,並新增引用。

3、執行CientTester.java測試介面能不能請求成功。如果輸出:“呼叫SOAP介面:hello, 丁祥勇, 返回碼為:000000 “,那麼說明介面呼叫成功了。