`

Axis2实现WebService实例

阅读更多
Web Service是实现SOA(Service-Oriented Architecture)面向服务架构的技术,而Axis2是实现Web Service的一种技术框架(架构)。

先去apache官网上下载axis2-1.6.2-bin和axis2-1.6.2-war
下载地址:http://axis.apache.org/axis2/java/core/download.cgi


配置AXIS2的环境变量
将axis2-1.6.2-bin.zip解压
在环境变量里面配置AXIS2_HOME指向你的axis路径就行了。

解压axis2-1.6.2-war并将解压出来的axis2.war解压到tomcat的webapps中

访问:http://localhost:8082/axis2/端口自己改成自己的tomcat的端口就行了,
看到Welcome!就说明成功了。

WebService发布方式
我们先打开axis2\WEB-INF\conf下的axis2.xml。
有一段配置:
 <parameter name="hotdeployment">true</parameter>
 <parameter name="hotupdate">false</parameter>


hotdeployment 是热发布,就是不需要重新启动Tomcat就可以自动发布WebService。
但不等于更新了该webService,如果你想更新,还得重新启动Tomcat,这对于我们程序员来说,非常不方便,下面这个配置都解决了这个问题:hotupdate热更新,默认为false 改为true即可。

1.无包路径的发布方式:
public class TestService {
	public String getName(String name){
		return name;
	}
	public String helloWorld(){
		return "hello world!";
	}
}

将TestService 编译得到.class文件后,将class文件放到webapps\axis2\WEB-INF\pojo
中去,如果pojo不存在则创建它。
这样我们就将这个Service发布上去了。
在浏览器输入:http://localhost:8082/axis2/services/listServices 见下图:



红框中则是我们发布的Webservice。
输入以下url:
http://localhost:8082/axis2/services/TestService/getName?name=xxx

<ns:getNameResponse>
  <return>xxx</return>
</ns:getNameResponse>


http://localhost:8082/axis2/services/TestService/helloWorld

<ns:helloWorldResponse>
  <return>hello world!</return>
</ns:helloWorldResponse>


pojo是axis2默认的目录:
  <deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/>


你可以添加你想要的目录:
  <deployer extension=".class" directory="xxx" class="org.apache.axis2.deployment.POJODeployer"/>

但是这些目录中的类不要重复,不然要报错。

2.有包路径的发布方式:

显然,不带包的发布方式肯定不满足我们的需求。 为此,Axis2也允许将带包的POJO类发布成WebService,见例子:

1) 首先我们编写一个带包的POJO类:

package com.jynine.webservice;

public class AxisService {
	public String sayHello(){
		return "hello";
	}
	public String saygoodBye(String name){
		return "Good Bye "+name +"!";
	}
	public void updateName(String name){
			System.out.println("Update "+name+" !");
	}

}


2)  编写一个services.xml,这个文件需要放在META-INF目录中。

<!-- axis 配置 -->
<service name="AxisService">  
	    <description>  
	        Web Service例子  
	    </description>  
	    <parameter name="ServiceClass">  
	        com.jynine.webservice.AxisService  
	    </parameter>  
	    <messageReceivers>  
	        <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>  


在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。
  例如,sayHello方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,
  而updateName方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

  使用这种方式发布WebService,我们需要将这2个文件打包成.aar文件

目录结构:
- test
   - META-INF
     - services.xml
   - com
   - jynine
     - webservice
       - AxisService.class


在cmd中进入到test的目录,输入以下命令:
   jar cvf test.aar .
ps:注意上面命令中后面的.
最后将 test.aar文件复制到\webapps\axis2\WEB-INF\services目录中,
  启动Tomcat后,就可以调用这个WebService了。
如果你有多个service的话,则需要用<serviceGroup>
<serviceGroup>
        <service name="AxisService">  
	    <description>  
	        Web Service例子  
	    </description>  
	    <parameter name="ServiceClass">  
	        com.jynine.webservice.AxisService  
	    </parameter>  
	    <messageReceivers>  
	        <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 name="SimpleAxisService">  
	    <description>  
	       	 简单的axis服务
	    </description>  
	    <parameter name="ServiceClass">  
	        com.jynine.webservice.SimpleAxisService  
	    </parameter>  
	    <messageReceivers>  
	        <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>  
</serviceGroup>


客户端调用webservice

先建立一个简单的pojo类:
package com.jynine.webservice;

import java.util.HashMap;
import java.util.Map;
/**
 * Axis webService 例子
 * @author jynine
 *
 */
public class EmployeeInfo {
	private Map<String, String> map = new HashMap<String, String>();
	/**
	 * 初始化
	 */
	private void initEmployee(){
		map.put("1000", "Tom");
		map.put("1001", "Jim");
		map.put("1002", "Rose");
		map.put("1004", "Jack");
	}
	/**
	 * 获取员工名称
	 * @param num 工号
	 * @return
	 */
	public String getEmployeeName(String num){
		initEmployee();
		String name = "未知";
		if(map.get(num) != null){
			name = map.get(num);
		}
		return name;
	}
	/**
	 * 更新员工信息
	 * @param num 工号
	 * @param name 员工姓名
	 */
	public void updateEmployee(String num,String name){
		initEmployee();
		map.put(num, name);
	}
	/**
	 * 删除员工信息
	 * @param num 工号
	 */
	public void deleteEmployee(String num){
		initEmployee();
		map.remove(num);
	}
}

发布该webService并能成功调用。编写客户端代码调用:
package com.jynine.webservice;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMNode;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

public class AxisClient {
	/**
	 * 指定调用WebService的URL  
	 */
    private static EndpointReference targetEPR = 
        new EndpointReference("http://localhost:8082/axis2/services/EmployeeInfo");
    public static OMElement getNameByNum(String num){
    	OMFactory fac = OMAbstractFactory.getOMFactory();
    	OMNamespace namespace = fac.createOMNamespace("http://webservice.jynine.com", "tns");
    	OMElement method = fac.createOMElement("getEmployeeName", namespace);
    	OMElement value = fac.createOMElement("num", namespace);
    	OMNode omNode = fac.createOMText(value, num);
    	value.addChild(omNode);
    	method.addChild(value);
    	return method;
    }
    public static void main(String[] args) {
		//ServiceClient
        try {
        	OMElement getName = getNameByNum("1000");
        	Options options = new Options();
            options.setTo(targetEPR);
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
            ServiceClient sender = new ServiceClient();
            sender.setOptions(options);
        	OMElement result = sender.sendReceive(getName);
        	String response = result.getFirstElement().getText();
        	System.out.println("员工名称为:"+response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

http://localhost:8082/axis2/services/EmployeeInfo是你的Service EPR路径。
http://webservice.jynine.com这个是你访问http://localhost:8082/axis2/services/EmployeeInfo?wsdl后的那个targetNamespace。

输出结果为:
员工名称为:Tom


也可以用RPC方式调用WebService

   public static void main(String[] args) throws AxisFault {
    	 //  使用RPC方式调用WebService          
	    RPCServiceClient serviceClient = new RPCServiceClient();  
	    Options options = serviceClient.getOptions();  
	    //  指定调用WebService的URL  
	    options.setTo(targetEPR);  
	    //  指定getEmployeeName方法的参数值  
	    Object[] opAddEntryArgs = new Object[] {"1001"};  
	    //  指定getEmployeeName方法返回值的数据类型的Class对象  
	    Class[] classes = new Class[] {String.class};  
	    //  指定要调用的getEmployeeName方法及WSDL文件的命名空间  
	    QName opAddEntry = new QName("http://webservice.jynine.com", "getEmployeeName");  
	    //  调用getEmployeeName方法并输出该方法的返回值  
	    System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);  
    }


ps:当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

输出结果为:Jim
wsdl2java
也可以根据wsdl2java来简化我们客户端
在cmd中输入
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -s -o generator

则在你的当前目录下就会生成一个generator目录,在generator\src\com\jynine\webservice中就会找到一个EmployeeInfoStub.java
我们就可以用这个类来编写客户端:
  public static void main(String[] args) throws RemoteException {
    	 EmployeeInfoStub stub = new EmployeeInfoStub();  
         EmployeeInfoStub.GetEmployeeName gg = new EmployeeInfoStub.GetEmployeeName();  
         gg.setNum("1002");
         System.out.println( stub.getEmployeeName(gg).get_return());    
    }


输出结果为:Rose
代码是不是简单多了。
用adb生成客户端:
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d adb -s -o generator

同理还有xmlbeans:
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d xmlbeans -s -o generator

JiBX:

%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d jibx -s -uw -o  generator


axis2相关的包的maven配置http://jynine.iteye.com/blog/1893677
  • 大小: 36.6 KB
分享到:
评论

相关推荐

    eclipse+axis2=webservice实例-亲测

    eclipse+axis2学习webservice实例,亲测!

    基于axis2实现的webservice简单实现(客户端+服务端)。

    【标题】中的“基于axis2实现的webservice简单实现(客户端+服务端)”表明了本文将探讨如何使用Apache Axis2框架来创建和消费Web服务。Apache Axis2是Apache软件基金会开发的一个Web服务引擎,它提供了高效且灵活的...

    webService—Axis实例webService—Axis实例webService—Axis实例

    webService—Axis实例webService—Axis实例webService—Axis实例webService—Axis实例webService—Axis实例webService—Axis实例webService—Axis实例

    Axis实现webservice完整实例

    ** Axis 实现 WebService 完整实例** 在 IT 领域,Web 服务是一种用于应用程序之间进行通信的标准协议,而 Axis 是一个流行的开源 Java 框架,它允许开发者轻松地创建和部署 Web 服务。本实例将详细介绍如何使用 ...

    axis2发布webservice和调用axis2服务接口

    1. **创建WebService**:在Axis2中,可以通过编写一个简单的Java类并暴露其方法作为Web服务接口。这个类通常会遵循SOAP协议,定义服务操作。例如,你可以创建一个名为`HelloWorldService`的类,包含一个`sayHello`...

    axis2技术webservice实例

    使用axis2技术编写的webservice接口实例,直接放在应用服务器下便可使 用http://localhost:xxxx/axis2/service/来访问WSDL 业务源代码位于\WEB-INF\classes\HelloWorld.java

    java实现webservice实例.doc

    在Java中实现WebService实例需要使用到Apache Axis工具。Axis是一个开源的WebService实现框架,提供了一个完整的WebService解决方案。它支持SOAP、WSDL和UDDI等WebService标准协议。 下面是使用Java实现WebService...

    axis2webservice接口例子

    标题中的“axis2webservice接口例子”指的是使用Apache Axis2框架创建的一个Web服务接口实例。Apache Axis2是Java平台上的一款强大的Web服务开发工具,它提供了高效、灵活且可扩展的环境来构建和部署Web服务。这个...

    详解axis调用webservice实例

    标题中的“详解axis调用webservice实例”表明我们将探讨如何使用Apache Axis库来调用Web服务。Apache Axis是一个开源工具,它允许Java开发者创建、部署和使用Web服务。在这个实例中,我们会有机会看到实际的Java代码...

    axis2实现webservice请求

    在 Axis2 中实现 WebService 请求涉及以下步骤: 1. **环境设置**:首先,你需要在你的项目中引入 Axis2 相关的 jar 包。这些 jar 包通常包括 Axis2 的核心库、XML 解析器、依赖的 Servlet API 等。在提供的资源包...

    axis2发布webservice各种方式实例

    这里,`myWebService`是你的Web服务实现,`axisConfig`用于指定Axis2的配置,而`springService`负责加载Spring配置并注册Web服务。 - **运行和测试**:完成上述配置后,启动Spring容器,Axis2会自动发现并发布Web...

    axis2 webservice 实例

    标题中的“Axis2 WebService 实例”指的是使用Apache Axis2框架创建和使用的Web服务示例。Apache Axis2是Java平台上一个强大的Web服务引擎,它允许开发者轻松地构建和部署Web服务。这个实例可能是为了帮助开发者理解...

    基于Axis2的WebService的实例demo(包含jar包)

    **基于Axis2的WebService实例详解** 在Web服务领域, Axis2是Apache软件基金会开发的一个用于构建和部署Web服务的开放源代码平台。它提供了一种高效、灵活且可扩展的框架,使得开发者能够轻松地创建和消费Web服务。...

    axis2开发webservice

    在描述 "在 Eclipse 上使用 Axis2 编辑 WebService 和发布 WebService" 中,我们可以理解到,开发者将通过 Eclipse 这个流行的 Java IDE 来实现 WebService 的开发工作。Eclipse 提供了 Axis2 插件,使得开发者可以...

    axis调用webservice实例,包含jar包

    标题中的“axis调用webservice实例”涉及到的是在Java开发中使用Apache Axis库来调用Web服务的过程。Apache Axis是一个开放源代码的SOAP栈,它允许开发者创建和部署Web服务,同时也提供了客户端工具来调用这些服务。...

    axis2_WebService_开发指南

    总而言之,Axis2_WebService_开发指南涵盖了从基础准备到实例演示,再到高级特性的使用,为开发者提供了一套完整的Axis2 WebService开发教程。通过这个指南,开发者可以快速上手Axis2的使用,以及深入理解和应用其在...

    axis2发布webservice和调用实例

    - "51CTO下载-Axis2 WebService手册.doc":这份文档可能提供了关于Axis2 Web服务的详细步骤,包括环境配置、服务发布、客户端调用等,是初学者的良好指南。 - "服务端":可能包含服务端的源码或配置文件,供学习者...

    axis2客户端调用webService接口,精简jar包

    本文将深入探讨如何使用Axis2客户端调用WebService接口,并且会特别关注如何精简所需的jar包。 首先,了解Axis2客户端的基本概念是至关重要的。Axis2客户端是用于与远程Web服务交互的工具,它允许开发者通过SOAP...

    axis2 webservice 实例(包括服务端代码及客户端代码)

    标题中的“Axis2 WebService 实例”是指一个用于学习和实践Web服务开发的项目,它基于Apache Axis2框架。Apache Axis2是Java平台上的一个Web服务引擎,专门用于构建和部署Web服务。这个实例提供了服务端和服务端所需...

Global site tag (gtag.js) - Google Analytics