服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

用axis开发基于java的web服务

  概述

  本文介绍了一个比较简单实用的基于java的soap引擎――apache组织推出的axis――的安装、配置和应用开发方法,希望对有兴趣做基于java的web services应用开发的朋友有所帮助。

  axis简介

  axis是apache组织推出的soap引擎,axis项目是apache组织著名的soap项目的后继项目,目前最新版本是采用java开发的1.1版本,c++的版本正在开发之中。axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。

  axis的安装

  应用axis开发web services,你需要有一个支持servlet的服务器引擎,比如广为人知的tomcat(tomcat也是由apache组织所提供的,目前的最新版本为4.1.24,下载地址为http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/)。在此之前当然你机器必须已经装好了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服务器,在浏览器中访问http://localhost:8080/axis/happyaxis.jsp,如果页面显示有错误,则需要回头检查一下相关配置是否正确,如果浏览页面能正确显示出系统组件、属性等参数配置信息,则表示安装成功,如下图所示:

用axis开发基于java的web服务(图一)

  现在可以开始开发你的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”目录,通过访问http://localhost:8080/axis/distance.jws?wsdl可以看到这个服务的wsdl描述文件,这说明distance服务被成功发布了。如下图所示:

用axis开发基于java的web服务(图二)

  使用定制发布

  即时发布是一项令人激动的技术,它使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服务定制发布完成。

  通过访问http://localhost:8080/axis/services/capacity?wsdl可以看到这个服务的wsdl描述文件,这说明capacity服务被成功发布了。如下图所示:

用axis开发基于java的web服务(图三) 服务的访问

  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方法直接访问该服务,访问的地址为http://localhost:8080/axis/helloworld.jws?method=helloworld,可以看到返回的soap信封消息,同时服务器端给出了相应的显示信息“hello world!”这表明helloworld服务被成功访问了。如下图所示:

用axis开发基于java的web服务(图四)

  客户端服务访问编程

  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;

/**

* @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服务时的不同,前者的服务访问点地址为http://localhost:8080/axis/helloworld.jws,而后者的则为http://localhost:8080/axis/services/capacity。

  总结

  web services是未来网络应用的发展方向,soap和wsdl是web services的核心协议,axis给出了一个很好的soap实现,它使得开发web services应用变得轻松而有趣。

扫描关注微信公众号