服务的发布
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服务被成功发布了。如下图所示:
使用定制发布
即时发布是一项令人激动的技术,它使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服务被成功发布了。如下图所示:
服务的访问
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提供了一套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应用变得轻松而有趣。