如何使用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 “,那麼說明介面呼叫成功了。