本文并非想介绍Web服务的原理、系统架构等,咱们假设您已经了解了关于Web服务的一些基本的概念、原理等知识。本文主要是针对那些已经了解Web服务概念,可是尚未亲身体会Web服务所带来使人欢欣鼓舞的特征的开发人员。在此咱们认为你已经具有了Java、XML等基础知识,若是你还有其余开发环境的经验例如VB、VC那是再好不过的了。java
虽然咱们并不想详细讲述Web服务的体系结构,可是大概的介绍一下仍是有必要的。Web服务是一种新型的Web应用程序。不一样于其余Web应用程序,它是自适应、自我描述、模块化的应用程序,并能够跨越Web进行发布、定位以及调用。简单的Web服务能够提供例如天气预报或者航班信息的服务。一旦部署了Web服务,其余的应用程序就能够发现和调用所部署的服务。apache
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核心引擎的体系结构图:api
图1浏览器
整个AXIS项目包括如下几个部分:安全
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。下面是环境搭建步骤,读取根据自身状况进行安装。
图2
点击超连接Validate后,AXIS会自动检查所需的每个JAVA组件,这协组件分为:必需组件以及可选组件,必须保证全部必需组件都存在,以下图所示即为验证成功。
图3
通过了前两步以后咱们就能够开始Web服务之旅了!大多数人在学习一种编程语言的第一步都是从Hello world程序开始的,咱们也不例外。咱们将提供这样一个Web服务,经过给它传入姓名,服务返回:你好[姓名],欢迎来到Web服务的世界。这就是咱们的需求。咱们将立刻根据AXIS的要求完成咱们的需求,你就会发现原来Web服务能够这么简单!
编写JAVA类Hello.java,内容以下:
public class Hello{ public String hello(String name){ if(name==null) name = ""; return "你好"+name+",欢迎来到Web服务的世界!"; } } |
仅此而已,无需编译,将该文件更名为Hello.jws并拷贝到AXIS应用目录C:\Tomcat\webapps\axis下。
下面咱们就能够测试该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服务,分别是JAVA、VB、VC。为了使用VB和VC访问Web服务,咱们须要安装微软公司的Soap Toolkit 开发工具包,这个工具包能够从微软公司的主页
http://download.microsoft.com/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消息,它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务,大相径庭的网站均可以实现。
使用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.java Web服务客户端桩,经过该类与服务器交互。
这四个JAVA类帮咱们处理了大部分的逻辑,咱们须要的仅仅是把这些类加到咱们的项目而后建立一个咱们本身的类来调用它们便可。为此咱们新加一个类Main.java,为了方便,让这个类与刚产生的四个类都在同一个包下。内容以下:
//Main.java package localhost.axis.Hello_jws; public class Main{ public static void main(String[] args) throws Exception{ HelloService service = new HelloServiceLocator(); Hello hello = service.getHello(); System.out.println("Response:"+hello.hello("罐头")); } } |
使用如下命令进行编译:
javac -classpath lib\axis.jar;lib\jaxrpc.jar localhost\axis\Hello_jws\*.java |
若是编译没有问题的话执行该测试程序:
java -Djava.ext.dirs=lib -cp . localhost.axis.Hello_jws.Main//运行结果:Response:你好罐头,欢迎来到Web服务的世界! |
在WSDL2Java工具自动产生的几个类中,类HelloServiceLocator中保存这一些跟服务器相关的信息,例如URL地址等,当服务器的地址更改后可是服务并无改动的时候直接修改该文件中的字符串定义,而无需从新生成这几个类。具体须要修改的内容,打开该文件即可一目了然。
有了微软SOAP toolkit,用VB调用Web服务也是一件使人愉快的事情。
打开VB开发环境新建一个标准EXE项目,打开工程(Project)菜单并选择引用打开组件引用对话框以下图所示:找到并选中Microsoft Soap Type Library。
图 4
新建并编辑窗体以下图所示:
图 5
编辑按钮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 If End Sub |
保存项目并运行,输入姓名并点击按钮Call。
打开VC开发环境,新建项目HelloClient,项目类型为 Win32 Console Application的空项目。新建C++ Source File文件名为:HelloSoap.cpp,编辑文件内容以下:
//#include "stdafx.h" #include #import "msxml3.dll" using namespace MSXML2; //根据本身机器的状况修改下面语句中指定的路径 #import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap1.dll" \ exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", \ "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME") using namespace MSSOAPLib; void Hello(){ ISoapSerializerPtr Serializer; ISoapReaderPtr Reader; ISoapConnectorPtr Connector; // Connect to the service Connector.CreateInstance(__uuidof(HttpConnector)); Connector->Property["EndPointURL"] = "http://localhost:8080/axis/Hello.jws?wsdl"; Connector->Connect(); // Begin message Connector->BeginMessage(); // Create the SoapSerializer Serializer.CreateInstance(__uuidof(SoapSerializer)); // Connect the serializer to the input stream of the connector Serializer->Init(_variant_t((IUnknown*)Connector->InputStream)); // Build the SOAP Message Serializer->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 service Connector->EndMessage(); // Let us read the response Reader.CreateInstance(__uuidof(SoapReader)); // Connect the reader to the output stream of the connector Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), ""); // Display the result printf("Response: %s\n", (const char*)Reader->RPCResult->text); } int main() { CoInitialize(NULL); Hello(); CoUninitialize(); return 0; } |
编译并运行该项目。
本节只是为了演示若是经过VC来访问使用AXIS建立的Web服务,至于Soap toolkit的具体使用请参照soap toolkit的帮助手册,其余语言的访问请查阅相关的文档。
为了让咱们的WEB应用程序支持Web服务功能,咱们须要将AXIS集成到咱们的应用程序中。集成AXIS很简单,首先须要拷贝AXIS用到的几个JAR包文件,这些文件都在[AXIS]\WEB-INF\lib目录下,将这些文件拷贝到咱们本身的应用目录下的WEB-INF\lib。另外若是你用的不是TOMCAT服务器那就须要拷贝activation.jar,这个JAR文件能够在[TOMCAT]\common\lib目录下找到!
拷贝完JAR文件后就是web.xml的配置了,只须要把AXIS中的web.xml中的配置信息添加到咱们本身应用程序中的web.xml中便可。最重要的是下面的内容:
AxisServlet Apache-Axis Servlet org.apache.axis.transport.http.AxisServlet AxisServlet *.jws wsdl text/xml xsd text/xml |
到此文章告一段落,经过以上的演练,我相信你已经对Web服务有一个感性的认识,可是这个仅仅是开始,咱们也只是很简单的介绍了Web服务的一些基本概念并演示了一个没法再简单的例子。Web服务还有不少其余高级的内容例如复杂类型、数据安全等没有涉及到,不过没有关系,万事开头难,但愿本文可以促进你们理解和应用下一代的应用模式并给尚未动手试验的开发人员开一个好头。
来源:http://www.ibm.com/developerworks/cn/webservices/ws-startaxis/