>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 23547 个阅读者 刷新本主题
 * 贴子主题:  AXIS2 入门范例 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2018-10-20 00:41:13     消息  查看  搜索  好友  邮件  复制  引用

    前面我们简单了解了WebService(WebService简介),下面我们来看一下Java中实现WebService的其中一种方式---Axis2。

         Axis是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。



Axis2的下载和安装

最新下载地址:http://axis.apache.org/axis2/java/core/

本文使用了目前Axis2最新版本1.6.2,读者可以下载如下两个包

axis2-1.6.2-bin和axis2-1.6.2-war

其中axis2-1.6.2-bin文件中包含了Axis2中所有的jar文件,axis2-1.6.2-war用于将WebService发布到Web容器中。

         将axis2-1.6.2-war文件解压到相应的目录,将目录中的Axis2.war文件放到<Tomcat安装目录>\webapps目录中,并启动Tomcat。

         在浏览器中输入:http://localhost:8080/axis2/,显示下图,表示Axis2安装成功





编写和发布WebService

对于用Java实现的服务程序给人的印象就是需要进行大量的配置,不过这一点在Axis2中将被终结。在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。

下面我们来实现一个简单的POJO,代码如下:

Java代码  收藏代码
/**
* @author xdwang
*  
* @create Apr 18, 2013 10:57:10 AM
*  
* @email:xdwangiflytek@gmail.com
* @description 简单的POJO
*/  
public class SimpleAxis2Service {  
    public String getGreeting(String name) {  
        return "你好 " + name;  
    }  
  
    public int getPrice() {  
        return new java.util.Random().nextInt(1000);  
    }  
}  


在SimpleAxis2Service类中有两个方法,由于这两个方法都是public方法,因此,它们都将作为WebService方法被发布。

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









在浏览器地址栏中输入如下的两个URL来分别测试getGreeting和getPrice方法:

http://localhost:8080/axis2/services/SimpleAxis2Service/getGreeting?name=xdwang







http://localhost:8080/axis2/services/SimpleAxis2Service/getPrice





在编写、发布和测试0配置的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方法参数的值,请求参数名与方法参数名要一致,例如,要测试getGreeting方法,请求参数名应为name,如上面的URL所示。

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

<deployer extension=".class" directory="my" class="org.apache.axis2.deployment.POJODeployer"/>上面的配置允许在<Tomcat安装目录>\webapps\axis2\WEB-INF\my目录中发布WebService。例如,将本例中的SimpleAxis2Service.class复制到my目录中也可以成功发布(但要删除pojo目录中的SimpleAxis2Service.class,否则WebService会重名)。



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

WebService是为程序服务的,只在浏览器中访问WebService是没有意义的。因此,我们这里使用Java实现了一个控制台程序来调用前面发布的WebService。调用WebService的客户端代码如下:

Java代码  收藏代码
package com.iflytek.client;  
  
import javax.xml.namespace.QName;  
  
import org.apache.axis2.addressing.EndpointReference;  
import org.apache.axis2.client.Options;  
import org.apache.axis2.rpc.client.RPCServiceClient;  
  
/**
* @author xdwang
*  
* @create Apr 18, 2013 1:32:12 PM
*  
* @email:xdwangiflytek@gmail.com
*  
* @description Java实现调用WebService的客户端程序
*  
*/  
public class RPCClient {  
    public static void main(String[] args) throws Exception {  
        // 使用RPC方式调用WebService  
        RPCServiceClient serviceClient = new RPCServiceClient();  
        Options options = serviceClient.getOptions();  
        // 指定调用WebService的URL  
        EndpointReference targetEPR = new EndpointReference(  
                "http://localhost:8080/axis2/services/SimpleAxis2Service");  
        options.setTo(targetEPR);  
        // 指定getGreeting方法的参数值  
        Object[] opAddEntryArgs = new Object[] { "xdwang" };  
        // 指定getGreeting方法返回值的数据类型的Class对象  
        Class[] classes = new Class[] { String.class };  
        // 指定要调用的getGreeting方法及WSDL文件的命名空间  
        QName opAddEntry = new QName("http://ws.apache.org/axis2",  
                "getGreeting");  
        // 调用getGreeting方法并输出该方法的返回值  
        System.out.println(serviceClient.invokeBlocking(opAddEntry,  
                opAddEntryArgs, classes)[0]);  
        // 下面是调用getPrice方法的代码,这些代码与调用getGreeting方法的代码类似  
        classes = new Class[] { int.class };  
        opAddEntry = new QName("http://ws.apache.org/axis2", "getPrice");  
        System.out.println(serviceClient.invokeBlocking(opAddEntry,  
                new Object[] {}, classes)[0]);  
    }  
}  


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

         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属性值,下面是SimpleAxis2Service类生成的WSDL文件的代码片段:



http://localhost:8080/axis2/services/SimpleAxis2Service?wsdl



Xml代码  收藏代码
<?xml version="1.0" encoding="UTF-8"?>  
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd"  
xmlns:ns="http://ws.apache.org/axis2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"  
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"  
targetNamespace="http://ws.apache.org/axis2">  
    <wsdl:types>  
            
    </wsdl:types>  
        
</wsdl:definitions>  


用wsdl2java简化客户端的编写



         也许有很多读者会说“有没有搞错啊,只调用两个WebService方法用要写这么多代码,太麻烦了”。不过幸好Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。wsdl2java.bat命令可以在<Axis2安装目录>"bin目录中找到。在使用wsdl2java.bat命令之前需要设置AXIS2_HOME环境变量,该变量值是<Axis2安装目录>。

    在Windows控制台输出如下的命令行来生成调用WebService的代码:

F:\Develop_Packages\WebService\axis2\axis2-1.6.2-bin\bin\wsdl2java -uri http://localhost:8080/axis2/services/SimpleAxis2Service?wsdl -p com.iflytek.client -s -o stub

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

Java代码  收藏代码
public static void main(String args[]) throws Exception {  
    SimpleAxis2ServiceStub stub = new SimpleAxis2ServiceStub();  
    SimpleAxis2ServiceStub.GetGreeting getGreeting = new SimpleAxis2ServiceStub.GetGreeting();  
    getGreeting.setName("xdwang");  
    System.out.println(stub.getGreeting(getGreeting).get_return());  
    SimpleAxis2ServiceStub.GetPrice getPrice = new SimpleAxis2ServiceStub.GetPrice();  
    System.out.println(stub.getPrice(getPrice).get_return());  
  
}  


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->第一个Java程序
  JavaWeb开发-->Servlet技术详解(Ⅲ)
  JSP与Hibernate开发-->映射一对多关联关系
  Java网络编程-->ServerSocket用法详解
  精通Spring-->绑定CSS样式
  Vue3开发-->Vue简介
  Marshalling在Netty中的使用
  9种设计模式在Spring中的运用,一定要非常熟练!
  Spring MVC SSE服务器端推送
  Spring的方法拦截器范例
  @ModelAttribute注解用法详解
  Redis的漏洞利用,原来大佬都是这样操作的
  spring cloud分布式微服务的概览
  Spring Cloud 技术栈及架构一览
  SpringCloud微服务框架搭建
  写给新手的Spring Cloud的微服务入门教程
  Kafka笔记整理
  kubernetes 中的资源
  使用idea和gradle编译spring5源码
  反向代理、负载均衡!优秀的 Nginx 是如何做到的?
  Spring MVC:切面的应用
  更多...
 IPIP: 已设置保密
树形列表:   
[url=http://www.zhent.com]... nihaota 2022-10-28 21:36:21
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。