AXIS2 Web服务教程
欢迎使用Apache Axis2教程。
本教程的范围是使用Axis2创建Web服务,并使用Java客户端程序调用Web服务,并使用Soap UI工具测试Web服务。
为了轻松理解本教程,需要对Java,Web服务,XML,Ant和应用程序服务器(Tomcat)有基本的了解。
使用的软件和工具
Java开发工具包(JDK)1.6.0(Tomcat 7需要最低JDK 1.6)
Apache Ant 1.7.0(Axis2要求最低版本1.6.5)
Apache Axis2 1.5.4(二进制发行版)
用于项目开发的Eclipse 3.6.1 IDE(您也可以使用其他IDE,例如NetBeans)
Apache Tomcat 7.0.8
SoapUI用于测试我们的Web服务。
Mac OS X 10.6.4(我正在Mac OS上工作,但本教程也应适用于其他操作系统,但是在执行命令时可能需要进行一些更改)
系统设置
下载最新版本的Apache Tomcat最新版本。
到目前为止,最新版本是7.0.8,这就是我在本教程中使用的版本。
它要求最低Java版本1.6,因此请确保已将其安装在系统中。
如果您的系统中未安装Java 6,则应首先从Java SE Downloads下载并安装它。
下载Tomcat Core zip(apache-tomcat-7.0.8.zip)并解压缩以将其安装在系统上。
设置JAVA_HOME环境变量以启动和停止服务器。从Apache Axis2 –版本下载Apache Axis2 1.5.4 Binary Distribution zip。
创建轴2.war并将其部署到tomcat并获取将在项目中使用的axis2库是必需的。将Axis2二进制分发zip解压缩到任何方便的目录中。
转到axis2-1.5.4/webapp目录,然后运行" ant create.war"命令在axis2-1.5.4/dist目录中创建axis2.war部署。
如果您未安装Apache Ant,则可以从Apache Ant – Binary Distributions下载并安装它。
请注意,我从War Distribution下载的axis2.war遇到了一些问题。
后来,我发现axis2战争分配中缺少几个罐子。
战争分配仅包含58个罐子,而二进制分配则包含63个罐子。
(我很懒惰地发现哪些瓶子不见了。
)通过将tomcat2.war复制到tomcat webapps目录中,将其部署在tomcat应用程序服务器中。
如果服务器不支持热部署,则可能需要重新启动服务器。转到https://localhost:8080/axis2 /,然后单击"验证"链接。
如果"快乐轴"页面带有绿色,则表示axis2已成功部署。
我们的系统设置现已准备就绪,我们可以继续创建Axis2 Web服务。
创建Axis2 Web服务
为了创建Axis2 Web服务档案,我们需要:
一个Java项目(Axis2WSImplementation),其类将作为Web服务公开。
在我的示例中,我将从MyService类公开两个操作。
第一个操作getData输入为String并返回String,而第二个操作getObjectData输入为MyBean java对象,并在进行一些数据操作后返回MyBean java对象。
请注意,MyBean类实现了Serializable接口,以便可以通过网络进行传输。Ant build.xml文件,将用于创建aar,wsdl和客户端存根以及回调处理程序类。
services.xml文件,它将是axis2存档的一部分。
该文件将放置在axis2归档文件的META-INF文件夹中。
项目结构如下图所示。
不要与build文件夹中的内容混淆。
它们将在我们执行build.xml ant文件时创建。
Axis2 Web服务项目说明
MyService.java:实现类,将作为Axis2 Web服务公开。
$ant create.war
Buildfile: build.xml
init:
[mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
[copy] Copying 59 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
prepare.repo:
[copy] Copying 9 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF
[mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
[copy] Copying 1 file to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
create.war:
[war] Building war: /Users/pankaj/Downloads/axis2-1.5.4/dist/axis2.war
[delete] Deleting directory /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
BUILD SUCCESSFUL
Total time: 2 seconds
MyBean.java:Java Bean类,它是Web服务中getObjectData操作的输入和输出。
package com.theitroad.ws;
import com.theitroad.bean.MyBean;
public class MyService {
public String getData(String input) {
return "Hi" + input;
}
public MyBean getObjectData(MyBean myBean) {
String name = myBean.getName();
int id = myBean.getId();
myBean.setId(id + 100);
myBean.setName("Output: " + name);
return myBean;
}
}
services.xml:Axis2 Web服务相关的参数是此xml文件的一部分。
ServiceClass参数指定将作为Web服务公开的类。
其他重要参数是targetNamespace和schemaNamespace。
services.xml
package com.theitroad.bean;
import java.io.Serializable;
public class MyBean implements Serializable {
private static final long serialVersionUID = -1129402159048345204L;
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
build.xml:用于执行Axis2任务的Ant构建文件。
定义了三个目标,其详细信息是:
generate.wsdl:此目标在生成文件夹中生成MyService.wsdl文件。
确保targetNamespace和schemaTargetNamespace与service.xml文件中的相同。generate.service:此目标在生成文件夹中生成axis2存档。
它在归档文件中包含services.xml文件,归档文件名为MyService.aargenerate.client:此目标生成客户端类。
确保在执行generate.wsdl之后运行此程序,以便MyService.wsdl文件位于构建文件夹中。
build.xml
<service name="MyService" scope="application" targetNamespace="https://theitroad.local/"> <description> MyService </description> <messageReceivers> <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" </messageReceivers> <schema schemaNamespace="https://theitroad.local/xsd" <parameter name="ServiceClass">com.theitroad.ws.MyService</parameter> </service>
生成WSDL,Axis存档和存根文件
执行generate.wsdl ant目标以生成MyService.wsdl文件。
执行generate.service ant目标以生成MyService.aar文件。
执行generate.client ant目标以生成Stub类。
Axis2 Web服务部署
将MyService.aar复制到~apache-tomcat-7.0.8/webapps/axis2/WEB-INF/services目录中。
Axis2支持服务的热部署,因此您无需重新启动服务器。
在ListServices页面(https://localhost:8080/axis2/services/listServices)上检查服务部署。
MyService应该在此处列出两个操作。
Axis2 Web服务测试
部署服务后,首先我们需要对其进行测试。
其中我使用的SoapUI是Web服务测试的最佳工具之一。
如果没有,可以从他们的下载并轻松安装。
使用SoapUI进行测试的步骤
创建一个新的SoapUI项目,该项目名称为MyServiceTest(您可以输入任意名称),初始WSDL/WADL为https://localhost:8080/axis2/services/MyService?wsdl(您可以从Axis2 List Services页面获取此URL,之后点击MyService链接。
)。
将其他选项保留为默认值,然后单击"确定"按钮以创建SoapUI测试项目。进行任何Soap Bindings并双击getData和getObjectData SOAP请求。
提供一些用于请求中输入的值,并将其提交到Web服务端点URL。
您应该从服务获得类似于下图的输出。
它确认我们的Web服务已启动并正在运行。
现在,我们将继续执行使用Axis2存根类调用Web服务的最后一项任务。
使用存根文件调用Axis2 Web服务
在Eclipse中创建一个Java项目Axis2Client。
创建lib文件夹,然后从下载的二进制分发lib文件夹中复制所有Axis2 jar。
将这些jar添加到项目的构建路径。使用正确的包结构将早期生成的MyServiceStub.java和MyServiceCallbackHandler.java复制到项目src中。
就我而言,我将它们复制到com.theitroad包中。
如果您必须将这些类提供给其他人,我强烈建议您使用它们创建一个jar,然后将其分发给其他人以避免任何修改。创建Axis2ClientUsingStubsFromAnt客户端类以调用Web服务操作。
项目结构将类似于下图。
Axis2ClientUsingStubsFromAnt代码
<project name="AxisWSImplementation" basedir="." default="generate.service">
<property environment="env"
<property name="build.dir" value="build"
<path id="axis2.classpath">
<fileset dir="${basedir}/lib">
<include name="*.jar"
</fileset>
</path>
<target name="compile.service">
<mkdir dir="${build.dir}"
<mkdir dir="${build.dir}/classes"
<mkdir dir="${build.dir}/resources"
<!--First let's compile the classes-->
<javac debug="on"
fork="true"
destdir="${build.dir}/classes"
srcdir="${basedir}/src"
classpathref="axis2.classpath">
</javac>
</target>
<target name="generate.wsdl" depends="compile.service">
<taskdef name="java2wsdl"
classname="org.apache.ws.java2wsdl.Java2WSDLTask"
classpathref="axis2.classpath"
<java2wsdl className="com.theitroad.ws.MyService"
outputLocation="${build.dir}"
targetNamespace="https://theitroad.local/"
schemaTargetNamespace="https://theitroad.local/xsd">
<classpath>
<pathelement path="${axis2.classpath}"
<pathelement location="${build.dir}/classes"
</classpath>
</java2wsdl>
</target>
<target name="generate.service" depends="compile.service">
<copy toDir="${build.dir}/classes" failonerror="false">
<fileset dir="${basedir}/resources">
<include name="**/*.xml"
</fileset>
</copy>
<jar destfile="${build.dir}/MyService.aar">
<fileset excludes="**/Test.class" dir="${build.dir}/classes"
</jar>
</target>
<target name="generate.client" depends="compile.service">
<taskdef name="wsdl2java"
classname="org.apache.axis2.tool.ant.AntCodegenTask"
classpathref="axis2.classpath"
<wsdl2java
wsdlfilename="${build.dir}/MyService.wsdl"
output="${build.dir}/resources"
</target>
<target name="clean">
<delete dir="${build.dir}"
</target>
</project>
执行Axis2ClientUsingStubsFromAnt类以调用Web服务。
上面程序的输出是:
package com.theitroad.ws.client;
import java.rmi.RemoteException;
import com.theitroad.MyServiceStub;
import com.theitroad.MyServiceStub.GetData;
import com.theitroad.MyServiceStub.GetDataResponse;
import com.theitroad.MyServiceStub.GetObjectData;
import com.theitroad.MyServiceStub.GetObjectDataResponse;
import com.theitroad.MyServiceStub.MyBean;
/**
*
* @author Pankaj - www.theitroad.local This class will invoke Axis2 web service
* operations using Stub classes
*
*/
public class Axis2ClientUsingStubsFromAnt {
/**
* END_POINT is the web service endpoint
*/
private final static String END_POINT = "https://localhost:8080/axis2/services/MyService";
public static void main(String[] args) throws RemoteException {
System.out.println("START");
//Create the Stub Object by passing the Web Service Endpoint URL
MyServiceStub stub = new MyServiceStub(END_POINT);
//Creating an input object for the getData operation
GetData getDataInput = new GetData();
//Setting the input part in the getData input object
getDataInput.setInput("PANKAJ");
//invoking the getData operation
GetDataResponse getDataOutput = stub.getData(getDataInput);
//get_return method returns the web service output object. Here its
//String, so we can
//directly print the returned value
System.out.println("Output:" + getDataOutput.get_return());
//Creating input object for the getObjectData operation
GetObjectData getObjectDataInput = new GetObjectData();
MyBean myBean = new MyBean();
myBean.setId(1);
myBean.setName("KUMAR");
//Setting the input part in the getObjectData input object
getObjectDataInput.setMyBean(myBean);
//invoking the getObjectData operation
GetObjectDataResponse getObjectDataOutput = stub
.getObjectData(getObjectDataInput);
//Get the MyBean object from the response object
MyBean myBeanOutput = getObjectDataOutput.get_return();
//Print the myBeanOutput values to check that web service operations
//are getting invoked
System.out.println("ID:" + myBeanOutput.getId() + "NAME:"
+ myBeanOutput.getName());
System.out.println("DONE");
}
}

