用Axis开发基于Java的Web服务

概述

  本文介绍了一个比较简单实用的基于 Java的SOAP引擎——Apache组织推出的Axis——的安装、配置和应用开发方法,但愿对有兴趣作基于Java的Web Services应用开发的朋友有所帮助。
  
Axis简介

  Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1 软件包能够从[url]http://ws.apache.org/axis/dist/1_1/[/url]下载获得。
  
Axis的安装

  应用Axis开发Web Services,你须要有一个支持Servlet的服务器引擎,好比广为人知的Tomcat(Tomcat也是由Apache组织所提供的,目前的最新版本为4.1.24,下载地址为[url]http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/[/url])。在此以前固然你机器必须已经装好了JDK1.3以上的版本,当安装好Tomcat以后,只需将下载的Axis软件包解压缩,将其中的“webapps”目录下的“axis”目录整个拷贝到Tomcat安装目录下的“webapps”目录下便可。
  
Axis的配置

  Axis基于Java开发,能够部署于多种 操做系统,使用前须要配置一系列的系统变量,在此假定你已经在本机上装好了Tomcat 4.0以上的版本,须要配置的系统变量以下表所示:
CATALINA_HOME
C:\Tomcat_4_1
(此处应为Tomcat的安装位置,注意路径名中不要有空格)

AXIS_HOME
%CATALINA_HOME%\webapps\axis

AXIS_LIB
%AXIS_HOME%\lib

AXISCLASSPATH
%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar
  若是你不肯作这么繁琐的类路径设置,能够直接将axis软件包中“lib”目录下的全部.jar文件加入到系统环境变量CLASSPATH中便可。
  
Axis的测试

  安装配置完毕后,应测试一下是否Axis能够正确运行了。
  启动Tomcat服务器,在浏览器中访问 [url]http://localhost:8080/axis/happyaxis.jsp[/url],若是页面显示有错误,则须要回头检查一下相关配置是否正确,若是浏览页面能正确显示出系统组件、属性等参数配置信息,则表示安装成功,以下图所示:


  如今能够开始开发你的Web Services应用了。
 
 
服务的发布

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

  对即时发布的支持是Axis的特点之一,使用即时发布使用户只需有提供服务的 Java类的源代码,便可将其迅速发布成Web服务。每当用户调用这类服务的时候,Axis会自动进行编译,即便服务器重启了也没必要对其作任何处理,使用很是简单快捷。
  使用即时发布首先须要一个实现服务功能的Java源文件,将其扩展名改成.jws(Java Web Service的缩写),而后将该文件放到“……\webapps\axis”目录下便可。
  在此给出一个从英里到千米的长度单位转换的服务,其源码以下:
文件Distance.jws

/**
* @author 飞鹰
*/
public class Distance
{
public double convertMile2Kilometre( double mile )
{
//实现英里到千米的距离转换
return mile * 1.609;
}//convertMile2Kilometre()
}/* Distance */
  将其放到“……\webapps\axis”目录,经过访问 [url]http://localhost:8080/axis/Distance.jws?wsdl[/url]能够看到这个服务的WSDL描述文件,这说明Distance服务被成功发布了。以下图所示:


  
使用定制发布

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

package samples.capacity;
/**
* @author 飞鹰
*/
public class Capacity
{
public double convertGallon2Litre( double gallon )
{
//实现加仑到升的容积转换
return gallon * 4.546;
}//convertGallon2Litre()
}/* Capacity */
  将其编译成.class文件,放置到“……\webapps\axis\samples\capacity”目录下,便可着手进行发布。
  定制发布不须要构建.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>
  将该文件也放到“……\webapps\axis\samples\capacity”目录下,而后能够采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。
  在“……\webapps\axis\samples\capacity”目录下,运行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
  能够看到如下运行结果:
Processing file deploy.wsdd
<Admin>Doneprocessing</Admin>
  这代表Capacity服务定制发布完成。
  经过访问 [url]http://localhost:8080/axis/services/Capacity?wsdl[/url]能够看到这个服务的WSDL描述文件,这说明Capacity服务被成功发布了。以下图所示:

 
 
服务的访问

  
GET方式的服务访问

  通常的SOAP消息都是采用POST方式实现传递,但也能够经过GET方式来访问。好比如下给出的一个服务——“HelloWorld”,其源码以下:
文件HelloWorld.jws

/**
* @author 飞鹰
*/
public class HelloWorld
{
public String helloWorld()
{
//在服务器端 打印输出
System.out.println( "Hello World!" );
//返回相应字符串
return "Hello World!";
}//helloWorld()
}/* HelloWorld */
  这个服务给出一个名位“helloWorld”的无入口参数的操做,返回一个内容为“Hello World!的字符串”,同时在服务器端打印“Hello World!”,将该文件放到“……\webapps\axis”目录下,便可经过GET方法直接访问该服务,访问的地址为[url]http://localhost:8080/axis/HelloWorld.jws?method=helloWorld[/url],能够看到返回的SOAP信封消息,同时服务器端给出了相应的显示信息“Hello World!”这代表HelloWorld服务被成功访问了。以下图所示:


  
客户端服务访问编程

  Axis提供了一套API来实现SOAP,从[url]http://localhost:8080/axis/docs/apiDocs/index.html[/url]能够看到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;
/**
* @author 飞鹰
*/
public class AXISTest
{
public static void main( String[] args ) throws Exception
{
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 );
//调用服务
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服务时的不一样,前者的服务访问点地址为[url]http://localhost:8080/axis/HelloWorld.jws[/url],然后者的则为[url]http://localhost:8080/axis/services/Capacity[/url]。
  
总结

  Web Services是将来 网络应用的发展方向,SOAP和WSDL是Web Services的核心协议,Axis给出了一个很好的SOAP实现,它使得开发Web Services应用变得轻松而有趣。
相关文章
相关标签/搜索