zoukankan      html  css  js  c++  java
  • WebSerivce之使用AXIS开发(转自勇哥的BLOG)

    一、 Axis 简介

    什么是SOAP?

    SOAP 是一个应用程序间的基于XML的通信工具和规范。SOAP最初由MicroSoftUserland公司开发,已经演化了好几个版本,当前的版本SOAP1.1正飞速发展。W3CXML协议工作组正努力把它发展为一个真正的开发的标准。SOAP1.2草案已经发布,它能澄清 1.1版规范的容易混淆的地方。

    SOAP 被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。

    什么是Axis?

    Axis Apache eXtensible Interaction System)是一款开源的WebService运行引擎,它是SOAP协议的一个实现,其本身来源于Apache的另一个项目Apache SOAP Axis分为1.x系列和Axis 2系列,两个系列体系结构和使用上有较大的区别,相对而言,Axis1.x更加稳定,文档也比较齐全,因此本文内容以Axis 1.x系列最新版本1.4为基础,AxisC++Java两个版本的实现,本文描述Java版的Axis

     

    Axis 总体上是一个SOAP引擎。但又不仅仅是个引擎。它还:

    1)是一个简单的独立的SOAP服务器。

    2)是一个可插入到servlet引擎(Tomcat)中的服务。

    3)对WSDL的扩展支持。

    4)能将WSDL描述产生JAVA文件/类的工具。

    5)包括一些例子程序。

    6)包括一个可以监控TCP/IP包的工具。

    Axis
    起源于IBMSOAP4J,属于最早的一批用于构造基于SOAP应用的Framework。是Apache SOAP的第三代产品,,其核心是一个SOAP处理器,用于开发包括客户端,服务器端,SOAP Gateway等各种应用。相对于以前的版本,它有如下特性:

    1)快速,使用基于事件的SAX解析机制而不是DOM来处理XML请求。

    2)灵活,用户可以灵活定制扩展。

    3)稳定,接口将会变动很小。

    4)基于组件开发。

    5Transport 框架 - Axis的核心和底层的transport完全分离,也就是说不管WSTransportHTTP FTP MAILMESSAGE QUEUE,只要插入对应的Transport模块即可,而不需改动其他部分。

    6 )支持 WSDL1.1 ,可自动由 Java Object 生成 WSDL

     

    在目前发行1.1版本中有什么东西?
    1SOAP1.1/1.2引擎。
    2)灵活的配置和部署系统。
    3)支持及时自动生成SOAP服务(JWS)。
    4)支持所有的基本数据类型,为自定义串行操作提供类型映射系统。
    5JavaBean的自动串行操作,包括将自定义属性类型映射到XML的属性和元素。
    6RPC和基于消息的SOAP服务提供者。
    7)从部署好的服务自动生成WSDL
    8WSDL2Java工具可以从WSDL描述文件中产生相应的客户和服务器端SOAP操作框架。
    9)初步提供安全扩展,能够与Servlet2.2安全集成。
    10)通过HTTP Cookie和与传输无关的SOAP头信息提供会话跟踪。
    11)初步支持带附件的SOAP消息。
    12)在EJB方面提供把EJB作为Web服务的访问途经。
    13)基于ServletHTTP传输。
    14)基于JMS的传输。
    15)独立的服务器(但需要HTTP 服务器和Servlet容器支持)。
    16)提供客户端、服务器端相关应用程序的样例。


    Axis
    的运行需要如下组件包:

    • SAAJ API( javax.xml.soap.SOAPMessage ) saaj.jar
    • JAX-RPC API( javax.xml.rpc.Service ) jaxrpc.jar
    • Apache-Axis( org.apache.axis.transport.http.AxisServlet ) axis.jar
    • Jakarta-Commons Discovery(org.apache.commons.discovery.Resource) commons-discovery.jar
    • Jakarta-Commons Logging(org.apache.commons.logging.Log) commons-logging-api.jar
    • Log4j(org.apache.log4j.Layout)log4j.jar
    • IBM's WSDL4Java(com.ibm.wsdl.factory.WSDLFactoryImpl) wsdl4j.jar
    • 下面非必须:
    • JAXP implementation[ Processing XML with Java ](javax.xml.parsers.SAXParserFactory )
    • Activation API(javax.activation.DataHandler ) activation.jar

     

    二、Axis的安装

    应用Axis开发Web Services,你需要安装如下软件:

    1.JDK

    2. 一个支持Servlet的服务器引擎,比如:Tomcat

    当安装好Tomcat之后,只需将下载的Axis软件包解压缩,将其中的“webapps”目录下的“axis”目录整个拷贝到Tomcat安装目录下的“webapps”目录下即可。

     

    三、Axis的测试

    安装配置完毕后,应测试一下是否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源文件,将其扩展名改为.jwsJava Web Service的缩写),然后将该文件放到“……\webapps\axis”(只能放在axis根目录)目录下即可。

        在此给出一个从英里到公里的长度单位转换的服务,其源码如下:

    文件Distance.jws

    public class Distance

    {

        public double convertMile2Kilometre( double mile )

        {

            return mile * 1.609;  // 实现英里到公里的距离转换

        }

    }

    将其放到“……\webapps\axis

    目录,通过访问http://localhost:8080/axis/Distance.jws?wsdl

    可以看到这个服务的WSDL描述文件,这说明Distance服务被成功发布了。

    编译后的文件: axis\WEB-INF\jwsClasses\Distance.class,访问

    http://localhost:8080/axis/Distance.jws?method=convertMile2Kilometre&mile=1000 可以看到执行结果。

    需要注意的是: JWS web 服务发布是一个很简单的 Web 服务发布方式,在页面中你不能使用包,而且由于代码是在运行期被编译的,所以在部署之后,你也很难找到错误所在。

     

    2. 使用定制发布 Web Service Deployment Descriptor(WSDD)

     

       即时发布是一项令人激动的技术,它使Web服务的开发变得如此简单;然而即时发布并不总是最好的选择,比如有些应用系统是第三方提供的,我们没有购买源代码,只有.class文件,但我们又希望将这个应用系统的一些功能对外发布成Web服务,使其能够在更大范围内产生作用,这个时候即时发布技术就无能为力了。此外,即时发布技术并不灵活,无法进行更多的服务配置,这使得它并不能满足一些特定系统的需求。

      因此,Axis提供了另一种服务发布方式,这就是定制发布。

      在此给出一个从加仑到升的容积单位转换的服务,其源码如下:

      文件Capacity.java

        package test.capacity;

        public class Capacity

        {

            public double convertGallon2Litre( double gallon )

             {

               return gallon * 4.546;// 实现加仑到升的容积转换

              }//convertGallon2Litre()

         }

    将其编译成.class文件,放置到“……

    \webapps\axis\WEB-INF\classes\test\capacity ”目录下,即可着手进行发布。

        定制发布不需要构建.jws文件,但必须创建服务发布描述文件deploy.wsddWeb 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="test.capacity.Capacity"/>

            <parameter name="allowedMethods" value="*"/>

        </service>

    </deployment>

     

        在这里服务的提供者是“java:RPC”,它被内建在Axis中,而且指明了一个JAVA RPC服务,做这个处理的类是org.apache.axis.providers.java.RPCProvider

        我们是通过一个<parameter>标签告诉RPC服务应该调用的类,而另外一个<parameter>标签则告诉引擎,它可以调用这个类中的任何的Public方法。你也可以指定通过使用名字空间或者一些可以调用的方法列表,来指明那些方法可以被调用。

     

      将该文件也放到“……\webapps\axis\WEB-INF\classes\test\capacity”目录下,然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。

       在“……\webapps\axis\test\capacity”目录下,运行:

     

    set axis_lib=C:\apache-tomcat-5.5.17\webapps\axis\WEB-INF\lib

    set axis_path=%axis_lib%\axis.jar;%axis_lib%\commons-discovery.jar;%axis_lib%\jaxrpc.jar;%axis_lib%\commons-logging.jar;%axis_lib%\log4j.jar;%axis_lib%\wsdl4j.jar;%axis_lib%\saaj.jar

     

    java -classpath %axis_path% org.apache.axis.client.AdminClient deploy.wsdd

    java -cp %axis_path% org.apache.axis.client.AdminClient list

       

     

       如果运行时说没有找到类,那么可能是类路径没有配置好,建议将所有的与axis相关的jar都写到classpath中去。这样只要运行:

     

       java org.apache.axis.client.AdminClient deploy.wsdd

       可以看到以下运行结果:

     

     Processing file deploy.wsdd

     <Admin>Doneprocessing</Admin>

     

    这表明Capacity服务定制发布完成。

     

    发布完成会增加或更新WEB-INF\server-config.wsdd的文件或内容。

     

    <!-- handler -->

        <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder" />

        <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />

        <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />

       

        <!-- 系统服务

        <service name="AdminService" provider="java:MSG">

           <parameter name="allowedMethods" value="AdminService" />

           <parameter name="enableRemoteAdmin" value="false" />

           <parameter name="className" value="org.apache.axis.utils.Admin" />

           <namespace>http://xml.apache.org/axis/wsdd/</namespace>

        </service>

        <service name="Version" provider="java:RPC">

           <parameter name="allowedMethods" value="getVersion" />

           <parameter name="className" value="org.apache.axis.Version" />

        </service>

         -->

        <!-- 自定义服务 -->

        <service name="Capacity" provider="java:RPC">

           <parameter name="allowedMethods" value="*" />

           <parameter name="className" value="test.capacity.Capacity" />

        </service>

            

        <!-- transport to handler -->

        <transport name="http">

           <requestFlow>

               <handler type="URLMapper" />

               <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />

           </requestFlow>

           <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler" />

           <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler" />

           <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler" />

           <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler" />

           <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler" />

           <parameter name="qs.wsdl"   value="org.apache.axis.transport.http.QSWSDLHandler" />

        </transport> 

        <transport name="local">

           <responseFlow>

               <handler type="LocalResponder" />

           </responseFlow>

        </transport>

     

       你也可以调用:

    undeploy.wsdd 文件:

    <undeployment

        xmlns="http://xml.apache.org/axis/wsdd/"

        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

        <service name="Capacity"/>

    </undeployment>

     

     java org.apache.axis.client.AdminClient undeploy.wsdd  来取消部署。

     

       你也可以调用:

     java org.apache.axis.client.AdminClient list 来获得所有的已经部署的服务的列表。在这里你会看到services, handlers, transports等等,注意这个调用只是列出了WEB-INF\server-config.wsdd的文件内容。

     

       一定要注意:编译后的class文件要拷贝到web-inf/classes的目录中,如果该文件中有包存在的话,别忘了还要在classes目录下创建包的目录。

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

       你也可以通过访问http://localhost:8080/axis/servlet/AxisServlet查看所有定制发布的服务。

    访问:

    http://localhost:8080/axis/services/Capacity?method=convertGallon2Litre&gallon=100 可以看到执行结果。

     

     Web.xml

    <servlet>

           <servlet-name>AxisServlet</servlet-name>

           <servlet-class>

               org.apache.axis.transport.http.AxisServlet

           </servlet-class>

        </servlet>

        <servlet-mapping>

           <servlet-name>AxisServlet</servlet-name>

           <url-pattern>*.jws</url-pattern>

        </servlet-mapping>

        <servlet-mapping>

           <servlet-name>AxisServlet</servlet-name>

           <url-pattern>/servlet/AxisServlet</url-pattern>

        </servlet-mapping>  

        <servlet-mapping>

           <servlet-name>AxisServlet</servlet-name>

           <url-pattern>/services/*</url-pattern>

        </servlet-mapping>  

       

        <servlet>

           <servlet-name>AdminServlet</servlet-name>

           <servlet-class>

               org.apache.axis.transport.http.AdminServlet

           </servlet-class>

           <load-on-startup>100</load-on-startup>

        </servlet>

        <servlet-mapping>

           <servlet-name>AdminServlet</servlet-name>

           <url-pattern>/servlet/AdminServlet</url-pattern>

        </servlet-mapping>

  • 相关阅读:
    (转)史上最全的程序员求职渠道总结
    位置无关码 位置相关码
    家用小感冒药方
    w7安装双系统
    vs2010安装的一些问题
    血红蛋白值的临床意义(hemoglobin ,Hb,HGB)
    小样式
    第一章:认识Yii
    2016该不该买房
    PHP函数处理函数实例详解
  • 原文地址:https://www.cnblogs.com/zhuyx/p/10401998.html
Copyright © 2011-2022 走看看