AXIS2 + Tomcat + Eclipse示例搭建过程

前段时间学了下axis2,搭建了一个简单的环境,在此列出实现过程:

1.下载安装axis2,设置AXIS2_HOME环境变量。

a) 下载axis2:
  地址:http://axis.apache.org/axis2/java/core/download.cgi
  b) 下载开发相关tools, Eclipse插件:
  地址:http://archive.apache.org/dist/ws/axis2/tools/
  下载和axis2匹配版本的插件axis2-eclipse-codegen-wizard.zip和axis2-eclipse-service-archiver-wizard.zip  
解压后拷贝至eclipse\plugins。
  c) 下载WAR (Web Archive) Distribution.zip,里面是打包好的web工程axis2.war,放到tomcat/webapp下,
  启动tomcat,即会自动解压,将解压后的项目重命名为axis2_server(个人喜好,可不用重命名),作为服务端,
    删掉axis2.war。

2.成wsdl文件命令:

    在%AXIS2_HOME%/bin下,新建一个文本文档,输入以下命令,保存后命名为generate_wsdl.bat。
  双击该文件即可生成wsdl文件于%AXIS2_HOME%/bin/generateCode/wsdl下
    命令:【%AXIS2_HOME%/bin/java2wsdl -cp . -cn com.sky.axis2.service.UserService 
   
  -of userservice.wsdl -o %AXIS2_HOME%/bin/generateCode】
    -cn 输入Class名,包含Package的定义。
      -cp 输入Class路径名,准确说是Class所在package的路径。
      -o 输出路径名,即生成的wsdl文件所在的路径;不指定则为用户的主目录。
      -of 输出文件名(含wsdl后缀),没有定义,则以类名命名。
      -tn 设置targetNamespace
      
        “-cp . -cn com.sky.axis2.service.UserService” -cp后的点和-cn中间有一空格,“-cp .”
        表示目标文件(用于生成代码的服务类.class文件)class路径为当前目录,相当于当前目录为java工程的classes目录,
        目标文件有包路径的,要建立相应的文件夹层次。 
   


3.根据wsdl生成服务端代码:
    在%AXIS2_HOME%/bin下,新建一个文本文档,输入以下命令,保存后命名为generate_server.bat。
  双击该文件即可生成服务端代码于%AXIS2_HOME%/bin/generateCode/server下    
  命令:【%AXIS2_HOME%/bin/wsdl2java -uri %AXIS2_HOME%/bin/generateCode/wsdl/userservice.wsdl 
  -p com.sky.axis2.service -d xmlbeans -s -ss -sd -ssi -o %AXIS2_HOME%/bin/generateCode/server

     在%AXIS2_HOME%/bin/generateCode/server下会生成文件为:src|resources|build.xml。
  
     -d <databinding>   指定databingding
     -p <pkg>    指定代码的package名称
     -d <databinding>   指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri
     -s      生成同步模式的代码
     -S     为生成的源码指定存储路径
     -ss       生成服务端代码 默认不生成
     -sd       生成服务端描述文件services.xml,仅与-ss一同使用
     -ssi      为服务端实现代码生成接口类
     -o <path>  指定生成代码的输出路径
     
    生成的代码在 D:\04practice\axis2-1.6.2\bin下的结构为:
       -|src             服务端代码
                         放到3中提到的axis2_server/src下
        |resources       services.xml及UserService.wsdl和命令中指定的xmlbeans相关文件。

4.根据wsdl文件生成客户端代码,测试服务:
    在%AXIS2_HOME%/bin下,新建一个文本文档,输入以下命令,保存后命名为generate_client.bat。
  双击该文件即可生成服务端代码于%AXIS2_HOME%/bin/generateCode/client下    
  命令:【%AXIS2_HOME%/bin/wsdl2java -uri %AXIS2_HOME%/bin/generateCode/wsdl/userservice.wsdl
  -p com.sky.axis2.client -d xmlbeans -s -o %AXIS2_HOME%/bin/generateCode/client

  在%AXIS2_HOME%/bin/generateCode/client下会生成文件为:src|resources|build.xml
 
5.修改服务端代码,实现具体业务逻辑->发布服务:
    a) 新建java工程:新建一个java工程axis2Server,将生成的服务端代码(src|resources|build.xml)拷贝到工程相应目录下。 引入axis的jar包。
  生成的代码中,在build path中加上resources, 这样resources下文件就会随java类被编译到bin目录下,因为服务调用会用到resources下的文件。
    b) 实现服务业务逻辑:在生成代码中,找到服务类XXXSkeleton.java,如com.sky.axis2.service.UserServiceSkeleton.java。
    实现queryUserName服务方法的具体业务逻辑。
    c) 打包工程为aar: 以eclipse为例,在工程中找到build.xml,直接右键 Run as -> Ant Build,则在工程根目录下
  会打包生成一个build文件夹,build/lib下有我们需要的aar文件。如:UserService.aar。
    d) 发布服务:将UserService.aar拷贝至%CATALINA_HOME%/webapps/axis2_server/webapp/WEB-INF/services下,
  将axis2Server/bin下相应class文件都拷贝至%CATALINA_HOME%/webapps/axis2_server/webapp/WEB-INF/classes下。
  启动tomcat,访问相应地址,查看服务是否发布成功。
 
6.写客户端访问程序:
  a) 新建工程axis2Client,将生成的客户端代码拷贝到工程相应目录下。 引入axis的jar包。同server端,将resources和src都在build path中指定,
这样resources下文件就会随java类被编译到bin目录下,因为服务调用会用到resources下的文件。
  b) 写客户端测试代码,测试服务调用结果。
  
 

UserServiceSkeleton.java

/**
 * UserServiceSkeleton.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: 1.6.2  Built on : Apr 17, 2012 (05:33:49 IST)
 */
package com.sky.axis2.service;

/**
 * UserServiceSkeleton java skeleton for the axisService
 */
public class UserServiceSkeleton implements UserServiceSkeletonInterface {

	/**
	 * Auto generated method signature
	 * 
	 * @param queryUserMap0
	 * @return queryUserMapResponse1
	 */

	public com.sky.axis2.service.QueryUserMapResponseDocument queryUserMap(
			com.sky.axis2.service.QueryUserMapDocument queryUserMap0) {
		// TODO : fill this with the necessary business logic
		throw new java.lang.UnsupportedOperationException("Please implement "
				+ this.getClass().getName() + "#queryUserMap");
	}

	/**
	 * Auto generated method signature
	 * 
	 * @param queryUserName2
	 * @return queryUserNameResponse3
	 */

	public com.sky.axis2.service.QueryUserNameResponseDocument queryUserName(
			com.sky.axis2.service.QueryUserNameDocument queryUserName2) {
		System.out.println(">>>>>>>receive request!");
		/* 服务响应文档(命令生成),其实例由其内部的工厂类Factory生成。  */
		QueryUserNameResponseDocument responseDocument = QueryUserNameResponseDocument.Factory.newInstance();
		/* 服务响应类(命令生成),其名称一般为服务方法名+Response。其实例从服务响应文档对象调用addXXX方法得到。 */
		QueryUserNameResponseDocument.QueryUserNameResponse queryResponse = responseDocument.addNewQueryUserNameResponse();
		/* 根据请求参数,实现具体业务逻辑,组装返回对象字符串。 */
		String xreturn = String.format("userName - %s", queryUserName2.getQueryUserName().getUserId());
		queryResponse.setReturn(xreturn);
		/* 将服务响应对象添加到服务响应文档中 */
		responseDocument.setQueryUserNameResponse(queryResponse);
		return responseDocument;
	}

}


UserServiceStubTest.java

package com.sky.axis2.client;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;

import com.sky.axis2.service.QueryUserNameDocument;
import com.sky.axis2.service.QueryUserNameResponseDocument;

public class UserServiceStubTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			/* 根据wsdl文件,用命令wsdl2java生成的客户端代码中,服务地址端口默认为 8080 */
			UserServiceStub userServiceStub = new UserServiceStub("http://localhost:8090/axis2_server/services/UserService");
			/* QueryUserNameDocument为服务方法文档(命令生成),其实例由其内部的工厂类Factory生成。 */
			QueryUserNameDocument queryDocument = QueryUserNameDocument.Factory.newInstance();
			/* QueryUserName为服务方法参数类(命令生成),其名称和服务方法一样。其实例从服务方法文档对象调用addXXX方法得到。  */
			QueryUserNameDocument.QueryUserName queryUserName = queryDocument.addNewQueryUserName();
			/* 设置查询参数userId */
			String userId = "ZhangSan";			
			queryUserName.setUserId(userId);
			queryDocument.setQueryUserName(queryUserName);
			/* 调用服务方法,从服务响应文档对象中获取响应对象,再调用getReturn()得到结果  */
			QueryUserNameResponseDocument responseDocument = userServiceStub.queryUserName(queryDocument);
			System.out.println(String.format(">>>>>>>>接口参数为:%s \n调用结果为:%s", 
					userId,	responseDocument.getQueryUserNameResponse().getReturn()));
		} catch (AxisFault e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		
	}

}



TODO: 多个服务.aar时,services.xml如何处理? 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值