如何使用axis构建SOAP应用程序

来源:互联网 发布:unity3d抗锯齿设置 编辑:程序博客网 时间:2024/05/24 05:17

本文档的所有源码:http://download.csdn.net/detail/feichenwangyalin/7911159

你可以根据将其中的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 “,那么说明接口调用成功了。



1 0