Java远程通信技术Axis实战.docx
《Java远程通信技术Axis实战.docx》由会员分享,可在线阅读,更多相关《Java远程通信技术Axis实战.docx(65页珍藏版)》请在冰豆网上搜索。
Java远程通信技术Axis实战
前言
在Internet网络覆盖全球的今天,网络通信已经是当今软件开发过程中离不开的话题。
在常用的Windows、Liunx、Unix系统当中,大部分的网络数据传输都是使用TCP/IP、UDP/IP作为底层传输协议的,而HTTP协议就是基于TCP/IP协议而运行的超文本传送协议。
在JAVA高级开发语言中,陆续出现RMI、CORBA、JAX-RPC、JAX-WS、Axis、XFire、HTTPInvoker、Hessian、Burlap、JMX等远程通信架构去实现系统之间数据传送。
在“远程通信技术”的一系列文章中,本人将对上述复杂的JAVA远程通信技术作出归纳。
首先,在本篇文章中先对有着10多年历史的Axis进行介绍。
目录
一、Axis简介
二、Axis1.x实例
三、Web服务会话管理
四、自定义Handler
五、新一代SOAP引擎Axis2.x
六、AXIOM对象模型
七、Module模块独立化处理方式
八、异步调用Web服务
一、Axis简介
1.1Web服务的起源
Web服务是现今实现网络服务概念的趋势,它把基础架构建立于标准化的XML语言之上,能够使用一种与平台无关的方式对数据进行编码,其中SOAP与WSDL都遵从此标准化的XML编码规则。
SOAP(SimpleObjectAccessProtocol,简单对象访问协议)是一种轻量的、简单的、基于XML的协议,用于描述在服务过程中服务器端与客户端之间所交换的消息。
SOAP可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。
WSDL(WebServiceDefinitionLanguage,Web服务描述语言)是一种基于XML的协议,用于定义服务端与客户端之间的契约,描述Web服务的公共接口,列出Web服务进行交互时需要绑定的协议和信息格式。
Web服务采用WSDL语言描述该服务支持的操作和信息,运行时再将实际的数据以SOAP方式在服务端与客户端进行信息传递。
由于软件开发平台众多,当中存在不同的开发风格,当服务器端与客户端使用不同的开发工具时,数据转换成为复杂且关键的问题。
而SOAP与WSDL的主要特性之一在于它们都是可扩展的,且与开发平台无关。
为了建立统一的XML协议,微软、IBM、Sun、Oracle、BEA等多家软件开发商联合起来,组成了一个名为WS-I(WebServiceInteroperability)组织,由该组织制定WS-ReliableMessage、WS-Discovery、WS-Federation、WS-Coordination、WS-AtomicTransaction、WS-BusinessActivity、WS-Enumeration、WS-Eventing、WS-Management等一系列用于数据交换的规范。
1.2JAX-RPC、JAX-WS简介
JAX-RPC(JavaAPIforXML-basedRPC)是Java库中基于XML远程服务的一组标准API,它通过WSDL方式对所提供的服务进行描述,并以RPC的风格把SOAP信息进行公开,是Java库中最早对Web服务提供支持的一组API。
JAX-RPC1.0从其名称可以看出,最初的目的只是为了支持使用(RemoteProcedureCall,RPC)的XML远程过程调用操作,它以BP1.0(WS-I’sBasicProfile1.0)为基础,依赖于SAAJ1.2(SOAPwithAttachmentsAPIforJava)为规范,虽然支持SOAP协议,但对Web服务功能有一定的局限性。
于是在2003年底,开发团队对JAX-RPC1.0进行大幅修订,由Sun公司组织了一个专家组开始进行JAX-RPC2.0规范的开发。
JAX-RPC2.0是基于JAVA5而开发的,它依赖于Annotation等新特性,在JAX-RPC的基础上提供还增加了如异步回调,面向消息等新增技术。
JAX-RPC2.0以BP1.1(WS-I’sBasicProfile1.1)为基础,依赖于SAAJ1.3(SOAPwithAttachmentsAPIforJava)为规范,能使用SOAP1.1、SOAP1.2进行信息公开。
它是JAX-RPC1.1架构发展的成果,在开发完成后,JAX-RPC2.0被正式改名成为JAX-WS(JavaAPIforXML-WebServices)。
1.3Axis概述
Axis全称ApacheEXtensibleInteractionSystem(阿帕奇可扩展交互系统),它是一个SOAP引擎,提供创建Web服务的基本框架。
Axis1.x是基于JAX-RPC而实现一个工具包,它可以使用HTTP、JMS、SMTP等多种传输方式支持SOAP 。
Axis2.x是新一代的Axis引擎,它支持JAX-WS、JAX-PRC等API,并且在Axis1.x的基础上增加了灵活数据绑定、异步调用等新增功能,可使用SOAP1.1、SOAP1.2协议。
在服务请求上,Axis2.x支持三种请求-响应模式:
In-Only、Robust-In和In-Out,也可支持使用REST风格的开发方式。
基本的AxisWeb服务由四部分组成:
AxisServlet、Axis部署描述、远程服务接口、服务实现类。
AxisServlet是Axis的核心,它负责WSDL基础服务信息的公开,并把SOAP请求转化为Java方法的调用,最后把返回值转化为SOAP。
AxisServlet隐藏了构建Web服务的大量代码,使用开发人员不用直接与SOAP打交道便可轻松完成Web服务的开发。
Axis部署描述是一个XML文档,它用于管理Web服务的发布,决定哪些服务类需要通过SOAP对外公开。
远程服务接口并非必要的,但在很多的Web服务开发过程中都会使用远程服务接口用于对外暴露服务类的方法,在服务器端通过服务实现类去继承实现服务接口。
由于Axis1.x与Axis2.x有各自的特色,下面将分开来介绍。
回到目录
二、Axis1.x实例
2.1Axis1.x的下载与安装
Axis1.x可于官网http:
//axis.apache.org/axis/ 下载,完成下载后建立WebProject作为测试项目,把lib文件夹下的jar文件拷贝,引入到测试项目当中。
在web.xml文件下加入AxisServlet配置后,系统就会对以后缀为*.jws及路径为/services/*的请求进行监听,遇到此类请求时将把信息交由 org.apache.axis.transport.http.AxisServlet进行处理。
1
2Apache-Axis
3
4org.apache.axis.transport.http.AxisHTTPSessionListener
5
6
7Apache-AxisServlet
8AxisServlet
9
10org.apache.axis.transport.http.AxisServlet
11
12
13
--服务管理-->
14
15AxisAdminServlet
16AdminServlet
17
18org.apache.axis.transport.http.AdminServlet
19
20100
21
22
--对输入输出的SOAP信息进行检测-->
23
24SOAPMonitorService
25SOAPMonitorService
26
27org.apache.axis.monitor.SOAPMonitorService
28
29
30SOAPMonitorPort
315001
32
33100
34
35
36AxisServlet
37/servlet/AxisServlet
38
39
40AxisServlet
41*.jws
42
43
44AxisServlet
45/services/*
46
47
48SOAPMonitorService
49/SOAPMonitor
50
51
而SOAPMonitorService并非必要配置,但加入SOAPMonitorService配置,可以便于对服务运行时所传输的SOAP信息进行监听,在服务的requestFlow或responseFlow中加入SOAPMonitorHandler,系统就可显示服务请求和回发时的SOAP信息。
1//xml.apache.org/axis/wsdd/"
2xmlns:
java="http:
//xml.apache.org/axis/wsdd/providers/java">
3org.apache.axis.handlers.SOAPMonitorHandler">
4
56value="http:
//tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
7
8
9
10RPC">
11
12
13
14
15
16RPC">
17
18
19
20
21
22
23
24
25
26
2.2调用服务的三种方式
下面从最简单的HelloWorld开始,介绍Axis的使用方法。
首先在WEB-INF文件夹下建立server-config.wsdd文件,在Axis1.x当中,此文件正是用于管理服务发布的默认配置文件。
首先service用于定义对外暴露的服务,其中name属性用于定义服务的名称。
像下面例子,当name为PersonService时,对外暴露的服务路径则对应为http:
//localhost:
8080/axis.server/services/PersonService。
而parameter用于定义服务的相关属性,className表示此服务的实现类,而allowedMethods表示所公开的服务方法,“*"则默认为公开此类中的所有public公共方法。
而scope则是用于定义服务对象生成的方式,它包括三个选项:
request、session、application。
request是默认选择,表示为每个请求生成一个服务对象;
session表示对同一个客户代理对象所发送的请求使用同一个服务对象,并把服务信息放在同一个上下文当中。
当使用有状态服务时,使用此session更为合适,在下节将再作进一步介绍;
application类似于使用单体模式,表示所示的请求均使用同一个服务对象,当使用无状态服务时使用application能有效提高运行效率。
最后在transport中定义一个requestFlow处理类org.apache.axis.handlers.http.URLMapper,表示在系统接受到http请求时,将会调用URLMapper类来处理路径映射等问题。
1//xml.apache.org/axis/wsdd/"
2xmlns:
java="http:
//xml.apache.org/axis/wsdd/providers/java">
3
--在浏览器暴露服务PersonService-->
4RPC">
5
--绑定服务实现类型PersonServiceImpl-->
6
7
8
9
10
--当接收到http请求时交由URLMapper进行处理-->
11
12
13org.apache.axis.handlers.http.URLMapper"/>
14
15
16
PersonService服务代码如下,此时运行服务,输入路径http:
//localhost:
8080/axis.server/services/PersonService?
wsdl,浏览器上将显示此服务的wsdl信息。
1publicinterfaceIPersonService{
2StringHelloWorld(Stringname);
3}
4
5publicclassPersonServiceImplimplementsIPersonService{
6@Override
7publicStringHelloWorld(stringname){
8return"Hello"+name;
9}
10}
客户端的生成工具有多种,其中一种是使用Axis1.x中的自带生成器WSDL2Java,此生成器可以根据wsdl文件生成客户端。
首先在环境变量中把Axis_Home绑定到Axis1.x的根目录,在path加入设置 ".;%Axis_Home%\lib",然后输入
Javaorg.apache.axis.wsdl.WSDL2Javahttp:
//localhost:
8080/axis.server/services/PersonService?
wsdl-paxis.client.person
此时系统将在axis.client.person包内生成客户端代码类PersonServiceImpl、PersonServiceImplService、PersonServiceImplServiceLocator、PersonServiceSoapBindingStub。
PersonServiceImplServiceLocator用于实现PersonServiceImplService接口,它绑定了服务的名称,地址,端口等详细资料。
PersonServiceImpl用于定义服务的接口,而PersonServiceSoapBindingStub则是此服务代理,它通过SOAP协议把操作请求发送到服务器,并把返回信息转化为Java对象。
1publicstaticvoidmain(String[]args)throws
2RemoteException,MalformedURLException,ServiceException{
3//TODOAuto-generatedmethodstub
4HelloWorld();
5}
6
7privatestaticvoidHelloWorld()throws
8RemoteException,MalformedURLException{
9PersonServiceImplpersonService=newPersonServiceSoapBindingStub(
10newURL("http:
//localhost:
8080/axis.server/services/PersonService"),
11newPersonServiceImplServiceLocator());
12System.out.println(personService.helloWorld("Leslie"));
13}
通过系统自动生成的代理类就能简单地调用远程服务,这是因为在代理类中已经完成了大量关于PersonService服务的配置,但本人觉得想要深入地了解Axis的开发,就应该了解其内部的结构。
所以在下面例子当中将介绍如何使用Axis的内部机制直接调用Web服务。
在org.apache.axis.client中存在着服务的基础类Service,通过Service可用于管理服务的绑定地址,端点,获取服务的WSDL等详细信息。
另外Call类用于管理每个服务请求动作,它可以设置每个请求的方法,最后通过call.invoke(Object[])调用服务,并获取完成后的返回值。
1publicstaticvoidmain(String[]args)throws
2RemoteException,MalformedURLException,ServiceException{
3HelloWorld();
4}
5
6privatestaticvoidHelloWorld()throws
7ServiceException,RemoteException{
8//生成服务对象Service
9Serviceservice=newService();
10Callcall=(Call)service.createCall();
11//设置Endpoint地址
12call.setTargetEndpointAddress(
13"http:
//localhost:
8080/axis.server/services/PersonService");
14//绑定请求方法名称
15call.setOperationName("HelloWorld");
16//通过call.invoke调用服务,获取返回值
17Stringdata=(String)call.invoke(newObject[]{"Lesli