Web Service

一.Axis简介
1. 什么是SOAP
Simple Object Access Protocol (SOAP)
SOA 面向服务体系结构设计

引用
SOAP 提供一种简单的、可扩展并且功能丰富的 XML 消息处理框架,用于定义高级别的应用程序协议,从而在分布式异构环境中提供更高的互操作性。
——微软的解释

SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。
SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。

2. 什么是Axis
Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。
但是Axis不仅仅是一个SOAP引擎,它还包括:
     一个独立运行的SOAP服务器
     一个servlet引擎的插件,这个servlet引擎可以是Tomcat
     对WSDL的扩展支持
     一个将WSDL的描述生成JAVA类的工具
     一些示例代码
     还有一个监控TCP/IP包的工具


二、Axis的安装

应用Axis开发Web Services,你需要安装如下软件:
1.JDK
2.一个支持Servlet的服务器引擎,比如广为人知的Tomcat。
当安装好Tomcat之后,只需将下载的Axis软件包解压缩,将其中的“webapps”目录下的“axis”目录整个拷贝到Tomcat安装目录下的“webapps”目录下即可。

三、Axis的配置

Axis基于Java开发,可以部署于多种操作系统,使用前需要配置一系列的系统变量,在此假定你已经在本机上装好了Tomcat 4.0以上的版本,需要配置的系统变量如下表所示:
tomcat安装在D:\tomcat

AXIS_LIB     D:\tomcat\webapps\axis\WEB-INF\lib

AXISCLASSPATH         %AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\mail.jar;%AXIS_LIB%\activation.jar

在classpath中 添加%AXISCLASSPATH%
四、Axis的测试

安装配置完毕后,应测试一下是否Axis可以正确运行了。
  启动Tomcat服务器,在浏览器中访问http://localhost:8080/axis/happyaxis.jsp,如果页面显示有错误,则需要回头检查一下相关配置是否正确,如果浏览页面能正确显示出系统组件、属性等参数配置信息,则表示安装成功。现在可以开始开发你的Web Services应用了。

五、服务的发布

Axis提供了两种服务发布方式,一种是即时发布(Instant Deployment),一种是定制发布(Custom Deployment)。

1. 使用即时发布 Java Web Service(JWS)

  对即时发布的支持是Axis的特色之一,使用即时发布使用户只需有提供服务的Java类的源代码,即可将其迅速发布成Web服务。每当用户调用这类服务的时候,Axis会自动进行编译,即使服务器重启了也不必对其做任何处理,使用非常简单快捷。
  使用即时发布首先需要一个实现服务功能的Java源文件,将其扩展名改为.jws(Java Web Service的缩写),然后将该文件放到“……webappsaxis”目录下即可。
     在此给出一个从英里到公里的长度单位转换的服务,其源码如下:
文件Distance.jws
public class Distance
{
     public double convertMile2Kilometre( double mile )
     {
       return mile * 1.609;   //实现英里到公里的距离转换
     }
}
将其放到“……webappsaxis”目录,通过访问http://localhost:8080/axis/Distance.jws?wsdl可以看到这个服务的WSDL描述文件,这说明Distance服务被成功发布了。

需要注意的是:JWS的web服务发布是一个很简单的Web服务发布方式,在页面中你不能使用包,而且由于代码是在运行期被编译的,所以在部署之后,你也很难找到错误所在。

2. 使用定制发布 Web Service Deployment Descriptor(WSDD)

  即时发布是一项令人激动的技术,它使Web服务的开发变得如此简单;然而即时发布并不总是最好的选择,比如有些应用系统是第三方提供的,我们没有购买源代码,只有.class文件,但我们又希望将这个应用系统的一些功能对外发布成Web服务,使其能够在更大范围内产生作用,这个时候即时发布技术就无能为力了。此外,即时发布技术并不灵活,无法进行更多的服务配置,这使得它并不能满足一些特定系统的需求。
  因此,Axis提供了另一种服务发布方式,这就是定制发布。
  在此给出一个从加仑到升的容积单位转换的服务,其源码如下:
  文件Capacity.java
   

package samples.capacity;
     public class Capacity
     {
         public double convertGallon2Litre( double gallon )
         {
           return gallon * 4.546;//实现加仑到升的容积转换
         }//convertGallon2Litre()
     }/* Capacity */



     将其编译成.class文件,放置到“……webappsaxissamplescapacity”目录下,即可着手进行发布。
     定制发布不需要构建.jws文件,但必须创建服务发布描述文件deploy.wsdd(Web Service Deployment Descriptor的缩写),这个文件负责描述服务的名称、入口等信息,其内容如下:

文件deploy.wsdd

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="Capacity" provider="java:RPC">
   <parameter name="className" value="samples.capacity.Capacity"/>
   <parameter name="allowedMethods" value="*"/>
</service>
</deployment>

在这里服务的提供者是“java:RPC”,它被内建在Axis中,而且指明了一个JAVA RPC服务,做这个处理的类是org.apache.axis.providers.java.RPCProvider。
     我们是通过一个 标签告诉RPC服务应该调用的类,而另外一个 标签则告诉引擎,它可以调用这个类中的任何的Public方法。你也可以指定通过使用名字空间或者一些可以调用的方法列表,来指明那些方法可以被调用。
  将该文件也放到“……webappsaxissamplescapacity”目录下,然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。
   在“……webappsaxissamplescapacity”目录下,运行:
   java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
   如果运行时说没有找到类,那么可能是类路径没有配置好,建议将所有的与axis相关的jar都写到classpath中去。这样只要运行:
   java org.apache.axis.client.AdminClient deploy.wsdd
   可以看到以下运行结果:
Processing file deploy.wsdd
Doneprocessing
  这表明Capacity服务定制发布完成。

一定要注意:编译后的class文件要拷贝到web-inf/classes的目录中,如果该文件中有包存在的话,别忘了还要在classes目录下创建包的目录
   通过访问http://localhost:8080/axis/services/Capacity?wsdl可以看到这个服务的WSDL描述文件,这说明Capacity服务被成功发布了。
六、服务的访问

  GET方式的服务访问

  一般的SOAP消息都是采用POST方式实现传递,但也可以通过GET方式来访问。比如以下给出的一个服务——“HelloWorld”,其源码如下:

文件HelloWorld.jws
public class HelloWorld
{
     public String helloWorld()
     {
           System.out.println( "Hello World!" );//在服务器端打印输出
           return "Hello World!";//返回相应字符串
     }
}
  这个服务给出一个名为“helloWorld”的无入口参数的操作,返回一个内容为“Hello World!的字符串”,同时在服务器端打印“Hello World!”,将该文件放到“……webappsaxis”目录下,即可通过GET方法直接访问该服务,访问的地址为http://localhost:8080/axis/HelloWorld.jws?method=helloWorld,可以看到返回的SOAP信封消息,同时服务器端给出了相应的显示信息“Hello World!”这表明HelloWorld服务被成功访问了,生成的SOAP信封消息为:

-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-
  Hello World!
 
 
 


七、客户端服务访问编程

  Axis提供了一套API来实现SOAP,从http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文档。

  其中,org.apache.axis.client.Call和org.apache.axis.client.Service是两个比较常用的类,一般的客户端程序欲访问一个Web Service时,都要生成一个客户端的Service对象和Call对象,在访问服务之前,首先要对Call对象设置相应的参数,包括服务的位置、操作名、入口参数、返回值类型等,最后调用Call对象的invoke方法访问服务。

  以下给出了一个客户端访问Web服务的例程——AXISTest.java:

  文件AXISTest.java

package axisexercise;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

import javax.xml.rpc.ParameterMode;

public class AXISTest
{
     public static void main( String[] args ) throws Exception
     {
         // 创建service和call对象,这些对象是标准的JAX-RPC对象,这些对象用于存储服务调用的数据(metadata)。

Service service = new Service();
Call call = ( Call ) service.createCall();
//////////访问即时发布的Distance服务

//设置访问点
call.setTargetEndpointAddress( \"http://localhost:8080/axis/Distance.jws\" );

//设置操作名
call.setOperationName( \"convertMile2Kilometre\" );

//设置入口参数
call.addParameter( \"op1\", XMLType.XSD_DOUBLE, ParameterMode.IN );

//设置返回参数类型
call.setReturnType( XMLType.XSD_DOUBLE );
Double d1 = new Double( 190 );

//调用服务,在invoke方法中传入的是包含调用参数的数组
System.out.println( d1 + \" 英里相当于 \" +
call.invoke( new Object[] {d1} ) + \" 公里!\" );

//////////访问定制发布的Capacity服务
call = ( Call ) service.createCall();

//设置访问点
call.setTargetEndpointAddress( \"http://localhost:8080/axis/services/Capacity\" );

//设置操作名
call.setOperationName( \"convertGallon2Litre\" );

//设置入口参数
call.addParameter( \"op1\", XMLType.XSD_DOUBLE, ParameterMode.IN );
call.setReturnType( XMLType.XSD_DOUBLE );
d1 = new Double( 10.00 );

//调用服务
System.out.println( d1 + \" 加仑相当于 \" +
call.invoke( new Object[] {d1} ) + \" 升!\" );

     } //main()

}/* AXISTest */


编译运行后运行可以看到以下的结果:
190.0英里相当于305.71公里!

10.0加仑相当于45.46升! 
  注意程序在访问即时发布的Distance服务和定制发布的Capacity服务时的不同,前者的服务访问点地址为http://localhost:8080/axis/HelloWorld.jws,而后者的则为http://localhost:8080/axis/services/Capacity。

你可能感兴趣的:(apache,tomcat,应用服务器,Web,SOAP)