`

使用axis开发webservice

阅读更多

1 介绍

本文并不是想介绍Web服务的原理、系统架构等,我们假设您已经了解了关于Web服务的一些基本的概念、原理等知识。本文主要是针对那些已经了解Web服务概念,但是还没有亲身体会Web服务所带来令人欢欣鼓舞的特征的开发人员。在此我们认为你已经具备了Java、XML等基础知识,如果你还有其他开发环境的经验例如VB、VC那是再好不过的了。


1.1 Web服务
虽然我们并不想详细讲述Web服务的体系结构,但是大概的介绍一下还是有必要的。Web服务是一种新型的Web应用程序。不同于其他Web应用程序,它是自适应、自我描述、模块化的应用程序,并可以跨越Web进行发布、定位以及调用。简单的Web服务可以提供例如天气预报或者航班信息的服务。一旦部署了Web服务,其他的应用程序就可以发现和调用所部署的服务。


1.2 AXIS项目
Axis框架来自 Apache 开放源代码组织,它是基于JAVA语言的最新的 SOAP 规范(SOAP 1.2)和 SOAP with Attachments 规范(来自 Apache Group )的开放源代码实现。有很多流行的开发工具都使用AXIS作为其实现支持Web服务的功能,例如JBuilder以及著名的Eclipse J2EE插件Lomboz。AXIS的最新版本是1.1,可以从http://ws.apache.org/axis/index.html下载。下图是AXIS核心引擎的体系结构图:

整个AXIS项目包括以下几个部分:

1. 消息流子系统

消息流子系统提供了灵活的消息传递框架,这个消息传递框架包括处理程序、链、序列化程序和反序列化程序。处理程序是一个处理请求、响应和故障流的对象。处理程序可被组合在一起成为链,而且可以使用一个灵活的部署描述符来配置这些处理程序的顺序。

2. 传输框架子系统

提供了一个传输框架,这个传输框架可以帮助您创建自己的可插式传输发送器和传输侦听器。

3. 数据编码子系统

AXIS完全按照 XML Schema 规范提供各种数据类型的自动序列化,并且提供功能扩展接口来使用您自己定制的序列化器和反序列化器。

4. 其他

AXIS完全支持 WSDL 以及日志记录、出错以及故障处理机制。它同时提供一些工具用来讲WSDL文档转换成客户端的调用框架以及根据类来产生WSDL定义文档。

AXIS目前版本支持的标准是:W3C SOAP 1.1 和 1.2;WSDL 1.1;SAAJ 1.1(SUN公司:SOAP with Attachments API for Java);JAX-RPC(SUN公司:Java API for XML-Based RPC)1.0。
2 Axis使用
2.1 Axis运行需要哪些jar文件

对Axis解包后,将axis-1_1/webapps/axis/WEB-INF/lib/目录下的jar文件复制到/usr/local/apache/htdocs/WEB-INF/lib目录下(Web应用程序的目录)。应包括以下jar文件。

axis-ant.jar
axis.jar
commons-discovery.jar
commons-logging.jar
jaxrpc.jar
log4j-1.2.8.jar
saaj.jar
wsdl4j.jar


2.2 Axis使用注意事项


2.2.1 获取WSDL文件
Axis支持用户通过网络方式,从已发布WEB服务的机器上获取WEB服务描述文件WSDL。用户只需简单在IE地址栏输入如下格式访问链接即可:

http://webappIp[/webapp]/services/WebServiceName?wsdl

其中:
webAppIp:运行WEB服务机器的地址。
[/webapp]:运行Axis WEB服务的Web应用名;如果应用使用跟目录,则不需要
services/WebServiceName:WEB服务定位路径,类似Servlet路径;其中WebServiceName为定义的Web服务接口名称。

用户将访问获的文件直接保存,即可获取对应WEB服务的WSDL描述文件。


2.2.2 参数类型定义(输入、输出参数)
如果用户希望使用函数定义中的输出参数获取响应结果时,自动生成的WSDL文件无法满足,必须手动对自动生成的WSDL文件进行修改。

如定义java Interface接口如下:
int queryUser(long type,User[] users) ;

则使用java2WSDL生成的WSDL如下:
为了将User[]作为输出参数,必须修改自动生成的WSDL文件,在QueryUserResponse返回消息中,添加User[]参数定义,告知Axis在WSDL2java处理中,将User[]作为输入/输出参数处理。

2.2.3 server-config.wsdd

Axis会在WEB应用程序的WEB-INF/目录下自动生成一个名字为server-config.wsdd的xml文件,其中记录了已部署的WEB服务。每部署一个新的WEB服务时,Axis都会将新服务的描述信息加入到server-config.wsdd中。

如果需要在Web服务器启动时,自动加载WEB服务,只需将server-config.wsdd与WEB应用描述文件web.xml一并放置在WEB-INF目录下即可。

server-config.wsdd中的内容可以手工更改获取,也可通过发布获取自动生成的文件。

a) 将WEB服务发布后,从WEB应用的WEB-INF目录下,获取自动生成的server-config.wsdd文件。

b) 手工更改时,将deploy.wsdd文件中的…中的内容直接拷贝,粘贴到原始server-config.wsdd文件中单独行即可。

 


2.2.4 如何将Axis集成到自己的Web应用中。
Axis是以Servlet的方式运行的,而Tomcat的作用相当于Servlets容器(Container),因此只要配置得当,就可以使Axis在Tomcat环境中运行,这一点也适用于Tomcat以外的其它应用服务器。在Tomcat中配置Axis的方法如下。

将axis-1_1/webapps/axis/WEB-INF/web.xml中的Servlet配置项复制到自己Web应用描述文件web.xml中对应位置上。


2.2.5 Axis提供了哪些开发工具
Apache Axis提供了WSDL2Java和Java2WSDL两个开发工具。

WSDL2Java利用已知的WSDL文件生成服务端和客户端代码。该WSDL文件可以是由合作伙伴提供的,也可以是利用Java2WSDL生成的。Java2WSDL根据已有的Java类文件生成WSDL文件,Java类文件可以是接口类文件,并不需要实现细节。

此外Axis还提供了SoapMonitorApplet和TCPMon工具,可用于监测Web服务。


1 如何开发Web服务的服务端和客户端代码


1.1 生成或取得WSDL文件
Java2WSDL是Axis提供的利用Java类文件得到WSDL文件的工具。类文件可以使用接口文件编译生成。

生成WSDL文件以后,就可以利用Axis提供的WSDL2Java工具生成Web服务的服务端代码和客户端代码了

注意事项 :
WSDL文件也可以由合作伙伴提供。这种情况下合作伙伴往往是Web服务的提供者或标准接口的制定者,开发者只要按照既定的WSDL文从件生成客户端或服务端代码就可以了。

1.2 开发客户端
在开发客户端时,WEB接口定义文件WSDL一般已经提供,或者可以通过Internat获取。如果未提供一般也提供了接口描述文档,详细描述了接口输入、输出参数定义,据此我们可以声明Interface接口,通过Aixs提供的java2WSDL生成WSDL文件。

下面我们假定WSDL文件已经提供;并且我们假定读者对eclipse、ant已经有一定了解。

WSDL2Java工具用于从WSDL文件生成客户端存根(stub)代码,服务端框架(skeleton)代码以及WSDL中的数据类型文件(生成与之对应的Java代码)。开发人员只需向框架代码中补充相关的业务逻辑代码即可得到完整的Web服务代码,因此该工具极大地减轻了开发人员的编码负担。

axis_ant.jar包中已经定义了Axis集成Ant的相关Ant任务定义。任务定义在axis-tasks.properties中

#properties file for taskdefing the public Axis taskdefs

axis-wsdl2java=org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask

axis-java2wsdl=org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask

axis-admin=org.apache.axis.tools.ant.axis.AdminClientTask


Ant任务名=对应Axis提供的工具
  
备注
axis-wsdl2java
WSDL2java  

axis-java2wsdl 
Java2WSDL  

axis-admin
AdminClient
  

1. 假定应用工程目录结构如下:

│ build.properties

│ build.xml

│ myAxis.wsdl

├─bin

└─src


2. build.properties文件内容如下:

axis.home = D:\\java\\axis\\axis-1_2beta
wsdl.file = myAxis.wsdl
namespace.service = urn:MyAxis
package.service = com.MyAxis.client

3. Ant文件build.xml内容如下:

定义Axis包所在类路径-->

从axis-ant.jar包中,引入Axis的Ant任务定义-->

classpathref="axis.classpath" />

依据WSDL文件,生成客户端代码-->

url="${basedir}/${wsdl.file}"
deployscope="Request"
output="${generated.path.src}"
serverside="false"
skeletondeploy="false"
testcase="true"
noimports="false"
>

1.1 开发服务端
开发服务端程序的一般步骤如下:

l 根据接口定义,定义java Interface接口。
l 根据interface接口文件,使用java2WSDL生成WEB服务描述文件
l 根据WSDL文件,使用WSDL2java生成对应的服务端代码
l 修改自动生成的实现代码类[webapp]SoapBindingImpl.java,完成接口具体操作。
l 考虑到WEB服务为系统对外门户,具体业务逻辑可能分模块实现,建议考虑参考门面模式完成interface定义;在服务端具体实现时,WEB服务接口部分向逻辑提供接口,由逻辑实现组件完成具体的逻辑操作。WEB服务部分仅完成SOAP协议解封装等工作。

1. 假定工程路径如下:

├─conf

├─generated

├─source

├─src

└─WebRoot

├─META-INF

└─WEB-INF

└─lib

 

 

2. build.properties Ant脚本使用属性

wsdl.file = myAxis.wsdl

########接口文件com.myaxis.MyAxis.java;供java2WSDL使用#####
wsi.interface = com.myaxis.MyAxis
location = http://localhost/CmsWsi/services/CmsWsi

########期望生成的接口定义包与命名空间对应关系;供WSDL2java使用###
namespace.service = http://com./ myaxis.MyAxis/1.00
package.service = com.myaxis.server

########期望生成的接口相关消息类与命名空间对应关系;供WSDL2java使用###
namespace.service.msg = http://com.myaxis.msg/
package.service.msg = com.myaxis.server.msg

########WEB容器定义,共AdminClient发布、注销WEB服务使用###
target.port = 80
target.server = localhost
target.appname = MyAxis
servletpath.admin = services/AdminService

########在ANT脚本中采用命令行方式时,发布调用的AdminClient位置##
location.admin = http://localhost/MyAxis/services/AdminService



3. build.xml

<!--加载build.propertis定义-->

<!--容器下的类路径,Axis相关jar已拷贝到对应目录下-->

<!--引入Axis的Ant任务定义-->

<classpathref="axis.classpath" />

<!--初试化,构造WSDL2java生成代码路径,-->

<!--依据java Interface定义,生成WSDL定义文件-->

location="${location}"
namespace="${namespace.service}"
output="${generated.path}/${wsdl.file}"
style="RPC"
>

根据WSDL文件,生成WEB服务的服务器端源码;考虑到接口更改,版本管理的方便,生成代码不直接导向src目录;第一次运行后,需要手工将代码拷贝到src;每次修改接口后,必须清空生成源目录,通过比较工具修改src目录下的源文件,否则Axis判断[webapp]SoapBindingImpl.java已存在不会进行更新。-->

url="${basedir}/${wsdl.file}"
deployscope="Request"
output="${generated.path.src}"
serverside="true"
skeletondeploy="false"
testcase="true"
noimports="false"
>

拷贝Web服务发布、注销脚本,deploy.wsdd和undeploy.wsdd-->
发布WEB服务到WEB容器,Axis在WEB-INF/下自动生成server-config.wsdd-->
脚本方式发布服务-->
命令行方式发布服务-->

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics