title: 使用Axis2实现WebService的发布和调用
date: 2018-09-25 09:50:30
tags: WebService技术
comments: true
categories: Web服务

一、Axis2简介:

Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。在本文中主要介绍了如何使用Axis2开发WebService,并在客户端使用Java调用这个WebService。

二、Axis2的下载和安装:

Axis下载地址: http://ws.apache.org/axis2/

在本文使用了目前Axis2的最新版本1.7.8。读者可以下载以下两个zip包:   
    axis2-1.7.8-bin.zip
    axis2-1.7.8-war.zip
  其中 axis2-1.7.8-bin.zip 文件中包含了Axis2中所有的jar文件,axis2-1.7.8-war.zip 文件用于将WebService发布到Web容器中。

将 axis2-1.7.8-war.zip 文件解压到相应的目录,将目录中的axis2.war文件放到Tomcat服务器的webapps目录中(本文使用的Tomcat的版本是8.x),并启动Tomcat。

在浏览器地址栏中输入如下的URL:http://localhost:8080/axis2/
  如果在浏览器中显示出如下所示的页面,则表示Axis2安装成功。

三、编写和发布WebService

1、简单的pojo方式(无需配置):

在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。

示例代码如下:

public class HelloService {   public String sayHello(){  return "hello";  }     public String sayHelloToPerson(String name){          if(name==null){  name = "nobody";  }  return "hello,"+name;  }
}

编译HelloService类后,将HelloService.class文件放到<Tomcat安装目录>\webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录)。现在我们已经成功将HelloService类发布成了WebService。在浏览器地址栏中输入如下的URL:
  http://localhost:8080/axis2/services/listServices

在浏览器地址栏中输入以下的两个URL来分别测试sayHelloToPerson和sayHello方法:
    http://localhost:8080/axis2/services/HelloService/sayHello 
    http://localhost:8080/axis2/services/HelloService/sayHelloToPerson?name=bill

页面显示如下结果:
  

注意:在编写、发布和测试WebService时应注意以下几点:
  
  1. POJO类不能使用package关键字声明包。
  2. Axis2在默认情况下可以热发布WebService,也就是说,将WebService的.class文件复制到pojo目录中时,Tomcat不需要重新启动就可以自动发布WebService。
  
  如果想取消Axis2的热发布功能,可以打开<Tomcat安装目录>\webapps\axis2\WEB-INF\conf\axis2.xml,找到如下的配置代码:

<parameter name="hotdeployment">true</parameter>

将true改为false即可。要注意的是,Axis2在默认情况下虽然是热发布,但并不是热更新.也就是说,一旦成功发布了WebService,再想更新该WebService,就必须重启Tomcat。这对于开发人员调试WebService非常不方便,因此,在开发WebService时,可以将Axis2设为热更新。
  在axis2.xml文件中找到:

<parameter name="hotupdate">false</parameter>

将false改为true即可。

3. 在浏览器中测试WebService时,如果WebService方法有参数,需要使用URL的请求参数来指定该WebService方法参数的值,请求参数名与方法参数名要一致,例如,要测试sayHelloToPerson方法,请求参数名应为name,如上面的URL所示。

4. 发布WebService的pojo目录只是默认的,如果读者想在其他的目录发布WebService,可以打开axis2.xml文件,并在**<axisconfig>元素中添加如下(directory="locqi")**的子元素:

<!--POJO deployer , this will alow users to drop .class file and make that into a service--><deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/><deployer extension=".class" directory="locqi" class="org.apache.axis2.deployment.POJODeployer"/>

上面的配置允许在<Tomcat安装目录>\webapps\axis2\WEB-INF\locqi目录中发布WebService。
例如,将本例中的HelloService.class复制到locqi目录中也可以成功发布。

2、打jar包的方式:

用Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web Service,  这样做不需要进行任何配置,但这些POJO类不能在任何包中。这似乎有些不方便.  为此,Axis2也允许将带包的POJO类发布成Web Service。先实现一个POJO类,代码如下:

package com.locqi.webservice;public class HelloServiceNew {public String sayHello() {return "hello";}public String sayHelloToPerson(String name) {if (name == null) {name = "nobody";}return "hello," + name;}public void updateData(String data) {System.out.println(data + "已更新。");}
}

要想将HelloServiceNew类发布成Web Service,需要一个services.xml文件,在WEB-INF下创建services文件夹然后创建**-->conf-->META-INF-->services.xml**,services.xml这个文件必须要放在META-INF目录中,该文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- webService发布名称,命名空间 -->
<service name="HelloServiceNew" targetNamespace="http://ws.apache.org/ax2"><!-- 更改schemaNamespace,也可使用默认值,客户端调用时会使用 --><schema schemaNamespace="http://sdjxd.com.cn" /><!-- webService描述 --><description>Web Service实例一</description><!-- webService的实现类 --><parameter name="ServiceClass">com.locqi.webservice.HelloServiceNew</parameter><messageReceivers><!-- 配置消息接收器,Axis2会自动选择 --><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /></messageReceivers>
</service>

其中**<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,
name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容:
  http://localhost:8080/axis2/services/HelloServiceNew?wsdl
  其中name属性名就是上面URL中"?“和”/"之间的部分。
<description>元素表示当前Web Service的描述,<parameter>元素用于设置WebService的参数,在这里用于设置WebService对应的类名。在这里最值得注意的是<messageReceivers>**元素,该元素用于设置处理WebService方法的处理器。
  例如,sayHello方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,而updateData方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。使用这种方式发布WebService,必须打包成.aar文件,.aar文件实际上就是改变了扩展名的.jar文件。
  现在建立了两个文件:HelloServiceNew.java和services.xml。将HelloServiceNew.java编译,生成HelloServiceNew.class。services.xml和HelloServiceNew.class文件的位置如下:
  D:\ws\com\locqi\webservice\HelloServiceNew.class
  D:\ws\META-INF\services.xml

  在windows控制台中进入ws目录,并输入如下的命令生成.aar文件.

jar cvf ws.aar .(注意:最后面是空格+小数点)

实际上,.jar文件也可以发布webservice,但axis2官方文档中建议使用.aar文件发布webservice.最后将ws.aar文件复制到**<Tomcat安装目录>\webapps\axis2\WEB-INF\services**目录中,启动Tomcat后,就可以调用这个WebService了。 
  另外services.xml文件中也可以直接指定WebService类的方法,如可以用下面的配置代码来发布WebService

<?xml version="1.0" encoding="UTF-8"?>
<!-- webService发布名称,命名空间 -->
<service name="HelloServiceNew" targetNamespace="http://ws.apache.org/ax2"><!-- 更改schemaNamespace,也可使用默认值,客户端调用时会使用 --><schema schemaNamespace="http://sdjxd.com.cn" /><!-- webService描述 --><description>Web Service实例一</description><!-- webService的实现类 --><parameter name="ServiceClass">com.locqi.webservice.HelloServiceNew</parameter><operation name="sayHello"><messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></operation><operation name="updateData"><messageReceiverclass="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /></operation>
</service>

上面的配置代码前面的部分和以前的 services.xml文件的内容相同,但后面使用了 **<operation>元素来指定每一个WebService方法,并单独指定了处理每一个方法的处理器。
  如果想发布多个WebService,可以使用
<serviceGroup>**元素

<serviceGroup>
<service name="myService1">  ...
</service>
<service name="myService2">  ...
</service>
</serviceGroup>

中间省略的代码同上面services.xml文件的配置。

3、不打jar包的方式:(重点)

有一个最简单的方法就是把axis2.war中的内容作为Web Project的基础, 来进行开发.
  不过为了更清楚的了解如何在一个已有的Web Project中嵌入axis2, 那就手动来配置。大致分如下几个步骤:

一、新建Web Project,名为“WebServiceDemo”
  二、下载axis2-1.6.1-war.zip包,解压缩
    将axis2/WEB-INF/lib 里的jar包拷贝到 WebServiceDemo/WebRoot/WEB-INF/lib/
    将axis2.war/axis2-web拷贝至WebServiceDemo/ WebRoot/axis2-web/
  三、配置axis2 servlet
    打开WebServiceDemo/WebRoot/WEB-INF/web.xml,增加如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"id="WebApp_ID" version="3.1"><display-name>WebServiceDemo</display-name><servlet><display-name>Apache-Axis Servlet</display-name><servlet-name>AxisServlet</servlet-name><servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet><display-name>Apache-Axis AxisAdmin Servlet (Web Admin)</display-name><servlet-name>AxisAdminServlet</servlet-name><servlet-class>org.apache.axis2.webapp.AxisAdminServlet</servlet-class></servlet> <servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/servlet/AxisServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>*.jws</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisAdminServlet</servlet-name><url-pattern>/axis2-admin/*</url-pattern></servlet-mapping><mime-mapping><extension>inc</extension><mime-type>text/plain</mime-type></mime-mapping><welcome-file-list><welcome-file>/axis2-web/index.jsp</welcome-file></welcome-file-list><error-page><error-code>404</error-code><location>/axis2-web/Error/error404.jsp</location></error-page><error-page><error-code>500</error-code><location>/axis2-web/Error/error500.jsp</location></error-page>
</web-app>

四、写一个简单的web服务类

package com.locqi;public class MyService {public String sayHello(String name) {return name + " says:Hello!";}
}

五、配置Web Service.

由于axis2已嵌入到WebServiceDemo项目中,所以web service就不用打包成aar,而是直接在/WEB-INF目录下创建相应的文件夹和services.xml,目录结构如下图:

六、services.xml

<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup><service name="myService"><description>Web Service例子</description><parameter name="ServiceClass">com.locqi.MyService</parameter><operation name="sayHello">  <!-- 类里面的方法名 --><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></operation></service>
</serviceGroup>

七、在浏览器中访问http://localhost:8080/WebServiceDemo/services/listServices
可以看到myService服务,说明服务已部署成功。
  输入http://localhost:8080/WebServiceDemo/services/myService?wsdl
可以查看到该Web服务的描述文件

四、用Java实现调用WebService的客户端程序

导入用到的jar包:

axiom-api-1.2.20.jar
axiom-impl-1.2.20.jar
axis2-adb-1.7.8.jar
axis2-kernel-1.7.8.jar
axis2-transport-http-1.7.8.jar
axis2-transport-local-1.7.8.jar
commons-codec-1.2.jar
commons-httpclient-3.1.jar
commons-logging-1.1.1.jar
httpcore-4.4.6.jar
neethi-3.0.3.jar
wsdl4j-1.6.2.jar
XmlSchema-1.4.7.jar

Java调用代码(RPC方式):

package com.locqi.test;import java.io.IOException;import javax.xml.namespace.QName;import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;public class RPCClient {public static String address = "http://localhost:8080/WebServiceDemo/services/hello";public static void main(String[] args) throws IOException {Object[] result = invoke("sayHelloToPerson", new Object[] {}, new Class[] { String.class });System.out.println(result[0]);result = invoke("sayHelloToPerson", new Object[] {"jack"}, new Class[] { String.class });System.out.println(result[0]);}@SuppressWarnings("rawtypes")public static Object[] invoke(String method, Object[] params, Class[] classes) throws AxisFault {// 使用RPC方式调用WebServiceRPCServiceClient client = new RPCServiceClient();Options option = client.getOptions();// 指定调用的URLEndpointReference reference = new EndpointReference(address);option.setTo(reference);/** 设置要调用的方法 http://ws.apache.org/axis2 为默认的(无package的情况)命名空间, 如果有包名,则为* http://axis2.webservice.elgin.com ,包名倒过来即可 method为方法名称* */QName qname = new QName("http://webservice.locqi.com", method);// 调用远程方法,并指定方法参数以及返回值类型Object[] result = client.invokeBlocking(qname, params, classes);return result;}
}

输出结果为:
  hello,nobody
  hello,jack

在编写客户端代码时应注意如下几点:

1. 客户端代码需要引用很多Axis2的jar包,如果读者不太清楚要引用哪个jar包,可以在Eclipse的工程中引用Axis2发行包的lib目录中的所有jar包。

2. 在本例中使用了RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。invokeBlocking方法有三个参数,其中,
  第一个参数的类型是QName对象,表示要调用的方法名;
  第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
  第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。
  当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
  3. 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

4. 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是**<wsdl:definitions>**元素的targetNamespace属性值。

五、用wsdl2java简化客户端的编写

Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。wsdl2java.bat命令可以在**<Axis2安装目录>/bin目录中找到。在使用wsdl2java.bat命令之前需要设置AXIS2_HOME环境变量,该变量值是<Axis2安装目录>**。在Windows控制台输出如下的命令行来生成调用WebService的代码:

%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/HelloService?wsdl -p client -s -o stub

其中-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后,就会发现在当前目录下多了个stub目录,在stub/src/client目录可以找到一个HelloServiceStub.java文件,该文件复杂调用WebService,可以在程序中直接使用这个类,代码如下:

package client;public class StupTest {public static void main(String[] args) throws Exception {HelloStub stub = new HelloStub();HelloStub.SayHelloToPerson gg = new HelloStub.SayHelloToPerson();gg.setName("美女1");System.out.println(stub.sayHelloToPerson(gg).get_return());MyServiceStub myServiceStub = new MyServiceStub();MyServiceStub.SayHello say = new MyServiceStub.SayHello();say.setName("美女2");System.out.println(myServiceStub.sayHello(say).get_return());}
}

输出结果如下:
  hello,美女1
  美女2 says:Hello!

上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,类名为方法名,例如,sayHelloToPerson方法的参数都封装在了SayHelloToPerson类中,要想调用sayHelloToPerson方法,必须先创建SayHelloToPerson类的对象实例。

使用Axis2实现WebService的发布和调用相关推荐

  1. Axis2学习第一篇:Axis2开发WebService之发布和调用

    一.关于Axis2 Axis2是目前比较流行的WebService引擎.适用于开发RPC风格的程序. 二.使用Axis2开发WebService 下载与安装 下载地址:http://axis.apac ...

  2. PHP Webservice的发布与调用

    PHP Webservice的发布与调用 1.  环境配置 配置php.ini,把php_soap.dll前面的分号去掉, 不然会报错 class soapserver not found 重启apa ...

  3. Axis2 webservice入门--Webservice的发布与调用

    一.Webservice发布 参考 http://www.cnblogs.com/demingblog/p/3263576.html 二.webservice 调用 部分参考:http://www.c ...

  4. SAP 中 Webservice的发布和调用过程。

    20180620 新建程序测试Webservice 服务.REPORT YTEST_WEBSERVICE_N .DATA LS_CONSUMER TYPE REF TO ZCL_CO_ZWS_ZPPT ...

  5. 基于CXF框架的webservice接口发布与调用

    目录 前言 正文 一,开发接口服务端(soap风格),接收SAP系统推送过来的数据 二,调用SAP提供的webservice接口(soap风格) 三,调用SRM系统提供的rest接口 四,接口调试工具 ...

  6. 【WebService笔记01】使用JWS实现WebService接口的发布和调用

    这篇文章,主要介绍如何使用JWS实现WebService接口的发布和调用. 目录 一.JWS实现WebService接口 1.1.JWS发布WebService接口 (1)编写接口 (2)编写实现类 ...

  7. 使用axis2进行WebService的开发

    使用axis2进行WebService的开发 Apache Axis2 是 Apache Axis SOAP 项目的后继项目.此项目是 Web 服务核心引擎的重要改进,目标是成为 Web 服务和面向服 ...

  8. Axis2搭建WebService服务

    使用Axis2搭建WebService服务 文章目录 一.服务端部署 1.1 在web.xml配置文件中添加映射路径: 2. 创建目录及文件 3. 新建服务接口 4. 新建接口实现类 5. 发布服务 ...

  9. axis2之webservice

    Axis2之webservice超详细教程 Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的 ...

  10. MyEclipse10 + Axis2 开发webservice

    最近准备用Axis2做WebService的开发,期间也碰到一些坑爹的问题,在MyEclipse10下安装最新的Axis2插件,不知道是不是人品问题还是插件的兼容性不太给力都没有成功,只能使用低版本的 ...

最新文章

  1. python数据导入一个列表_Python基础数据类型list 列表
  2. Qt信号与槽传递自定义数据类型——两种解决方法
  3. Google 的最后努力 :请求最高法院撤回 88 亿罚单
  4. node.js安装模式 的区别_如何使用nodejs写一个接口
  5. VTK:PolyData之MergeSelections
  6. [Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句
  7. lwIP ARP协议分析
  8. 4.6.2 软件测试的步骤
  9. 云计算机有哪些特征,你知道云计算有哪些核心特征吗?
  10. 操作系统(李治军) L10用户级线程
  11. Stateflow中的事件执行顺序
  12. php环形链表,PHP环形链表实现方法示例
  13. elasticsearch.net search入门使用指南中文版(翻译)
  14. GetLastError错误码大全
  15. mysql安装,mysql环境变量配置
  16. win7系统没有计算机睡眠状态,如何解决win7系统无法进入睡眠状态
  17. 电脑u盘数据丢失怎么恢复 u盘数据无故丢失怎么恢复
  18. 输入一个字符串,判断其是否为回文串。
  19. Microduino-W5500
  20. Ajax安卓成功iOS失败,api.ajax图片上传,ios可以上传成功,安卓上传失败

热门文章

  1. Python collections模块之Counter()详解
  2. 无锡python程序员_Python程序员学习路线图
  3. Ubuntu、CentOS、macOS测试服务器上传和下载速度
  4. Log4j 漏洞修复检测 附检测工具
  5. 什么是黑盒测试?它的常用方法有哪些?
  6. Android SDK是什么
  7. cannot import name ‘_validate_lengths‘ from ‘numpy.lib.arraypad‘错误
  8. applet java_Java applet 类
  9. scum服务器里找不到车,人渣SCUM车辆机制介绍 人渣SCUM车辆为什么消失
  10. 六十星系之14廉贞贪狼坐巳亥