﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-HHJ 人生在于总结-文章分类-Web Service</title><link>http://www.blogjava.net/hhj/category/9078.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:20:04 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:20:04 GMT</pubDate><ttl>60</ttl><item><title>转：用Axis开发基于Java的Web服务</title><link>http://www.blogjava.net/hhj/articles/37823.html</link><dc:creator>HHJ</dc:creator><author>HHJ</author><pubDate>Tue, 28 Mar 2006 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/hhj/articles/37823.html</guid><wfw:comment>http://www.blogjava.net/hhj/comments/37823.html</wfw:comment><comments>http://www.blogjava.net/hhj/articles/37823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhj/comments/commentRss/37823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhj/services/trackbacks/37823.html</trackback:ping><description><![CDATA[
		<strong>
				<font color="#ac0000">概述<br /><br /></font>
		</strong>　　本文介绍了一个比较简单实用的基于Java的SOAP引擎——Apache组织推出的Axis——的安装、配置和应用开发方法，希望对有兴趣做基于Java的Web Services应用开发的朋友有所帮助。<br /><br /><strong><font color="#ac0000">Axis简介<br /><br /></font></strong>　　Axis是Apache组织推出的SOAP引擎，Axis项目是Apache组织著名的SOAP项目的后继项目，目前最新版本是采用Java开发的1.1版本，C++的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。 
<p>　　<b>Axis的安装</b><br /><br />　　应用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”目录下即可。</p><p>　　<b>Axis的配置</b><br /><br />　　Axis基于Java开发，可以部署于多种操作系统，使用前需要配置一系列的系统变量，在此假定你已经在本机上装好了Tomcat 4.0以上的版本，需要配置的系统变量如下表所示：</p><p>CATALINA_HOME<br />C:\Tomcat_4_1</p><p>（此处应为Tomcat的安装位置，注意路径名中不要有空格）<br /><br />AXIS_HOME<br />%CATALINA_HOME%\webapps\axis<br /><br />AXIS_LIB<br />%AXIS_HOME%\lib<br /><br />AXISCLASSPATH<br />%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<br /></p><p>　　如果你不愿做这么繁琐的类路径设置，可以直接将axis软件包中“lib”目录下的所有.jar文件加入到系统环境变量CLASSPATH中即可。</p><p>　　<b>Axis的测试</b><br /><br />　　安装配置完毕后，应测试一下是否Axis可以正确运行了。</p><p>　　启动Tomcat服务器，在浏览器中访问<a href="http://localhost:8080/axis/happyaxis.jsp"><font color="#000000" size="2">http://localhost:8080/axis/happyaxis.jsp</font></a>，如果页面显示有错误，则需要回头检查一下相关配置是否正确，如果浏览页面能正确显示出系统组件、属性等参数配置信息，则表示安装成功，如下图所示：</p><p><img onerror="this.src='http://www.yesky.com/image20010518/60714.jpg';" hspace="3" src="http://www.yesky.com/image20010518/60714.jpg" align="center" vspace="1" border="1" /><br /><br />　　现在可以开始开发你的Web Services应用了。<br /><br /><strong><font color="#ac0000">服务的发布<br /><br /></font></strong>　　Axis提供了两种服务发布方式，一种是即时发布（Instant Deployment），一种是定制发布（Custom Deployment）。 </p><p></p><p>　　<b>使用即时发布</b><br /><br />　　对即时发布的支持是Axis的特色之一，使用即时发布使用户只需有提供服务的Java类的源代码，即可将其迅速发布成Web服务。每当用户调用这类服务的时候，Axis会自动进行编译，即使服务器重启了也不必对其做任何处理，使用非常简单快捷。</p><p>　　使用即时发布首先需要一个实现服务功能的Java源文件，将其扩展名改为.jws（Java Web Service的缩写），然后将该文件放到“……\webapps\axis”目录下即可。</p><p>　　在此给出一个从英里到公里的长度单位转换的服务，其源码如下：</p><p>文件Distance.jws<br /><br />/**</p><p>* @author 飞鹰</p><p>*/</p><p>public class Distance</p><p>{</p><p>public double convertMile2Kilometre( double mile )</p><p>{</p><p>//实现英里到公里的距离转换</p><p>return mile * 1.609;</p><p>}//convertMile2Kilometre()</p><p>}/* Distance */<br /></p><p>　　将其放到“……\webapps\axis”目录，通过访问<a href="http://localhost:8080/axis/Distance.jws?wsdl"><font color="#000000" size="2">http://localhost:8080/axis/Distance.jws?wsdl</font></a>可以看到这个服务的WSDL描述文件，这说明Distance服务被成功发布了。如下图所示：</p><p><img onerror="this.src='http://www.yesky.com/image20010518/60715.jpg';" hspace="3" src="http://www.yesky.com/image20010518/60715.jpg" align="center" vspace="1" border="1" /><br /><br />　　<b>使用定制发布</b><br /><br />　　即时发布是一项令人激动的技术，它使Web服务的开发变得如此简单；然而即时发布并不总是最好的选择，比如有些应用系统是第三方提供的，我们没有购买源代码，只有.class文件，但我们又希望将这个应用系统的一些功能对外发布成Web服务，使其能够在更大范围内产生作用，这个时候即时发布技术就无能为力了。此外，即时发布技术并不灵活，无法进行更多的服务配置，这使得它并不能满足一些特定系统的需求。</p><p>　　因此，Axis提供了另一种服务发布方式，这就是定制发布。</p><p>　　在此给出一个从加仑到升的容积单位转换的服务，其源码如下：</p><p>　　文件Capacity.java<br /><br />package samples.capacity;</p><p></p><p>/**</p><p>* @author 飞鹰</p><p>*/</p><p>public class Capacity</p><p>{</p><p>public double convertGallon2Litre( double gallon )</p><p>{</p><p>//实现加仑到升的容积转换</p><p>return gallon * 4.546;</p><p>}//convertGallon2Litre()</p><p>}/* Capacity */<br /></p><p>　　将其编译成.class文件，放置到“……\webapps\axis\samples\capacity”目录下，即可着手进行发布。</p><p>　　定制发布不需要构建.jws文件，但必须创建服务发布描述文件deploy.wsdd（Web Service Deployment Descriptor的缩写），这个文件负责描述服务的名称、入口等信息，其内容如下：</p><p>　　文件deploy.wsdd<br /><br />&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"</p><p>xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;</p><p></p><p>&lt;service name="Capacity" provider="java:RPC"&gt;</p><p>&lt;parameter name="className" value="samples.capacity.Capacity"/&gt;</p><p>&lt;parameter name="allowedMethods" value="*"/&gt;</p><p>&lt;/service&gt;</p><p></p><p>&lt;/deployment&gt;<br /></p><p>　　将该文件也放到“……\webapps\axis\samples\capacity”目录下，然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。</p><p>　　在“……\webapps\axis\samples\capacity”目录下，运行：</p><p>java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd<br /></p><p>　　可以看到以下运行结果：</p><p>Processing file deploy.wsdd</p><p>&lt;Admin&gt;Doneprocessing&lt;/Admin&gt;<br /></p><p>　　这表明Capacity服务定制发布完成。</p><p>　　通过访问<a href="http://localhost:8080/axis/services/Capacity?wsdl"><font color="#000000" size="2">http://localhost:8080/axis/services/Capacity?wsdl</font></a>可以看到这个服务的WSDL描述文件，这说明Capacity服务被成功发布了。如下图所示：</p><p><img onerror="this.src='http://www.yesky.com/image20010518/60716.jpg';" hspace="3" src="http://www.yesky.com/image20010518/60716.jpg" align="center" vspace="1" border="1" /><br /><br /><strong><font color="#ac0000"><br />服务的访问<br /><br /></font></strong>　　<b>GET方式的服务访问</b><br /><br />　　一般的SOAP消息都是采用POST方式实现传递，但也可以通过GET方式来访问。比如以下给出的一个服务——“HelloWorld”，其源码如下： </p><p></p><p>文件HelloWorld.jws<br /><br />/**</p><p>* @author 飞鹰</p><p>*/</p><p>public class HelloWorld</p><p>{</p><p>public String helloWorld()</p><p>{</p><p>//在服务器端打印输出</p><p>System.out.println( "Hello World!" );</p><p></p><p>//返回相应字符串</p><p>return "Hello World!";</p><p>}//helloWorld()</p><p></p><p>}/* HelloWorld */<br /></p><p>　　这个服务给出一个名位“helloWorld”的无入口参数的操作，返回一个内容为“Hello World！的字符串”，同时在服务器端打印“Hello World！”，将该文件放到“……\webapps\axis”目录下，即可通过GET方法直接访问该服务，访问的地址为http://localhost:8080/axis/HelloWorld.jws?method=helloWorld，可以看到返回的SOAP信封消息，同时服务器端给出了相应的显示信息“Hello World！”这表明HelloWorld服务被成功访问了。如下图所示：</p><p><img onerror="this.src='http://www.yesky.com/image20010518/60717.gif';" hspace="3" src="http://www.yesky.com/image20010518/60717.gif" align="center" vspace="1" border="1" /><br /><br />　　<b>客户端服务访问编程</b><br /><br />　　Axis提供了一套API来实现SOAP，从http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文档。</p><p>　　其中，org.apache.axis.client.Call和org.apache.axis.client.Service是两个比较常用的类，一般的客户端程序欲访问一个Web Service时，都要生成一个客户端的Service对象和Call对象，在访问服务之前，首先要对Call对象设置相应的参数，包括服务的位置、操作名、入口参数、返回值类型等，最后调用Call对象的invoke方法访问服务。</p><p>　　以下给出了一个客户端访问Web服务的例程——AXISTest.java：</p><p>　　文件AXISTest.java<br /><br />package axisexercise;</p><p></p><p>import org.apache.axis.client.Call;</p><p>import org.apache.axis.client.Service;</p><p>import org.apache.axis.encoding.XMLType;</p><p></p><p>import javax.xml.rpc.ParameterMode;</p><p></p><p>/**</p><p>* @author 飞鹰</p><p>*/</p><p>public class AXISTest</p><p>{</p><p>public static void main( String[] args ) throws Exception</p><p>{</p><p>Service service = new Service();</p><p>Call call = ( Call ) service.createCall();</p><p></p><p></p><p>//////////访问即时发布的Distance服务</p><p>//设置访问点</p><p>call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );</p><p></p><p>//设置操作名</p><p>call.setOperationName( "convertMile2Kilometre" );</p><p></p><p>//设置入口参数</p><p>call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );</p><p>call.setReturnType( XMLType.XSD_DOUBLE );</p><p>Double d1 = new Double( 190 );</p><p></p><p>//调用服务</p><p>System.out.println( d1 + " 英里相当于 " + </p><p>call.invoke( new Object[] {d1} ) + " 公里！" );</p><p></p><p></p><p></p><p>//////////访问定制发布的Capacity服务</p><p>call = ( Call ) service.createCall();</p><p>//设置访问点</p><p>call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );</p><p></p><p>//设置操作名</p><p>call.setOperationName( "convertGallon2Litre" );</p><p></p><p>//设置入口参数</p><p>call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );</p><p>call.setReturnType( XMLType.XSD_DOUBLE );</p><p>d1 = new Double( 10.00 );</p><p></p><p>//调用服务</p><p>System.out.println( d1 + " 加仑相当于 " + </p><p>call.invoke( new Object[] {d1} ) + " 升！" );</p><p>} //main()</p><p>}/* AXISTest */<br /></p><p>　　编译运行后运行可以看到以下的结果：</p><p>　　190.0英里相当于305.71公里！</p><p>　　10.0加仑相当于45.46升！<br />　 <br />　　注意程序在访问即时发布的Distance服务和定制发布的Capacity服务时的不同，前者的服务访问点地址为http://localhost:8080/axis/HelloWorld.jws，而后者的则为http://localhost:8080/axis/services/Capacity。</p><p>　　<b><font color="#ac000">总结</font></b><br /><br />　　Web Services是未来网络应用的发展方向，SOAP和WSDL是Web Services的核心协议，Axis给出了一个很好的SOAP实现，它使得开发Web Services应用变得轻松而有趣。<br /></p><p><b><font color="#ac000">        注明<br /><br /></font></b>       转载自<span class="postbody"><a href="http://www.yesky.com/SoftChannel/72342371961929728/20030821/1723269.shtml" target="_blank"><font color="#002c99">http://www.yesky.com/SoftChannel/72342371961929728/20030821/1723269.shtml</font></a></span><br /><br /></p><img src ="http://www.blogjava.net/hhj/aggbug/37823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhj/" target="_blank">HHJ</a> 2006-03-28 16:05 <a href="http://www.blogjava.net/hhj/articles/37823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>