苏铭客

导航

Axis2 WebService 服务端发布和客户端调用

下载最新的Axis2 地址:http://mirrors.cnnic.cn/apache/axis/axis2/java/core/ 

下载 最新的war 包 axis2-1.7.4-war.zip ,下载完后将axis2.war放至tomcat安装目录下的webapps文件夹下,然后启动tomcat后,

 一.在webapps目录下会生成axis2文件夹。  访问http://localhost:8080/axis2/能看到以下页面表示axis2运行成功。 

 二. 接下来,构建自己的项目  在MyEclipse下新建Web Project,项目名:webServicePrj。

 三.新建一个HelloWorld类 作为测试类。

package com.webService;

public class HelloWorld {
    
    // 服务器端访问地址: http://localhost:8080/webServicePrj/services/HelloWorld?wsdl
    //webServicePrj是项目名,services
    public String sayHello(String name) {
        return " hello " + name;
    }
    
}
View Code

 四. 把tomcat安装目录下的webapps/axis2/WEB-INF下的modules、service和conf文件拷至WebRoot下的WEB-INF目录下。同时把axis2/WEB-INFO/lib下的jar包也拷到项目的lib目录下。

     关键点来了:项目 WebRoot/WEB-INF 下services 目录下 新建一个任意名称的文件夹,建完后在新建 META-INF/services.xml.  services.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<service name="HelloWorld">    
    <description>    
        HelloWorld Service Example  
    </description>    
    <parameter name="ServiceClass">    
        com.webService.HelloWorld
    </parameter>    
    <operation name="sayHello">    
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />    
    </operation>    
</service>

具体的文件路径如下:

 

五.WEB-INF新建web.xml.内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  
     <!-- 加载Axis -->  
    <servlet>  
        <servlet-name>AxisServlet</servlet-name>  
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    
    <servlet-mapping>  
        <servlet-name>AxisServlet</servlet-name>  
        <url-pattern>/services/*</url-pattern>  
    </servlet-mapping>  
</web-app>

 

 至此,我们将项目部署的tomcat下。访问下webService服务。

 访问路径: http://localhost:8080/webServicePrj/services/HelloWorld?wsdl

 有如下消息,表示我们访问webService服务成功!

接下来我们新建一个客户端类,调用服务类HelloWorld。新建类代码如下

package com.client;

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 clientTest {
    
    /**
     * 方法一:应用rpc的方式调用 这种方式就等于远程调用, 
       * 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
     * @param args
     */
    public static void main(String[] args) {
        String url = "http://127.0.0.1:8080/webServicePrj/services/HelloWorld?wsdl";  
        String result = null; 
        // 使用RPC方式调用WebService  
        RPCServiceClient serviceClient = null;
        try {
            serviceClient = new RPCServiceClient();
            Options options = serviceClient.getOptions();  
            // 指定调用WebService的URL  
            EndpointReference targetEPR = new EndpointReference(url);  
            options.setTo(targetEPR);  
            // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值  
            // // 指定要调用的sayHello方法及WSDL文件的命名空间.....  
            QName opAddEntry = new QName("http://webService.com", "sayHello");  
            Object[] opAddEntryArgs = new Object[] { "jack" };  
            Class[] classes = new Class[] { String.class };  
            // 调用sayHello方法并输出该方法的返回值.......  
            result = (String) serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0];  
            System.out.println(result);
        } catch (AxisFault e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
        
    
    }
}
View Code

Axis2 客户端调用需要引入 三个jar文件。

此时,我们能访问我们web服务的接口。运行main方法 输出 hello jack.

接下来,咱们新建一个比较简单的远程调用类。

package com.client;

import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

public class RemoteTest {
    
    /**
     * 方法二:利用AXIS2远程调用
     * @return
     */
    public String invokeRemoteMethod(){
        // 远程调用路径
        String endpoint = "http://localhost:8080/webServicePrj/services/HelloWorld?wsdl";
        String result = "call failed!";
        Service service = new Service();
        Call call = null;
        try {
                 call = (Call) service.createCall();
                 call.setTargetEndpointAddress(endpoint); 
                // 调用的方法名
                // call.setOperationName("sayHello"); 
                 QName opName = new QName("http://webService.com", "sayHello");
                 call.setOperationName(opName);
                 
             // 设置参数名(可不用设置)
                 call.addParameter("name",   // 参数名
                       XMLType.XSD_STRING, // 参数类型:String
                        ParameterMode.IN);  // 参数模式:'IN' or 'OUT'
                 
               // 设置返回值类型(可不用设置)
                 call.setReturnType(XMLType.XSD_STRING); // 返回值类型:String
                 String name = "Alexia";
                result = (String) call.invoke(new Object[] { name });// 远程调用
            } catch (ServiceException e) {
                e.printStackTrace();
         } catch (RemoteException e) {
                 e.printStackTrace();
        }
           
        return result;
    }
    
    public static void main(String[] args) {
        RemoteTest rt = new RemoteTest();
        String result = rt.invokeRemoteMethod();
        System.out.println(result);
    }

}
View Code

 

回调方法 Call 是Axis 自带的方法。

关于Axis2 的服务端发布,以及客户端的调用,内容分享就这些。有不明白或不合理之处还请各位小伙伴指点。

 

posted on 2016-11-16 13:51  苏铭客  阅读(911)  评论(0编辑  收藏  举报