一.简介
    
     什么是SOAP?SOAP是一个应用程序间的基于XML的通信工具和规范.SOAP最初由MicroSoft和Userland公司开发,已经演化了好几个版本,当前的版本SOAP1.1正飞速发展.W3C的XML协议工作组正努力把它发展为一个真正的开发的标准.SOAP1.2草案已经发布,它能澄清 1.1版规范的容易混淆的地方.
  
什么是Axis?Axis总体上是一个SOAP引擎,但又不仅仅是个引擎,它还:1)是一个简单的独立的服务器2)是一个可插入到servlet引擎(如Tomcat)中的服务3)可扩展的支持WSDL4)能根据WSDL产生JAVA文件/类5)包括一些例子程序6)包括一个可以监控TCP/IP包的工具
Axis起源于IBM的SOAP4J,是Apache SOAP的第三代产品,相对于以前的版本,它有如下特性:1)快速,它使用了基于事件的SAX解析机制.2)灵活,用户可以灵活定制扩展.3)稳定,接口将会变动很小.4)基于组件开发.5)支持WSDL1.1
    二.准备
    
     应用Axis开发Web Services,你需要安装如下软件:
    
     1.jdk1.5
    
     2.安装Tomcat5.0.28,这是当前稳定版本.Tomcat运行在80端口.访问
    
      http://localhost/8080
    
    检查Tomcat是否安装成功.
    
     3.下载AXIS:
    
     官方站点:http://xml.apache.org/axis/index.html
    
     下载软件:axis-bin-1_2_1.tar.gz
    
     4.下载相关包:
    
     a.mail.jar 下载地址:http://java.sun.com/products/javamail
    
     b.activation.jar 下载地址:http://java.sun.com/products/javabeans/glasgow/jaf.html
    
     c.xerces.jar 下载地址:http://xml.apache.org/xerces-j/index.html
    
     d.xmlsec-1.2.1.jar 下载地址:http://xml.apache.org/security/
  
    三.安装
    
     1.将jdk1.5.0_04安装在D:\jdk1.5.0_04下(当然安装路径可任意选)好后,环境变量配置如下:
    
     JAVA_HOME=D:\jdk1.5.0_04
    
     CLASSPATH=.;D:\jdk1.5.0_04\jre\lib\rt.jar;D:\jdk1.5.0_04\jre\lib\tools.jar
    
     Path=D:\jdk1.5.0_04\bin
    
     2.tomcat-5.0.28安装在D:\tomcat-5.0.28下(安装路径可任选)好后,环境变量配置如下:
    
     CATALINA_BASE=D:\tomcat-5.0.28
    
     CATALINA_HOME=D:\tomcat-5.0.28
    
     3.axis的安装
    
     a.将下载的Axis软件包解压缩,将其中的“webapps”目录下的“axis”目录整个拷贝到Tomcat安装目录下的“webapps”目录下。
    
     b.将mail.jar、activation.jar、xerces.jar、xmlsec-1.2.1.jar四个包,全部拷到D:\tomcat-5.0.28\webapps\axis\WEB-INF\lib下
    
     c.环境变量配置
    
     AXIS_HOME=D:\tomcat-5.0.28
  
    AXIS_LIB=%AXIS_HOME%\WEB-INF\lib
    
     AXISCLASSPATH=%AXIS_LIB%\activation.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.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%\mail.jar;AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\xerces.jar;%AXIS_LIB%\xmlsec-1.2.1.jar
  
    CLASSPATH=%AXIS_HOME%\WEB-INF\lib
    
     AXISCLASSPATH=%AXIS_LIB%\activation.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.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%\mail.jar;AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\xerces.jar;%AXIS_LIB%\xmlsec-1.2.1.jar
    
     这里有几点需要注意:中间不要有空格,包的名字可能有不同的版本,这时需要修改一下包名。
  
    四.测试
    
     安装配置完毕后,应测试一下是否tomcat、Axis可以正确运行了。
    
     启动Tomcat服务器,在浏览器中访问
    
      http://localhost:8080/axis/happyaxis.jsp
    
    ,如果页面显示有错误,则需要回头检查一下相关配置是否正确,如果浏览页面能正确显示出系统组件、属性等参数配置信息,则表示安装成功。现在可以开始开发你的Web Services应用了。 
  
    五、服务的发布
    
     Axis提供了两种服务发布方式,一种是即时发布(Instant Deployment),一种是定制发布(Custom Deployment)。
  
1. 使用即时发布 Java Web Service(JWS)
对即时发布的支持是Axis的特色之一,使用即时发布使用户只需有提供服务的Java类的源代码,即可将其迅速发布成Web服务。每当用户调用这类服务的时候,Axis会自动进行编译,即使服务器重启了也不必对其做任何处理,使用非常简单快捷。
      使用即时发布首先需要一个实现服务功能的Java源文件,将其扩展名改为.jws(Java Web Service的缩写),然后将该文件放到“……\webapps\axis”目录下即可。
    
      在此给出一个HelloWorld程序,其源码如下:
  
HelloWorld.java
    public class HelloWorld {
    
       public String sayHello()
    
       {
    
         return "HELLO WORLD!"; 
    
       } 
    
     }
  
    
     将其放到“……\webapps\axis”目录,通过访问
    
      http://localhost:8080/axis/HelloWorld.jws?wsdl
    
    可以看到这个服务的WSDL描述文件,这说明HelloWorld服务被成功发布了。
    
     现在写个客户端程序访问一下:
  
 TestClient.java
    
      TestClient.java
      2
 
      3
 import
    
    
       org.apache.axis.client.Call;
    
    
      import
    
    
       org.apache.axis.client.Call;
      4
 import
    
    
       org.apache.axis.client.Service;
    
    
      import
    
    
       org.apache.axis.client.Service;
      5
 
      6
 import
    
    
       javax.xml.rpc.ParameterMode;
    
    
      import
    
    
       javax.xml.rpc.ParameterMode;
      7
 
      8
 public
    
    
       
    
    
      class
    
    
       TestClient
    
    
      public
    
    
       
    
    
      class
    
    
       TestClient
      9
 {
      
    
    
    
      
        {
        10
 public
      
      
         
      
      
        static
      
      
         
      
      
        void
      
      
         main(String [] args) 
      
      
        throws
      
      
         Exception 
      
      
      
        
          {
        
           
      
      
        public
      
      
         
      
      
        static
      
      
         
      
      
        void
      
      
         main(String [] args) 
      
      
        throws
      
      
         Exception 
      
      
      
        
          {
          11
 
                 
          12
 String endpoint 
        
        
          =
        
        
           
        
        
          "
        
        
          http://localhost:
        
        
          "
        
        
           
        
        
          +
        
        
          "
        
        
          8080
        
        
          "
        
        
          +
        
        
           
        
        
          "
        
        
          /axis/HelloWorld.jws
        
        
          "
        
        
          ;
        
        
          //
        
        
          指明服务所在位置
                 String endpoint 
        
        
          =
        
        
           
        
        
          "
        
        
          http://localhost:
        
        
          "
        
        
           
        
        
          +
        
        
          "
        
        
          8080
        
        
          "
        
        
          +
        
        
           
        
        
          "
        
        
          /axis/HelloWorld.jws
        
        
          "
        
        
          ;
        
        
          //
        
        
          指明服务所在位置
        
        
          13
 
        
        
          14
 Service  service 
        
        
          =
        
        
           
        
        
          new
        
        
           Service();  
        
        
          //
        
        
          创建一个Service实例,注意是必须的!
                 Service  service 
        
        
          =
        
        
           
        
        
          new
        
        
           Service();  
        
        
          //
        
        
          创建一个Service实例,注意是必须的!
        
        
          15
 Call     call    
        
        
          =
        
        
           (Call) service.createCall();
        
        
          //
        
        
          创建Call实例,也是必须的!
        
        
                 Call     call    
        
        
          =
        
        
           (Call) service.createCall();
        
        
          //
        
        
          创建Call实例,也是必须的!
        
        
          16
 
        
        
          17
 call.setTargetEndpointAddress( 
        
        
          new
        
        
           java.net.URL(endpoint) );
        
        
          //
        
        
          为Call设置服务的位置
               call.setTargetEndpointAddress( 
        
        
          new
        
        
           java.net.URL(endpoint) );
        
        
          //
        
        
          为Call设置服务的位置
        
        
          18
 
        
        
          19
 call.setOperationName( 
        
        
          "
        
        
          sayHello
        
        
          "
        
        
           );
        
        
          //
        
        
          注意方法名与HelloWorld.java中一样!!
                  call.setOperationName( 
        
        
          "
        
        
          sayHello
        
        
          "
        
        
           );
        
        
          //
        
        
          注意方法名与HelloWorld.java中一样!!
        
        
          20
 
        
        
          21
 String res 
        
        
          =
        
        
           (String) call.invoke( 
        
        
          new
        
        
           Object[] 
        
        
        
          
            {}
          
        
        
           );
        
        
          //
        
        
          返回String,没有传入参数
          
                   String res 
        
        
          =
        
        
           (String) call.invoke( 
        
        
          new
        
        
           Object[] 
        
        
        
          
            {}
          
        
        
           );
        
        
          //
        
        
          返回String,没有传入参数
        
        
          22
 
        
        
          23
 System.out.println( res );
                                   System.out.println( res );
          24
 }
             }
        
      
      
        25
 }
        }
      
    
    
      26
 
    
  
    
     下面我们介绍第二种发布方式,这是常用的。
  
    我们的第二种发布方式:
    
     1、将HelloWorld.java编译成HelloWorld.class,放到%TOMCAT_HOME%\webapps\axis\WEB-INF\classes
  
下
2、在%TOMCAT_HOME%\webapps\axis\WEB-INF下新建deploy.wsdd文件,即SOAP服务发布描述文件
deploy.wsdd
    <deployment xmlns="
    
      http://xml.apache.org/axis/wsdd/
    
    " xmlns:java="
    
      http://xml.apache.org/axis/wsdd/providers/java
    
    ">
    
         <service name="HelloWorld" provider="java:RPC">
    
             <parameter name="className" value="HelloWorld"/>
    
             <parameter name="allowedMethods" value="sayHello"/>
    
         </service>
    
     </deployment>
  
    在DOS下转换目录到%TOMCAT_HOME%\webapps\axis\WEB-INF,命令:
    
     java org.apache.axis.client.AdminClient deploy.wsdd 后会出现
  
    Processing file deploy.wsdd
    
     <Admin>Done processing</Admin>
  
这时你会发现目录下多了一个server-config.wsdd文件,这就是AXIS的配置文件,以后所有的服务发布描述都会在里面找到。(当然,你可以直接修改它,不用再写deploy.wsdd)然后打开浏览器 http://localhost:8080/axis/services/HelloWorld?wsdl ,你就会看到你的服务已发布
同样用客户端程序访问一下:(注意和上边的差别!!)
 HelloClient.java
    
      HelloClient.java
      2
 
      3
 import
    
    
       org.apache.axis.client.Call;
    
    
      import
    
    
       org.apache.axis.client.Call;
      4
 import
    
    
       org.apache.axis.client.Service;
    
    
      import
    
    
       org.apache.axis.client.Service;
      5
 
      6
 public
    
    
       
    
    
      class
    
    
       HelloClient
    
    
      public
    
    
       
    
    
      class
    
    
       HelloClient
      7
 {
      
    
    
    
      
        {
        8
 public
      
      
         
      
      
        static
      
      
         
      
      
        void
      
      
         main(String [] args) 
      
      
        throws
      
      
         Exception 
      
      
      
        
          {
        
           
      
      
        public
      
      
         
      
      
        static
      
      
         
      
      
        void
      
      
         main(String [] args) 
      
      
        throws
      
      
         Exception 
      
      
      
        
          {
          9
 
          10
 String endpoint 
        
        
          =
        
        
           
        
        
          "
        
        
          http://localhost:
        
        
          "
        
        
           
        
        
          +
        
        
          "
        
        
          8080
        
        
          "
        
        
          +
        
        
           
        
        
          "
        
        
          /axis/services/HelloWorld
        
        
          "
        
        
          ;
        
        
          //
        
        
          注意!差别仅仅在这里!!
                 String endpoint 
        
        
          =
        
        
           
        
        
          "
        
        
          http://localhost:
        
        
          "
        
        
           
        
        
          +
        
        
          "
        
        
          8080
        
        
          "
        
        
          +
        
        
           
        
        
          "
        
        
          /axis/services/HelloWorld
        
        
          "
        
        
          ;
        
        
          //
        
        
          注意!差别仅仅在这里!!
        
        
          11
 
        
        
          12
 Service  service 
        
        
          =
        
        
           
        
        
          new
        
        
           Service();
                 Service  service 
        
        
          =
        
        
           
        
        
          new
        
        
           Service();
          13
 Call     call    
        
        
          =
        
        
           (Call) service.createCall();
                 Call     call    
        
        
          =
        
        
           (Call) service.createCall();
          14
 call.setTargetEndpointAddress( 
        
        
          new
        
        
           java.net.URL(endpoint) );
                 call.setTargetEndpointAddress( 
        
        
          new
        
        
           java.net.URL(endpoint) );
          15
 call.setOperationName(
        
        
          "
        
        
          sayHello
        
        
          "
        
        
            );
                  call.setOperationName(
        
        
          "
        
        
          sayHello
        
        
          "
        
        
            );
          16
 
          17
 String res 
        
        
          =
        
        
           (String) call.invoke( 
        
        
          new
        
        
           Object[] 
        
        
        
          
            {}
          
        
        
           );
          
                   String res 
        
        
          =
        
        
           (String) call.invoke( 
        
        
          new
        
        
           Object[] 
        
        
        
          
            {}
          
        
        
           );
          18
 
          19
 System.out.println( res );
                                   System.out.println( res );
          20
 }
             }
        
      
      
        21
 }
        }
      
    
    
      22
 
    
  
五.总结
Web Services是未来网络应用的发展方向,SOAP和WSDL是Web Services的核心协议,Axis给出了一个很好的SOAP实现,它使得开发Web Services应用变得轻松而有趣。


 
     
     
           
       
					 
					