Axis的安?/b>
应用Axis开发Web ServicesQ你需要有一个支持Servlet的服务器引擎Q比如广Zh知的TomcatQTomcat也是由Apachel织所提供的,目前的最新版本ؓ4.1.24Q下载地址为http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/Q。在此之前当然你机器必须已经装好了JDK1.3以上的版本,当安装好Tomcat之后Q只需下载的Axis软g包解压羃Q将其中的“webapps”目录下的“axis”目录整个拷贝到Tomcat安装目录下的“webapps”目录下卛_?/p>
Axis的配|?/b>
AxisZJava开发,可以部v于多U操作系l,使用前需要配|一pd的系l变量,在此假定你已l在本机上装好了Tomcat 4.0以上的版本,需要配|的pȝ变量如下表所C:
CATALINA_HOME
C:\Tomcat_4_1
Q此处应为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
如果你不愿做q么J琐的类路径讄Q可以直接将axis软g包中“lib”目录下的所?jar文g加入到系l环境变量CLASSPATH中即可?/p>
Axis的测?/b>
安装配置完毕后,应测试一下是否Axis可以正确q行了?/p>
启动Tomcat服务器,在浏览器中访?a href="http://localhost:8080/axis/happyaxis.jsp">http://localhost:8080/axis/happyaxis.jspQ如果页面显C有错误Q则需要回头检查一下相关配|是否正,如果览面能正显C出pȝlg、属性等参数配置信息Q则表示安装成功Q如下图所C:
现在可以开始开发你的Web Services应用了?br />
服务的发?br />
Axis提供了两U服务发布方式,一U是x发布QInstant DeploymentQ,一U是定制发布QCustom DeploymentQ?
使用x发布
对即时发布的支持是Axis的特色之一Q用即时发布用户只需有提供服务的Javacȝ源代码,卛_其q速发布成Web服务。每当用戯用这cL务的时候,Axis会自动进行编译,即服务器重启了也不必对其做M处理Q用非常简单快捗?/p>
使用x发布首先需要一个实现服务功能的Java源文Ӟ其扩展名改?jwsQJava Web Service的羃写)Q然后将该文件放到“……\webapps\axis”目录下卛_?/p>
在此l出一个从英里到公里的长度单位转换的服务,其源码如下:
文gDistance.jws
/**
* @author 飞鹰
*/
public class Distance
{
public double convertMile2Kilometre( double mile )
{
//实现英里到公里的距离转换
return mile * 1.609;
}//convertMile2Kilometre()
}/* Distance */
其攑ֈ“……\webapps\axis”目录,通过讉Khttp://localhost:8080/axis/Distance.jws?wsdl可以看到q个服务的WSDL描述文gQ这说明Distance服务被成功发布了。如下图所C:
使用定制发布
x发布是一o人激动的技术,它Web服务的开发变得如此简单;然而即时发布ƈ不L最好的选择Q比如有些应用系l是W三Ҏ(gu)供的Q我们没有购买源代码Q只?class文gQ但我们又希望将q个应用pȝ的一些功能对外发布成Web服务Q其能够在更大范围内生作用,q个时候即时发布技术就无能为力了。此外,x发布技术ƈ不灵z,无法q行更多的服务配|,q得它q不能满一些特定系l的需求?/p>
因此QAxis提供了另一U服务发布方式,q就是定制发布?/p>
在此l出一个从加仑到升的容U单位{换的服务Q其源码如下Q?/p>
文gCapacity.java
package samples.capacity;
/**
* @author 飞鹰
*/
public class Capacity
{
public double convertGallon2Litre( double gallon )
{
//实现加仑到升的容U{?/p>
return gallon * 4.546;
}//convertGallon2Litre()
}/* Capacity */
其~译?class文gQ放|到“……\webapps\axis\samples\capacity”目录下Q即可着手进行发布?/p>
定制发布不需要构?jws文gQ但必须创徏服务发布描述文gdeploy.wsddQWeb Service Deployment Descriptor的羃写)Q这个文件负责描q服务的名称、入口等信息Q其内容如下Q?/p>
文gdeploy.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>
该文g也放到“……\webapps\axis\samples\capacity”目录下Q然后可以采用Axis提供的一个客L理工具——AdminClient来完成服务的定制发布?/p>
在“……\webapps\axis\samples\capacity”目录下Q运行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
可以看到以下q行l果Q?/p>
Processing file deploy.wsdd
<Admin>Doneprocessing</Admin>
q表明Capacity服务定制发布完成?/p>
通过讉Khttp://localhost:8080/axis/services/Capacity?wsdl可以看到q个服务的WSDL描述文gQ这说明Capacity服务被成功发布了。如下图所C:
服务的访?br />
GET方式的服务访?/b>
一般的SOAP消息都是采用POST方式实现传递,但也可以通过GET方式来访问。比如以下给出的一个服务——“HelloWorld”,其源码如下:
文gHelloWorld.jws
/**
* @author 飞鹰
*/
public class HelloWorld
{
public String helloWorld()
{
//在服务器端打印输?/p>
System.out.println( "Hello World!" );
//q回相应字符?/p>
return "Hello World!";
}//helloWorld()
}/* HelloWorld */
q个服务l出一个名位“helloWorld”的无入口参数的操作Q返回一个内容ؓ“Hello WorldQ的字符东y,同时在服务器端打印“Hello WorldQ”,该文g攑ֈ“……\webapps\axis”目录下Q即可通过GETҎ(gu)直接讉K该服务,讉K的地址为http://localhost:8080/axis/HelloWorld.jws?method=helloWorldQ可以看到返回的SOAP信封消息Q同时服务器端给Z相应的显CZ息“Hello WorldQ”这表明HelloWorld服务被成功访问了。如下图所C:
客户端服务访问编E?/b>
Axis提供了一套API来实现SOAPQ从http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文档?/p>
其中Qorg.apache.axis.client.Call和org.apache.axis.client.Service是两个比较常用的c,一般的客户端程序欲讉K一个Web ServiceӞ都要生成一个客L的Service对象和Call对象Q在讉K服务之前Q首先要对Call对象讄相应的参敎ͼ包括服务的位|、操作名、入口参数、返回值类型等Q最后调用Call对象的invokeҎ(gu)讉K服务?/p>
以下l出了一个客L讉KWeb服务的例E——AXISTest.javaQ?/p>
文gAXISTest.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();
//////////讉Kx发布的Distance服务
//讄讉K?/p>
call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );
//讄操作?/p>
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} ) + " 公里Q? );
//////////讉K定制发布的Capacity服务
call = ( Call ) service.createCall();
//讄讉K?/p>
call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );
//讄操作?/p>
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 */
~译q行后运行可以看C下的l果Q?/p>
190.0英里相当?05.71公里Q?/p>
10.0加仑相当?5.46升!
注意E序在访问即时发布的Distance服务和定制发布的Capacity服务时的不同Q前者的服务讉K点地址为http://localhost:8080/axis/HelloWorld.jwsQ而后者的则ؓhttp://localhost:8080/axis/services/Capacity?/p>
ȝ
Web Services是未来网l应用的发展方向QSOAP和WSDL是Web Services的核心协议,Axisl出了一个很好的SOAP实现Q它使得开发Web Services应用变得L而有?br />
注明
转蝲?span class="postbody">http://www.yesky.com/SoftChannel/72342371961929728/20030821/1723269.shtml