使用axis2进行WebService的开发
使用axis2进行WebService的开发
Apache Axis2 是 Apache Axis SOAP 项目的后继项目。此项目是 Web 服务核心引擎的重要改进,目标是成为 Web 服务和面向服务的体系结构(Service-Oriented Architecture,SOA)的下一代平台。
axis2 WebService开发分为服务端开发与客户端开发,服务端开发为对外提供服务,客户端开发为用户调用外部接口进行业务处理。
一、下载与安装
1.下载
下载地址:http://axis.apache.org/axis2/java/core/download.cgi
有以下下载列表:
Binary Distribution zip | MD5 | PGP
Source Distribution zip | MD5 | PGP
WAR Distribution zip | MD5 | PGP
Documents Distribution zip | MD5 | PGP
注:
axis2-1.6.2-bin.zip里有axis2的jar包。
axis2-1.6.2-docs.zip里有详细的帮助文档。
axis2-1.6.2-src.zip里是源代码。
axis2-1.6.2-war.zip里是axis的管理平台,放到tomcat可直接使用。
注:本文用bin包进行命令行使用axis2,管理平台使用的是war包。
2.安装配置
将axis2-1.6.2-bin.zip解压到本地目录D:\axis2-1.6.2
设置环境变量。【注:前提需要配置java环境变量】
AXIS2_HOME 设置值 D:\axis2-1.6.2
Path 添加值 %AXIS2_HOME%\bin
二、服务端编写
1.创建服务端的java项目testAsixServer。
编写类City与类User代码如下:
- package com.hsinghsu.model;
- public class City
- {
- private int cityCode;
- private String cityName;
- public int getCityCode()
- {
- return cityCode;
- }
- public void setCityCode(int cityCode)
- {
- this.cityCode = cityCode;
- }
- public String getCityName()
- {
- return cityName;
- }
- public void setCityName(String cityName)
- {
- this.cityName = cityName;
- }
- }
- package com.hsinghsu.model;
- public class User
- {
- private int id;
- private String name;
- private String password;
- private City city;
- public int getId()
- {
- return id;
- }
- public void setId(int id)
- {
- this.id = id;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public String getPassword()
- {
- return password;
- }
- public void setPassword(String password)
- {
- this.password = password;
- }
- public City getCity()
- {
- return city;
- }
- public void setCity(City city)
- {
- this.city = city;
- }
- }
编写服务类UserService。该服务类即为对外提供的服务,其中对外提供2个服务getUserById与getUserList,代码如下:
- package com.hsinghsu.service;
- import java.util.ArrayList;
- import java.util.List;
- import com.hsinghsu.model.User;
- public class UserService
- {
- public List<User> getUserList(User user)
- {
- List<User> list = new ArrayList<User>();
- return list;
- }
- public User getUserById(int id)
- {
- User user = new User();
- return user;
- }
- }
2.发布WebService服务
发布WebService服务方式可使用axis2管理平台发布,本文另添加使用soapUI发布WebService的测试服务。
2.1 axis2管理平台发布
2.1.1 部署axis2管理平台
将axis2-1.6.1-war.zip压缩包里面的axis2.war包解压到tomcat的webapps目录下,启动tomcat,访问地址http://127.0.0.1:8080/axis2/ ,即可访问axis2的Welcome!页面。
访问地址http://127.0.0.1:8080/axis2/services/listServices 另可访问服务列表。
2.1.2 部署开发服务
编译服务端项目testAsixServer后,将UserService.class文件放到tomcat\webapps\axis2\WEB-INF\pojo目录中【注:若没有pojo目录,则手动新建该目录】。
在浏览器地址栏中输入如下的URL:
http://127.0.0.1:8080/axis2/services/listServices 即可访问刷新后的服务列表。【注:POJO类不能使用package关键字声明包,若使用axis2管理平台发布,则需要修改UserService类,去掉package字段。】
【注:发布WebService的pojo目录只是默认的,如果想在其他的目录发布WebService,可以打开axis2/WEB-INF/conf/axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:
<deployer extension=".class" directory="mydir" class="org.apache.axis2.deployment.POJODeployer"/>】
访问 http://127.0.0.1:8080/axis2/services/UserService?wsdl 即可访问服务UserService的wsdl描述
【注:另可使用jar cvf命令将服务打成aar包后导入到axis2管理平台上使用。】
2.2 使用soapUI生成WAR发布WebService测试服务
2.2.1 由java生成wsdl文件
运用Java2wsdl生成wsdl文件
使用cmd命令,在命令行中输入:
java2wsdl -cn com.hsinghsu.service.UserService
【注:在testAsixServer项目的classes根目录下执行】
输出:
Using AXIS2_HOME: D:\axis2-1.6.2
Using JAVA_HOME: C:\Program Files\Java\jdk1.6.0_01
log4j:WARN No appenders could be found for logger (org.apache.axis2.util.Loader).
log4j:WARN Please initialize the log4j system properly.
结果:
生成UserService.wsdl文件
2.2.2 soapUI导出war包:
在soapUI导入UserService.wsdl文件。
通过soapUI生成MockService。
启动MockService,测试MockService时,在URL填写http://HSING-PC:8088/mockUserServiceSoap11Binding 后点击运行,查看是否有正确报文返回。
soapUI发送报文如下:
- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.hsinghsu.com">
- <soapenv:Header/>
- <soapenv:Body>
- <ser:getUserById>
- <!--Optional:-->
- <ser:id>2</ser:id>
- </ser:getUserById>
- </soapenv:Body>
- </soapenv:Envelope>
soapUI接收报文如下:
- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.hsinghsu.com" xmlns:xsd="http://model.hsinghsu.com/xsd">
- <soapenv:Header/>
- <soapenv:Body>
- <ser:getUserByIdResponse>
- <!--Optional:-->
- <ser:return>
- <!--Optional:-->
- <xsd:city>
- <!--Optional:-->
- <xsd:cityCode>001</xsd:cityCode>
- <!--Optional:-->
- <xsd:cityName>wh</xsd:cityName>
- </xsd:city>
- <!--Optional:-->
- <xsd:id>1</xsd:id>
- <!--Optional:-->
- <xsd:name>hsinghsu</xsd:name>
- <!--Optional:-->
- <xsd:password>123456</xsd:password>
- </ser:return>
- </ser:getUserByIdResponse>
- </soapenv:Body>
- </soapenv:Envelope>
在soapUI中导出war包,如testUser.war。
2.2.3 部署war包
将war包部署到tomcat目录下。【注:需要修改war包里面的WEB-INF/soapui/testUser-soapui-project.xml文件引用wsdl文件的路径】
启动tomcat,访问在war所在的路径如 http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding?WSDL ,即可查看wsdl描述文件
【注:可以使用soapUI测试接口,在soapUI测试中,URL中填写testUser.war的部署地址,如http://ip:port/testUser/mockUserServiceSoap11Binding ,点击运行,查看对应的接口是否有正确报文返回。】
三、客户端编写
Axis2支持以下4种类型的客户端:
i. Block(阻塞式客户端),即传统客户端。一旦服务被启用,客户端的应用程序将被挂起,直到operation被执行完毕(表现为收到一个response或fault),才能重新获得控制权。这是调用Web Service最简单的方式,并且这种方式适用于多数业务情形。
ii. Non block(非阻塞式客户端),即异步客户端。使用Non-Blocking API来调用这些Web Services。Axis2提供给用户一种基于回叫机制的non-blocking API,一旦服务被起用,客户端应用程序马上得到控制权,通过使用一个callback对象来获得response。这种方式使得客户端应用程序可以很方便的同步启用多个Web Service。
iii.双工(双向传输)。以上的机制都使用单一的连接去发送请求和接收响应.这都明显在性能上落后于使用两条连接(单向或双向)进行进行请求和响应的传输 . 因此以上的机制都不能解决长时间运行的交易, 连接将在操作还没完成就会超时. 一种解决方案是使用分开的两条传输连接来传输请求和响应 . 我们叫这种方案为传输层异步。
iv. 双工非阻塞(双向且非阻塞传输)。
注:axis2 webservice client端需要的jar包有:
- axis2-kernel-1.6.1.jar
- axis2-adb-1.6.1.jar
- axiom-api-1.2.12.jar
- commons-logging-1.1.1.jar
- wsdl4j-1.6.2.jar
- XmlSchema-1.4.7.jar
- axiom-impl-1.2.12.jar
- neethi-3.0.1.jar
- axis2-transport-local-1.6.1.jar
- axis2-transport-http-1.6.1.jar
- commons-httpclient-3.1.jar
- httpcore-4.0.jar
- commons-codec-1.3.jar
- mail-1.4.jar
1.传统客户端【阻塞式客户端的编写】
新建AsixBlockClient类,获取数据,代码如下:
- package com.hsinghsu.asix.client;
- 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.axis2.AxisFault;
- import org.apache.axis2.addressing.EndpointReference;
- import org.apache.axis2.client.Options;
- import org.apache.axis2.client.ServiceClient;
- /**
- *
- * Block(阻塞式客户端),即传统客户端调用WebService Axis2的底层API来调用WebService
- *
- * @author hsinghsu
- *
- */
- public class AsixBlockClient
- {
- private static EndpointReference targetEPR = new EndpointReference(
- "http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding");//接口地址
- public static void main(String[] args)
- {
- Options options = new Options();
- options.setAction("urn:getUserById");//调用接口方法
- options.setTo(targetEPR);
- ServiceClient sender = null;
- try
- {
- sender = new ServiceClient();
- sender.setOptions(options);
- OMFactory fac = OMAbstractFactory.getOMFactory();
- OMNamespace omNs = fac.createOMNamespace(
- "http://service.hsinghsu.com", "");
- OMElement method = fac.createOMElement("getUserById", omNs);
- OMElement name = fac.createOMElement("id", omNs);//设置入参名称
- name.setText("1");//设置入参值
- method.addChild(name);
- method.build();
- System.out.println("method:" + method.toString());// print:<getUserById xmlns="http://service.hsinghsu.com"><id>1</id></getUserById>
- OMElement response = sender.sendReceive(method);
- System.out.println("response:" + response);
- OMElement elementReturn = response.getFirstElement().getFirstElement().getFirstElement();
- System.out.println("cityCode:"+elementReturn.getText());
- }
- catch (AxisFault e)
- {
- System.out.println("Error");
- e.printStackTrace();
- }
- }
- }
执行结果如下:
- method:<getUserById xmlns="http://service.hsinghsu.com"><id>1</id></getUserById>
- response:<ser:getUserByIdResponse xmlns:ser="http://service.hsinghsu.com">
- <!--Optional:-->
- <ser:return>
- <!--Optional:-->
- <xsd:city xmlns:xsd="http://model.hsinghsu.com/xsd">
- <!--Optional:-->
- <xsd:cityCode>001</xsd:cityCode>
- <!--Optional:-->
- <xsd:cityName>wh</xsd:cityName>
- </xsd:city>
- <!--Optional:-->
- <xsd:id xmlns:xsd="http://model.hsinghsu.com/xsd">1</xsd:id>
- <!--Optional:-->
- <xsd:name xmlns:xsd="http://model.hsinghsu.com/xsd">hsinghsu</xsd:name>
- <!--Optional:-->
- <xsd:password xmlns:xsd="http://model.hsinghsu.com/xsd">123456</xsd:password>
- </ser:return>
- </ser:getUserByIdResponse>
- cityCode:001
2.使用RPC方法调用WebService
编写AsixRPCClient.java类,获取数据。注:添加User.java、City.java至项目中。
AsixRPCClient.java代码如下:
- package com.hsinghsu.asix.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;
- import com.hsinghsu.model.User;
- /**
- * 使用RPC方式调用WebService
- *
- * @author hsinghsu
- *
- */
- public class AsixRPCClient
- {
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception
- {
- // 使用RPC方式调用WebService
- RPCServiceClient serviceClient = new RPCServiceClient();
- Options options = serviceClient.getOptions();
- EndpointReference targetEPR = new EndpointReference(
- "http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding");// 指定调用WebService的URL
- options.setTo(targetEPR);
- Object[] opAddEntryArgs = new Object[]{new Integer(1)};// 指定getGreeting方法的参数值
- Class[] classes = new Class[]{User.class};// 指定getGreeting方法返回值的数据类型的Class对象
- QName opAddEntry = new QName("http://service.hsinghsu.com",
- "getUserById");// 指定要调用的getGreeting方法及WSDL文件的命名空间
- Object[] objects = serviceClient.invokeBlocking(opAddEntry,
- opAddEntryArgs, classes);// RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
- System.out.println(" objects size-->:" + objects.length);
- if (objects.length >= 1)
- {
- User user = new User();
- user = (User) objects[0];
- System.out.println("==" + user.getId() + " ==" + user.getName()
- + " ==" + user.getCity().getCityName());
- }
- }
- }
运行结果:
objects size-->:1[Ljava.lang.Object;@ba5c7a
==1 ==hsinghsu ==wh
3.使用Stub方式调用WebService
运用wsdl2java简化客户端,使用Stub方式调用WebService
3.1 生成STUB文件。
在cmd中用 wsdl2java生成stub文件。注:在wsdl文件目录下执行
输入:
wsdl2java -uri UserService.wsdl
【注:默认adb生成方式,同步生成方式,加参数-a则使用异步生成】
输出:
Using AXIS2_HOME: D:\axis2-1.6.2
Using JAVA_HOME: C:\Program Files\Java\jdk1.6.0_01
Retrieving document at 'UserService.wsdl'.
log4j:WARN No appenders could be found for logger (org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder).
log4j:WARN Please initialize the log4j system properly.
结果:
生成build.xml、UserServiceStub.java、UserServiceCallbackHandler.java文件
3.2 编写同步调用函数
编写AsixServiceStub类,获取数据。
AsixServiceStub.java代码如下:
- package com.hsinghsu.asix.client;
- import com.hsinghsu.service.UserServiceStub;
- import com.hsinghsu.service.UserServiceStub.GetUserById;
- import com.hsinghsu.service.UserServiceStub.User;
- /**
- * 利用axis2插件生成客户端方式调用 wsdl2java简化客户端的编写
- *
- * @author hsinghsu
- *
- */
- public class AsixServiceStub
- {
- public static void main(String[] args) throws Exception
- {
- UserServiceStub stub = new UserServiceStub();
- GetUserById guid = new GetUserById();
- guid.setId(1);
- User user = stub.getUserById(guid).get_return();// 同步调用方式
- if (null != user)
- {
- System.out.println("==" + user.getId() + " ==" + user.getName()
- + " ==" + user.getCity().getCityName());
- }
- else
- {
- System.out.println("user null");
- }
- }
- }
运行结果:
==1 ==hsinghsu ==wh
注:添加UserServiceStub.java、UserServiceCallbackHandler.java文件至项目中,注意修改UserServiceStub.java类中服务的地址。
注:若需要使用异步调用,则需创建异步回调类AsynCallback,该类需要继承UserServiceCallbackHandler抽象类,实现回调函数receiveResultgetUserById接口。在AsixServiceStub中,只需要使用stub.startgetUserById(guid, new AsynCallback());执行即可。
使用axis2进行WebService的开发的更多相关文章
- Java借助axis2发布WebService
Webservice: 1.Xml: 2.WSDL: Web service描述语言(WSDL)就是这样一个基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web service及其函数.参 ...
- 使用Axis2实现WebService的发布和调用
一.Axis2的下载和安装 1.可从http://ws.apache.org/axis2/ 下载Axis2的最新版本: 可以下载如下三个zip包: axis2-1.7.3-bin.zip(用 ...
- 用AXIS2发布WebService的方法
Axis2+tomcat6.0 实现webService 服务端发布与客户端的调用. 第一步:首先要下载开发所需要的jar包 下载:axis2-1.6.1-war.zip http://www.apa ...
- axis2之webservice
Axis2之webservice超详细教程 Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的 ...
- Axis2创建WebService服务端接口+SoupUI以及Client端demo测试调用
第一步:引入axis2相关jar包,如果是pom项目,直接在pom文件中引入依赖就好 <dependency> <groupId>org.apache.axis2</gr ...
- tomcat 用AXIS2发布WebService 网站的方法
Axis2+tomcat7.0 实现webService 服务端发布与客户端的调用. Aixs2开发webService的方法有很多,在此只介绍一种比较简单的实现方法. 第一步:首先要下载开发所需要的 ...
- WebService的开发手段
一.WebService的开发手段 目前有关webService的开发手段有2种 1.JDK开发(jdk必须是1.6及以上版本,因为jdk是在1.6版本中引入并支持webservice开发的); 2. ...
- ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器
ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器一:闲谈一下:1.现在任务跟踪管理系统已经开发快要结束了,抽一点时间来写一下,想一想自己就有成就感啊!! ...
- Vmware Vsphere WebService SDK开发(第一讲)-基本知识学习
刚开始这方面开发的时候,不知道如何下手,能够查到的资料特别少,而且看到很多网友和我一样也在找这方面的资料.接下来的一段时间我就结合自己所参与的项目,完成关于Vmware Vsphere WebServ ...
随机推荐
- JavaScript中url 传递参数(特殊字符)解决方法及转码解码的介绍
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码 十六进制值 1. + URL 中+号表示空格 %2B 2. 空 ...
- 前端 velocity(.vm)模板里写ajax出现解析异常
异常信息:Caused by: org.apache.velocity.exception.ParseErrorException: Encountered "{" at dist ...
- linux 6 网卡名称修改
转自:http://blog.csdn.net/tianlesoftware/article/details/8737700 一.问题说明 测试环境中出现的小问题,因为虚拟机之间经常复制来复制去,导致 ...
- (三十六)类数组对象arguments
类数组对象:arguments 在函数调用时,我们总能见到arguments这个对象,它具体是用来干什么的呢?感觉逼格非常高呢 函数在使用时,我们总会位函数传入各种参数,arguments会将参数储存 ...
- [转载] 视音频数据处理入门:RGB、YUV像素数据处理
===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...
- 牛客国庆集训派对Day1:J:Princess Principal(栈模拟求括号匹配)
题目描述 阿尔比恩王国(the Albion Kingdom)潜伏着一群代号“白鸽队(Team White Pigeon)”的间谍.在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没 ...
- SqlServer 数据库负载均衡【转】
负载均衡集群是由一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,由路由器衔接在一起,各节点相互协作.共同负载.均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器. 1. ...
- 实体对象,List泛型 转换为DataTable
/// <summary> /// 实体对象转换DataTable /// </summary> /// <param name ...
- java 执行JavaScript 以及容器化的问题
1. 可选方案 a. jdk 6 开始内置的Rhino 引擎 b. jdk8 替换的nashorn (性能高,对于ECMA 支持更好) c. java 版的nodejs vertx.i ...
- MD5中Java和Js配套实现
MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现.将数据(如汉 ...