前段时间学了下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如何处理?