欢迎学习ApacheAxis2教程。最近,我试图将我的[Apache1.3]Axis2](https://axis.apache.org/axis2/java/core/index.html)技能升级到最新的1.5.4版本,但我找不到任何不言自明、涵盖最新版本的教程。因此,它构成了我发布的Axis2Web服务教程的基础。
ApacheAxis2教程
谁应该使用本教程?
本教程面向对使用ApacheAxis2开发和部署Web服务感兴趣的Java程序员。
前提条件
本教程的范围是使用Axis2创建Web服务,并使用Java客户端程序调用Web服务,以及使用SOAPUI工具测试Web服务。要轻松理解本教程,需要对Java、Web服务、XML、Ant和应用服务器(Tomcat)有基本的了解。
使用的软件和工具
Java开发工具包(JDK)1.6.0(Tomcat 7需要最低版本的JDK 1.6) 2.ApacheAnt 1.7.0(Axis2要求最低版本为1.6.5) 3.ApacheAxis2 1.5.4(二进制分发版) 4.用于项目开发的eclipse 3.6.1 IDE(您也可以使用其他IDE,例如NetBeans) 5.阿帕奇Tomcat 7.0.8 6.用于测试我们的Web服务的SoapUI。 7.Mac OS X 10.6.4(我在Mac OS上工作,但本教程应该也适用于其他操作系统,但在执行命令时可能需要一些更改)
系统设置
1.下载最新版本apache Tomcat最新版本]。到目前为止,最新版本是7.0.8,这就是我在本教程中使用的版本。它需要最低版本的Java 1.6,因此请确保您的系统中安装了它。如果您的系统中未安装JAVA 6,则应首先从JAVA SE Downloads.]下载并安装下载Tomcat核心压缩包(apache-tomcat-7.0.8.zip)并解压缩以将其安装在您的系统上。设置JAVA_HOME 环境变量以启动和停止服务器。 2.从ApacheAxis2-Releases.]下载ApacheAxis2 1.5.4二进制分发压缩包这一步是创建将部署到Tomcat的axis2.war以及获取要在项目中使用的axis2库所必需的。 3.将Axis2二进制分发压缩包解压缩到任何方便的目录中。转到axis2-1.5.4/webapp目录并运行_).]下载并安装请注意,我在使用从战争分发下载的axis2.war时遇到了一些问题。后来,我发现Axis2的战争分布中少了几个罐子。WAR分布只包含58个罐子,而二进制分布包含63个罐子。(我懒得去找,哪些罐子不见了。)
1$ant create.war
2构建文件:Build.xml
3
4初始化:
5[mkdir]已创建目录:/USERS/Pankaj/Downloads/axis2-1.5.4/dist/temp
6[复制]将59个文件复制到/USERS/Pankaj/Downloads/axis2-1.5.4/dist/temp
7
8Preparare.repo:
9[复制]将9个文件复制到/Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF
10[mkdir]已创建目录:/Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
11[复制]将1个文件复制到/Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
12
13Create.war:
14[战争]制造战争:/Users/pankaj/Downloads/axis2-1.5.4/dist/axis2.war
15[删除]删除目录/USERS/Pankaj/Downloads/axis2-1.5.4/dist/temp
16
17构建成功
18总时间:2秒
4.在Tomcat应用服务器中部署axis2.war,方法是将其复制到Tomcat WebApps目录中。如果服务器不支持热部署,则可能需要重新启动服务器。 5.转到https://localhost:8080/axis2/并单击验证链接。如果Happy Axis页面显示为绿色 ,则表示Axis2部署成功。我们的系统设置现在已经准备好,我们可以继续创建Axis2Web服务了。
创建Axis2 Web服务
为了创建Axis2 Web Service归档,我们需要以下内容:
1.包含将作为Web服务公开的类的Java项目(Axis2WSImplementation)。在我的示例中,我公开了来自MyService 类的两个操作。第一个操作是字符串,返回字符串,而第二个操作是** MyBean** Java对象,经过一些数据操作后返回MyBean Java对象。请注意,MyBean类实现了Serializable接口,因此可以通过网络进行传输。 2.antBuild.xml 文件,用于创建AAR、WSDL以及客户端存根和回调处理程序类。 3.将成为axis2存档一部分的services.xml 文件。该文件将放在axis2存档的META-INF文件夹中。
项目结构将如下图所示。文件夹中的内容混淆。它们将在我们执行Build.xmlant文件时创建。
Axis2 Web Service项目说明
MyService.java :将作为Axis2 Web服务公开的实现类。
1package com.journaldev.ws;
2
3import com.journaldev.bean.MyBean;
4
5public class MyService {
6
7 public String getData(String input) {
8 return "Hi" + input;
9 }
10
11 public MyBean getObjectData(MyBean myBean) {
12
13 String name = myBean.getName();
14 int id = myBean.getId();
15 myBean.setId(id + 100);
16 myBean.setName("Output: " + name);
17
18 return myBean;
19 }
20}
MyBean.java :Java Bean类,是Web服务中getObjectData操作的输入和输出。
1package com.journaldev.bean;
2
3import java.io.Serializable;
4
5public class MyBean implements Serializable {
6
7 private static final long serialVersionUID = -1129402159048345204L;
8
9 private String name;
10
11 private int id;
12
13 public String getName() {
14 return name;
15 }
16
17 public void setName(String name) {
18 this.name = name;
19 }
20
21 public int getId() {
22 return id;
23 }
24
25 public void setId(int id) {
26 this.id = id;
27 }
28
29}
services.xml :Axis2Web服务相关参数是此XML文件的一部分。ServiceClass参数指定将作为Web服务公开的类。其他重要的参数是目标名称空间和模式名称空间。services.xml
1<service name="MyService" scope="application" targetNamespace="https://journaldev.com/">
2 <description>
3 MyService
4 </description>
5 <messageReceivers>
6 <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
7 <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
8 </messageReceivers>
9 <schema schemaNamespace="https://journaldev.com/xsd"/>
10 <parameter name="ServiceClass">com.journaldev.ws.MyService</parameter>
11</service>
Build.xml :用于执行Axis2任务的Ant构建文件。定义了三个目标,其详细信息如下:
1.Generate.wsdl :该目标在Build文件夹中生成MyService.wsdl文件。确保Target Namesspace和schemaTargetNamesspace与service.xml文件中的相同。 2.Generate.service :该目标在Build文件夹中生成axis2存档。它将services.xml文件包含在归档文件中,归档名称为MyService.aar 3.Generate.Client :该目标生成客户端类。确保在执行Generate.wsdl之后运行此命令,以便MyService.wsdl文件位于Build文件夹中。
Build.xml
1<project name="AxisWSImplementation" basedir="." default="generate.service">
2
3 <property environment="env"/>
4 <property name="build.dir" value="build"/>
5
6 <path id="axis2.classpath">
7 <fileset dir="${basedir}/lib">
8 <include name="*.jar"/>
9 </fileset>
10 </path>
11
12 <target name="compile.service">
13 <mkdir dir="${build.dir}"/>
14 <mkdir dir="${build.dir}/classes"/>
15 <mkdir dir="${build.dir}/resources"/>
16 <!--First let's compile the classes-->
17 <javac debug="on"
18 fork="true"
19 destdir="${build.dir}/classes"
20 srcdir="${basedir}/src"
21 classpathref="axis2.classpath">
22 </javac>
23 </target>
24
25 <target name="generate.wsdl" depends="compile.service">
26 <taskdef name="java2wsdl"
27 classname="org.apache.ws.java2wsdl.Java2WSDLTask"
28 classpathref="axis2.classpath"/>
29 <java2wsdl className="com.journaldev.ws.MyService"
30 outputLocation="${build.dir}"
31 targetNamespace="https://journaldev.com/"
32 schemaTargetNamespace="https://journaldev.com/xsd">
33 <classpath>
34 <pathelement path="${axis2.classpath}"/>
35 <pathelement location="${build.dir}/classes"/>
36 </classpath>
37 </java2wsdl>
38 </target>
39
40 <target name="generate.service" depends="compile.service">
41 <copy toDir="${build.dir}/classes" failonerror="false">
42 <fileset dir="${basedir}/resources">
43 <include name="**/*.xml"/>
44 </fileset>
45 </copy>
46 <jar destfile="${build.dir}/MyService.aar">
47 <fileset excludes="**/Test.class" dir="${build.dir}/classes"/>
48 </jar>
49 </target>
50
51 <target name="generate.client" depends="compile.service">
52 <taskdef name="wsdl2java"
53 classname="org.apache.axis2.tool.ant.AntCodegenTask"
54 classpathref="axis2.classpath"/>
55 <wsdl2java
56 wsdlfilename="${build.dir}/MyService.wsdl"
57 output="${build.dir}/resources" />
58 </target>
59
60 <target name="clean">
61 <delete dir="${build.dir}"/>
62 </target>
63</project>
生成wsdl、AXIS归档和存根文件
- 执行Generate.wsdl ant目标生成MyService.wsdl文件。
- 执行Generate.service ant目标以生成MyService.aar文件。
- 执行Generate.client ant目标以生成存根类。
Axis2 Web服务部署
复制~apache-tomcat-7.0.8/webapps/axis2/WEB-INF/services目录中的MyService.aar。Axis2支持服务热部署,无需重启服务器。在列表服务页面(https://localhost:8080/axis2/services/listServices).上检查服务部署MyService应该在那里列出,其中包含两个操作。
Axis2 Web服务测试
部署服务后,首先需要对其进行测试。在这里,我使用的是SoapUI,这是最好的Web服务测试工具之一。如果你没有,你可以从他们的网站上下载并轻松安装。SoapUI测试步骤
1.创建一个新的SoapUI项目,项目名为MyServiceTest(您可以使用任何名称)和初始wsdl/wadlURL(您可以在单击MyService链接后从Axis2list Services页面获得此https://localhost:8080/axis2/services/MyService?wsdl)。将其他选项保留为缺省值,然后单击OK按钮创建SoapUI测试项目。 2.获取任意的SOAP绑定,然后双击getData和getObjectData SOAP请求。 3.在请求中提供一些输入值,并将其提交到Web服务端点URL。您应该会从该服务获得类似于下图的输出。它确认我们的Web服务已启动并正在运行。
的Axis2Web服务测试现在,我们将继续使用Axis2存根类调用Web服务的最后一个任务。
使用存根文件调用Axis2 Web服务
1.在Eclipse中创建Java项目 Axis2Client 。 2.创建lib文件夹并从下载的二进制分发lib文件夹中复制所有Axis2 jar。将这些jar添加到项目的构建路径中。 3.将之前生成的_MyServiceStub.java_和_MyServiceCallbackStub.java_用正确的包结构复制到项目src中。在我的情况下,我复制他们在com.journaldev包。如果您必须将这些类提供给其他人,我强烈建议您从这些类创建一个jar,然后与其他人一起分发,以避免任何修改。 4.创建_Axis2ClientUsingStubsFromAnt_ client类以调用Web服务操作。该项目的结构将看起来像下面的图像类似。
Axis2ClientUsingStubsFromAnt代码
1package com.journaldev.ws.client;
2
3import java.rmi.RemoteException;
4
5import com.journaldev.MyServiceStub;
6import com.journaldev.MyServiceStub.GetData;
7import com.journaldev.MyServiceStub.GetDataResponse;
8import com.journaldev.MyServiceStub.GetObjectData;
9import com.journaldev.MyServiceStub.GetObjectDataResponse;
10import com.journaldev.MyServiceStub.MyBean;
11
12/**
13 *
14 * @author Pankaj - www.journaldev.com This class will invoke Axis2 web service
15 * operations using Stub classes
16 *
17 */
18public class Axis2ClientUsingStubsFromAnt {
19
20 /**
21 * END_POINT is the web service endpoint
22 */
23 private final static String END_POINT = "https://localhost:8080/axis2/services/MyService";
24
25 public static void main(String[] args) throws RemoteException {
26 System.out.println("START");
27
28 // Create the Stub Object by passing the Web Service Endpoint URL
29 MyServiceStub stub = new MyServiceStub(END_POINT);
30
31 // Creating an input object for the getData operation
32 GetData getDataInput = new GetData();
33
34 // Setting the input part in the getData input object
35 getDataInput.setInput("PANKAJ");
36
37 // invoking the getData operation
38 GetDataResponse getDataOutput = stub.getData(getDataInput);
39
40 // get_return method returns the web service output object. Here its
41 // String, so we can
42 // directly print the returned value
43 System.out.println("Output:" + getDataOutput.get_return());
44
45 // Creating input object for the getObjectData operation
46 GetObjectData getObjectDataInput = new GetObjectData();
47 MyBean myBean = new MyBean();
48 myBean.setId(1);
49 myBean.setName("KUMAR");
50
51 // Setting the input part in the getObjectData input object
52 getObjectDataInput.setMyBean(myBean);
53
54 // invoking the getObjectData operation
55 GetObjectDataResponse getObjectDataOutput = stub
56 .getObjectData(getObjectDataInput);
57
58 // Get the MyBean object from the response object
59 MyBean myBeanOutput = getObjectDataOutput.get_return();
60
61 // Print the myBeanOutput values to check that web service operations
62 // are getting invoked
63 System.out.println("ID:" + myBeanOutput.getId() + "NAME:"
64 + myBeanOutput.getName());
65
66 System.out.println("DONE");
67
68 }
69
70}
执行_Axis2ClientUsingStubsFromAnt_类以调用Web服务。上述程序的输出为:
1START
2log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
3log4j:WARN Please initialize the log4j system properly.
4Output:HiPANKAJ
5ID:101NAME:Output: KUMAR
6DONE
如果您觉得本教程有助于理解Axis2并开始使用它,请在评论部分分享您的想法。是的,别忘了和其他人分享。您的两次点击和5秒时间可以帮助其他人轻松学习Axis2。:)