应用AXIS开始Web+Service之旅.doc_第1页
应用AXIS开始Web+Service之旅.doc_第2页
应用AXIS开始Web+Service之旅.doc_第3页
应用AXIS开始Web+Service之旅.doc_第4页
应用AXIS开始Web+Service之旅.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

应用AXIS开始Web 服务之旅一 介绍本文并不是想介绍Web服务的原理、系统架构等,我们假设您已经了解了关于Web服务的一些基本的概念、原理等知识。本文主要是针对那些已经了解Web服务概念,但是还没有亲身体会Web服务所带来令人欢欣鼓舞的特征的开发人员。在此我们认为你已经具备了Java、XML等基础知识,如果你还有其他开发环境的经验例如VB、VC那是再好不过的了。1Web服务虽然我们并不想详细讲述Web服务的体系结构,但是大概的介绍一下还是有必要的。Web服务是一种新型的Web应用程序。不同于其他Web应用程序,它是自适应、自我描述、模块化的应用程序,并可以跨越Web进行发布、定位以及调用。简单的Web服务可以提供例如天气预报或者航班信息的服务。一旦部署了Web服务,其他的应用程序就可以发现和调用所部署的服务。2AXIS项目Axis框架来自 Apache 开放源代码组织,它是基于JAVA语言的最新的 SOAP 规范(SOAP 1.2)和 SOAP with Attachments 规范(来自 Apache Group )的开放源代码实现。AXIS的最新版本是1.1,可以从/axis/index.html下载。下图是AXIS核心引擎的体系结构图:图1整个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。除了前面介绍的AXIS外,本文中还将会用到TOMCAT,这里不再另行介绍。另外为了演示Web服务真正与开发环境无关以及AXIS产生的是标准的、符合规范的Web服务,我们还将用到微软公司的SOAP TOOLKIT以及微软的开发环境VB和VC来做为Web服务的客户端。二 环境搭建由于AXIS本身是基于JAVA语言开发的项目,并且是以Web应用形式发布的,因此它运行时需要一个应用服务器作为支撑。为了方便我们这里选用的是Tomcat。由于AXIS本身需要用到处理XML信息的包,所以我们建议使用JDK1.4并安装Tomcat 4.1.24。下面是环境搭建步骤,读取根据自身情况进行安装。1. 安装JDK1.4.12. 安装Tomcat 4.1.24到C:Tomcat并验证安装是否成功3. 下载AXIS项目打包文件axis-1_1.zip解压缩后将目录中的webapps目录下的axis子目录拷贝到C:Tomcatwebapps下。4. 验证AXIS的安装:重新启动Tomcat服务器后打开浏览器输入网址http:/localhost:8080/axis 后应该出现如下图所示页面,点击链接“Validate”来验证Axis所需的几个JAVA包是否齐全。点击这里验证图2点击超链接Validate后,AXIS会自动检查所需的每一个JAVA组件,这协组件分为:必需组件以及可选组件,必须保证所有必需组件都存在,如下图所示即为验证成功。图3三 Web Service服务端开发经过了前两步之后我们就可以开始Web服务之旅了!大多数人在学习一种编程语言的第一步都是从Hello world程序开始的,我们也不例外。我们将提供这样一个Web服务,通过给它传入姓名,服务返回:你好姓名,欢迎来到Web服务的世界。这就是我们的需求。我们将马上根据AXIS的要求完成我们的需求,你就会发现原来Web服务可以这么简单!编写JAVA类Hello.java,内容如下:public class Hellopublic String hello(String name)if(name=null)name = “”;return “你好”+name+”,欢迎来到Web服务的世界!”;仅此而已,无需编译,将该文件改名为Hello.jws并拷贝到AXIS应用目录C:Tomcatwebappsaxis下。下面我们就可以测试该Web服务了,打开浏览器并输入刚刚创建的文件名对应的URL地址http:/localhost:8080/axis/Hello.jws 浏览器显示如下结果:There is a Web Service here Click to see the WSDL 点击页面上的链接查看该Web服务对应的WSDL信息如下所示(我们将在下一小节简单介绍WSDL) - + - - - - - - - - 到此我们已经完成了hello的Web服务了,那我们怎么告诉用户如何来使用该服务呢?我们只需要告诉用户我们的Web服务的URL地址:http:/localhost:8080/axis/Hello.jws?wsdl 就可以了!下一节我们将介绍如何通过这个地址来访问对应的Web服务。四 Web Service客户端开发在这一节中我们将使用三种不同的语言来访问刚刚创建的Web服务,分别是JAVA、VB、VC。为了使用VB和VC访问Web服务,我们需要安装微软公司的Soap Toolkit 开发工具包,这个工具包可以从微软公司的主页/download/xml/soap/2.0/W98NT42KMe/EN-US/SoapToolkit20.exe下载,下载该软件包并使用默认方式安装即可。在开始客户端开发之前有两个概念我们必须先粗略的介绍一下。SOAP:简单对象访问协议。这是一种在松散的、分布的环境中使用XML对等地交换结构化的和类型化的信息提供了一个简单且轻量级的机制,它是一个基于XML的协议。它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。虽然这四个部分都作为SOAP的一部分,作为一个整体定义的,但他们在功能上是相交的、彼此独立的。特别的,信封和编码规则是被定义在不同的XML命名空间(namespace)中,这样使得定义更加简单。SOAP的主要设计目标是简明性和可扩展性。这就意味着有一些传统消息系统或分布式对象系统中的特性将不包含在SOAP的核心规范中。这些特性包括:分布式垃圾收集;批量消息传输/处理;对象引用;对象激活。WSDL:Web Service描述语言。使用了WSDL,我们就可以通过这种跨平台和跨语言的方法使Web Service代理的产生自动化。就像COM和CORBA的IDL文件,WSDL文件由客户和服务器约定。由于WSDL设计成可以绑定除SOAP以外的其他协议,这里我们主要关注WSDL在HTTP上和SOAP的关系。同样,由于SOAP目前主要用来调用远程的过程和函数,WSDL支持SOAP传输的文档规范。WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务,截然不同的网站都可以实现。1. JAVA客户端使用AXIS的工具将使Web服务的访问和我们之前介绍的创建一个Web服务一样的简单。我们前面安装的AXIS环境中已经包含着这样的工具,它是一个JAVA类,类名为:org.apache.axis.wsdl.WSDL2Java。打开命令行窗口,转到AXIS目录下的WEB-INF子目录。确保Tomcat服务已经处于启动状态,键入命令 :Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http:/localhost:8080/axis/Hello.jws?wsdl该命令执行的结果是在当前所在目录下产生一个子目录 localhost/axis/Hello_jws,该目录下有四个JAVA源文件,它们分别是:Hello.java定义了Web服务接口,此例中只有一个hello方法。HelloService.java定义了用于获取Web服务接口的方法。HelloServiceLocator.java接口HelloService的具体实现。HelloSoapBindingStub.javaWeb服务客户端桩,通过该类与服务器交互。这四个JAVA类帮我们处理了大部分的逻辑,我们需要的仅仅是把这些类加到我们的项目然后创建一个我们自己的类来调用它们即可。为此我们新加一个类Main.java,为了方便,让这个类与刚产生的四个类都在同一个包下。内容如下:/Main.javapackage localhost.axis.Hello_jws;public class Mainpublic static void main(String args) throws ExceptionHelloService service = new HelloServiceLocator();Hello hello = service.getHello();System.out.println(Response:+hello.hello(罐头);使用以下命令进行编译:javac classpath libaxis.jar;libjaxrpc.jar localhostaxisHello_jws*.java如果编译没有问题的话执行该测试程序:java -Djava.ext.dirs=lib -cp . localhost.axis.Hello_jws.Main/运行结果:Response:你好罐头,欢迎来到Web服务的世界!在WSDL2Java工具自动产生的几个类中,类HelloServiceLocator中保存这一些跟服务器相关的信息,例如URL地址等,当服务器的地址更改后但是服务并没有改动的时候直接修改该文件中的字符串定义,而无需重新生成这几个类。具体需要修改的内容,打开该文件便可一目了然。2. VB客户端有了微软SOAP toolkit,用VB调用Web服务也是一件令人愉快的事情。打开VB开发环境新建一个标准EXE项目,编辑窗体如下图所示:图4编辑按钮Call的点击事件处理程序如下:(注意窗体的控件名称要与程序中的名称对应)Private Sub callBtn_Click() 这种做法需要在工程中引用Soap Type Library Dim soap As MSSOAPLib.SoapClient Set soap = New MSSOAPLib.SoapClient Dim soap Set soap = CreateObject(MSSOAP.SoapClient) On Error Resume Next soap.mssoapinit urlText.Text Call soap.mssoapinit(urlText.Text) If Err 0 Then MsgBox 初始化SOAP失败: + Err.Description urlText.SetFocus Else If Len(Trim(nameText.Text) = 0 Then MsgBox 请输入您的姓名! nameText.SetFocus Else responseText.Text = soap.hello(nameText.Text) End If End IfEnd Sub保存项目并运行,输入姓名并点击按钮Call。3. VC客户端打开VC开发环境,新建项目HelloClient,项目类型为 Win32 Console Application的空项目。新建C+ Source File文件名为:HelloSoap.cpp,编辑文件内容如下:/#include stdafx.h#include #import msxml3.dll using namespace MSXML2;/根据自己机器的情况修改下面语句中指定的路径#import C:Program FilesCommon FilesMSSoapBinariesmssoap1.dll exclude(IStream, ISequentialStream, _LARGE_INTEGER, _ULARGE_INTEGER, tagSTATSTG, _FILETIME)using namespace MSSOAPLib;void Hello()ISoapSerializerPtr Serializer;ISoapReaderPtr Reader;ISoapConnectorPtr Connector;/ Connect to the serviceConnector.CreateInstance(_uuidof(HttpConnector);Connector-PropertyEndPointURL = http:/localhost:8080/axis/Hello.jws?wsdl;Connector-Connect();/ Begin messageConnector-BeginMessage();/ Create the SoapSerializerSerializer.CreateInstance(_uuidof(SoapSerializer);/ Connect the serializer to the input stream of the connectorSerializer-Init(_variant_t(IUnknown*)Connector-InputStream);/ Build the SOAP MessageSerializer-startEnvelope(,);Serializer-startBody();Serializer-startElement(hello,);Serializer-startElement(name,);Serializer-writeString(罐头);Serializer-endElement();Serializer-endElement();Serializer-endBody();Serializer-endEnvelope();/ Send the message to the web serviceConnector-EndMessage(); / Let us read the responseReader.CreateInstance(_uuidof(SoapReader);/ Connect the reader to the output stream of the connectorReader-Load(_variant_t(IUnknown*)Connector-OutputStream), );/ Display the resultprintf(Response: %sn, (const char*)Reader-RPCResult-text); int main()CoInitialize(NULL);Hello();CoUninitialize();retur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论