你可以根据将其中的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、首先我们访问如下地址,来查看服务是否发布成功:
http://ip:port/axis/servlet/AxisServlet,如果服务列表中存在SoapiSayHello服务,说明我们的服务发布成功了。
2、我们将构建出的SoapServer_axis.jar放入SoapClient工程中,并添加引用。
3、运行CientTester.java测试接口能不能请求成功。如果输出:“调用SOAP接口:hello, 丁祥勇, 返回码为:000000 “,那么说明接口调用成功了。