转贴一下,不知道网址了使用WSAD5开发Axis应用  肖菁([email protected])
 软件工程师
 2004-1-2[文 章摘要] axis是apache提供的一个SOAP引擎,可以通过Axis来创建SOAP处理机-包括客户端、服务端等。本文中作者根据自己的使用经验,给出了在 WSAD5中集成AXIS来开发和发布基于Java的web服务的实际例子和操作过程,而且给出了作者经过研究和测试后找到的一种更加简单的定制发布基于 axis框架的web服务的方法。 
关键词: AXIS Web服务 WSAD1 Axis简介
Axis是apache组织提供的一个SOAP引擎,他提供了完整的SOAP解决方案,你可以使用axis来完成SOAP客户机、服务器、网关等的应用开发。
Axis是SOAP的后续版本(该项目的前身是IBM的"SOAP4J"),目前全部采用java开发,一个axis客户端的C++实现正在开发中, Axis的最新版本是1。1版。Axis中除了提供SOAP引擎之外,还提供了以下工具:从WSDL生成java类的工具,一个TCP/IP包的监视器工 具。
Axis1。1版本相比他的以前版本有了重大的改进,这些改进让Axis可伸缩性更好、管理更方便、同时支持SOAP和W3C中XML的新规范,Axis1。1提供了以下重要特性:
l 速度
  Axis1。1版本使用了SAX(事件驱动)来解析
  l 可伸缩
  Axis1。1版允许用户自由地扩展Axis的功能,用户可以加入他们想要增加的任何特性:个性化的信息头处理、扩展的系统管理和其他特性。
  2 稳定
  Axis中定义了一套稳定的发布接口(publicshed interface),他们不会随着axis的更新而更新,除非相关的标准发生了改变,这样减少了axis新发布版本中发生重构时对用户的影响。比如 axis中处理JAVA-RPC的接口就是一套稳定的发布接口(publicshed interface),他支持Java-RPC1。1规范,除非Java-RPC规范发生改变,这些接口都不会发生变化。
  3 基于组件的发布
  用户可以轻松的建立可重用的网络环境来实现处理工作处理的一些模式,或者将这些分发给自己的合作伙伴。
  4 传输框架
  Axis1。1版本中的网络传输设计中使用彻底的、简化的抽象,SOAP消息的发送方和接受方可以使用多种传输协议比如SMTP、FTP或者消息中间件等,Axis1。1版本的核心是独立于传输协议的。
  5 WSDL支持
  Axis1。1版本支持WSDL1。1版本,用户通过使用这个特性可以非常简单创建访问远程的web服务需要用到的类文件,也可以使用该特性从你的java类中自动生成正确的WSDL文档。
2 Axis支持的两种web服务发布方式
  Axis提供两种方式发布web服务:自动发布(Instant Deployment也有译作立即发布)和定制发布(Custom Deployment)。
  2.1 自动发布
  自动发布是指由开发者提供类文件,这个类文件的内容和通常的类没有任何区别,只是这个类文件不能使用被打包(也就是不能使用package),而且文 件的后缀名必须是。Jws(java web service),而不是通常的。Java,文件也不能放在web应用的WEB-INF\classes目录下,而是直接放在webapp目录或者其子目 录下(WEB-INF目录除外)。随后的工作全部由axis完成:定位这个类文件、将他编译成。Class、将针对这个文件的SOAP请求转化为对这个文 件的java调用。
比如:我们有一个web应用(他的上下文目录是axis),在他的根目录下建立一个HelloWorld。Jws的文件,那么我们可以通过http://ip地址:端口号/axis/HelloWorld.jws访问这个服务。
[注] 自动发布(JWS类型)的web服务是针对提供简单功能的web服务而设计的,这种web服务只有经过发布之后才能知道是否存在错误,所以如果你的web 服务需要实现比较复杂业务逻辑或者是某种商业产品的一部分,还是需要使用定制发布的web服务。

解决方案 »

  1.   

    2.2 定制发布
      依赖自动发布的web服务不是一个好的解决方法,因为这种发布方式需要有web服务的原代码文件支持,有些情况下根本无法实现,比如你需要将已经存在的系统中的某项功能发布成web服务,那么立即发布方式就力不从心了;另外在立即发布方式 中不支持自定义数据库类型映射和控制由哪种控制器处理客户的服务请求,这时我们就需要采用axis支持的另一种发布方式来发布我们的服务――定制发布。
    定制发布方式使用部属描述符(web service deployment descriptor,WSDD)来描述被发布的web服务,下面这段文字可以描述一个简单的web服务:
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="MyService" provider="java:RPC">
    <parameter name="className" value="samples.userguide.example3.MyService"/>
    <parameter name="allowedMethods" value="*"/>
    </service>
    </deployment>
    deployment的xmlns标识出这是WSDD的描述内容,xmlns:java属性定义了java的命名空间。
    service元素定义了真正的web服务的内容:
    l name属性是web服务的名称
    2 provider属性描述的是这个web服务的处理器类型,比如java:RPC表示是系统受到对该web服务的请求后将采用RPC类控制器进行处理,实 际处理类是org.apache.axis.providers.java.RPCProvider。
    3 parameter标签描述该web服务的其他内容,比如本例中第一个参数className标识出提供该服务的实际操作类 ――samples.userguide.example3.MyService,第二个属性"allowedMethods"表示该web服务提供的可 以被访问的方法:"*"表示他的所有方法都可以访问,也可将所有可用的方法名用空格或者comma隔开后合成一个字符串来描述这个web服务中可以提供的 方法,比如"getName getPwd"。
    这些特性只是WSDD特性的一小部分,更详细的关于WSDD特性的说明和使用方法请大家参考axis的帮助文档。
    3 操作过程
      3.1 下载Axis
      首先,我们必须下载axis的最新版本,目前的最新版本是1.1,可以到http: //ws.apache.org/axis/download.cgi下载,他提供了.tar.gz和.zip版本可供下载,请根据您的操作系统平台的选 择不同的下载文件,我们这里选择下载支持windows平台的二进制版本axis-1_1.zip.
      3.2 建立web项目
      在WSAD中创建一个web工程,web工程名为:axis,企业应用名为:DefaultEAR,工作台的路径为:E:\MyWork\WSAD5Workspace\axis
      3.2.1 加入对axis的支持
      l 解压缩axis-1_1.zip文件,可以看到如下图所示的目录结构  2 将axis-1_1\webapps\axis下面的所有文件和目录拷贝到WSAD中的web工程对应的webContent目录下,本例中应该拷贝到E:\MyWork\WSAD5Workspace\axis\axis\Web Content目录下,将axis-1_1\webapps\axis\WEB-INF\classes目录下的文件和目录拷贝到对应的web工程的java source目录下,本例中应该是E:\MyWork\WSAD5Workspace\axis\axis\Java Source目录下。
      3 刷新web工程,将这些修改更新到WSAD中
      3.2.2 验证Axis是否安装正确
      现在启动WSAD中的测试服务器,在浏览器的地址栏输入运行http://localhost:9080/axis/happyaxis.jsp,如果出现下面的画面,说明你的这个web工程已经可以支持Axis了.  3.3 开发立即发布的web服务
    我们在web content目录下新建立一个文件HelloWorld.jws,文件的内容如下:
    /*
    * 文件名: HelloWorld.jws 
    * 功 能:向请求服务的客户端返回一个字符串"Hello World!"
    */
    public class HelloWorld{
    public String getHelloString(){
    return "Hello World!";
    }
    }
    现在你就可以通过http://localhost:9080/axis/HelloWorld.jws访问到这个web服务了,如果你在浏览器中输入这 个地址,浏览器中的信息会提示你"这是一个web服务",你可以通过http://localhost: 9080/axis/HelloWorld.jws?wsdl来查看这个web服务的WSDL描述符。
    [注] 
    1. 这个文件的后缀名必须是.jws
    2. 由于这个.jws文件还是作为一个java类,然后被编译为.class文件,所以文件名和类的名字应该相同,而且仍然需要使用java类的命名规则,即首字母大写等。
    3.4 开发立即发布的web服务
    这个开发过程很简单,也就是开发一个java类,我们建立下面这个例子:
    package com.test;
    /**
    * 文件名: MyString.java
    * 功 能: 实现文本的大小写转换
    */
    public class MyString {
    /**
    * 将source中的所有字母变为大写
    */
    public String toUpperCase(String source){
    return source.toUpperCase();
    }
    /**
    * 将source中的所有字母变为小写
    */
    public String toLowerCase(String source){
    return source.toLowerCase();
    }
    }
      

  2.   

    重要的部分在于发布,axis提供了一个发布工具:adminclient,你需要编写一个发布的描述符文件--Deploy.wsdd,然后使用类 似java org.apache.axis.client.AdminClient deploy.wsdd这样的命令来完成部署工作,这部分工作需要设置路径等其他工作,比较繁琐,我这里给出的一个解决办法是我自己在使用过程中总结出的 一个快速发布的方法,不是规范的用法,但是可以达到同样的效果,大家可以参考,步骤如下:
    l 建立服务发布的配置文件
    axis的web服务需要配置文件,这个文件的名字是--server-config.wsdd,他应该位于WEB-INF目录下,安装的时候这个文件并 不存在,只有当你第一次发布一个web服务的时候才会自动生成,下面是一个server-config.wsdd的样本:
    <?xml version="1.0" encoding="UTF-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <globalConfiguration>
    <parameter name="adminPassword" value="admin"/>
    <parameter name="attachments.Directory" value="E:\MyWork\apusicworkspace\axisapplication\axistest\axisweb.war\WEB-INF\attachments"/>
    <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
    <parameter name="sendXsiTypes" value="true"/>
    <parameter name="sendMultiRefs" value="true"/>
    <parameter name="sendXMLDeclaration" value="true"/>
    <parameter name="axis.sendMinimizedElements" value="true"/>
    <requestFlow>
    <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="session"/>
    </handler>
    <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="request"/>
    <parameter name="extension" value=".jwr"/>
    </handler>
    </requestFlow>
    </globalConfiguration>
    <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
    <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
    <service name="Version" provider="java:RPC">
    <parameter name="allowedMethods" value="getVersion"/>
    <parameter name="className" value="org.apache.axis.Version"/>
    </service>
    <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="MyString" provider="java:RPC">
    <parameter name="allowedMethods" value="*"/>
    <parameter name="className" value="com.test.MyString"/>
    </service>
    <transport name="local">
    <responseFlow>
    <handler type="LocalResponder"/>
    </responseFlow>
    </transport>
    <transport name="http">
    <requestFlow>
    <handler type="URLMapper"/>
    <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
    </requestFlow>
    </transport>
    </deployment>
    请大家注意该样本中打了横线的部分,它是两个发布的web服务,经过作者的研究和测试发现:在Axis中发布web服务只需要在这个文件中增加一个 service的tag,然后设置一些属性和参数就可以了,他的属性和参数与简介中介绍的部属描述符(web service deployment descriptor,WSDD)的属性和参数保持一致,而且我们可以不用adminclient工具,只需要自己在WEB-INF下建立这个文件,将上 面这个样本文件内容拷贝/粘贴进去,也可以实现同样的效果。
      

  3.   

    you need add file soap.jar to Client's environment, if you want your Client Applet can invoke Webservices.
      

  4.   

    2 发布服务
    有了上面的工作,现在可以开始将前面提供的MyString类发布成web服务了,只需要在自己建立的配置文件中增加一个service的标签(tag),然后配置他的属性就可以了,具体配置信息如下:
    <service name="MyString" provider="java:RPC">
    <parameter name="allowedMethods" value="*"/>
    <parameter name="className" value="com.test.MyString"/>
    </service>
    修改后的配置文件全文如下: 
    <?xml version="1.0" encoding="UTF-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <globalConfiguration>
    <parameter name="adminPassword" value="admin"/>
    <parameter name="attachments.Directory" value="E:\MyWork\apusicworkspace\axisapplication\axistest\axisweb.war\WEB-INF\attachments"/>
    <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
    <parameter name="sendXsiTypes" value="true"/>
    <parameter name="sendMultiRefs" value="true"/>
    <parameter name="sendXMLDeclaration" value="true"/>
    <parameter name="axis.sendMinimizedElements" value="true"/>
    <requestFlow>
    <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="session"/>
    </handler>
    <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="request"/>
    <parameter name="extension" value=".jwr"/>
    </handler>
    </requestFlow>
    </globalConfiguration>
    <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
    <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
    <service name="MyService" provider="java:RPC">
    <parameter name="allowedMethods" value="*"/>
    <parameter name="className" value="samples.userguide.example3.MyService"/>
    </service>
    <service name="Version" provider="java:RPC">
    <parameter name="allowedMethods" value="getVersion"/>
    <parameter name="className" value="org.apache.axis.Version"/>
    </service>
    <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="MyString" provider="java:RPC">
    <parameter name="allowedMethods" value="*"/>
    <parameter name="className" value="com.test.MyString"/>
    </service>
    <transport name="local">
    <responseFlow>
    <handler type="LocalResponder"/>
    </responseFlow>
    </transport>
    <transport name="http">
    <requestFlow>
    <handler type="URLMapper"/>
    <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
    </requestFlow>
    </transport>
    </deployment>
      3.5 测试服务
      现在我们就可以写一个测试客户端来测试这个服务了,作者是建立tws.jsp来测试两个web服务,tws.jsp可以在作者提供的axis.war中找到,主要处理内容如下:
    Service service = new Service();
    Call call = (Call) service.createCall();
    String textToSend="bookman";
    //下面这段代码演示调用自动发布的web服务
    //设置web服务的位置
    call.setTargetEndpointAddress("http://localhost:9080/axis/HelloWorld.jws");
    //设置被调用的服务的名称和方法
    call.setOperationName( new QName("HelloWorld", "getHelloString") );
    //获取调用结果
    String ret = (String) call.invoke( new Object[] { } );out.println("现在测试自动发布的web服务 : HelloWorld.jws<br>");
    out.println("服务器的返回值 : " + ret);
    out.print("<br><br><br>");
    //下面这段代码演示调用定制发布的web服务
    //设置web服务的位置
    call.setTargetEndpointAddress("http://localhost:9080/axis/services/MyString");
    //设置被调用的服务的名称和方法
    call.setOperationName( new QName("MyString", "toUpperCase") );
    //传递参数
    call.addParameter( textToSend , XMLType.XSD_STRING, ParameterMode.IN);
    //设置返回类型
    call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
    //获取返回结果
    ret = (String) call.invoke( new Object[] { textToSend } );
    out.println("下面是测试定制发布的web服务的信息 : MyString<br>");
    out.println("您输入的是 : "+textToSend+"<br>" );
    out.println("服务器的返回值 : " + ret);
    在浏览器中打开http://localhost:9080/axis/tes.jsp可以看到执行结果:
    4 总结
      Axis是Apache组织提供的一个第三方web服务的实现框架,给我们提供了两种web服务发布方式可供选择: 自动发布和定制发布,而且提供了定制发布的工具-adminclient。
    本文中,作者根据自己的研究和开发经验,给出了使用IBM的开发工具WSAD来开发和发布基于axis框架的web服务的方法和实例,而且给出了定制发布web服务可以使用的更加简单的方法和使用说明,希望能够给大家一些帮助。
    参考资料:
    1. Axis 在线用户指导 
    http://cvs.apache.org/viewcvs/~checkout~/ws-axis/java/docs/user-guide.html
    2. Websphere Studio应用开发指南
    http://www-900.ibm.com/developerWorks/cn/wsdd/support/redbook/sg246134.pdf
    工具下载:
    1. axis1.1版
    http://ws.apache.org/axis/download.cgi
    2. websphere 5测试版
    http://www-3.ibm.com/software/websphere/info/platformv5/wstrialv5.jsp
      

  5.   

    楼上的文章真不错,谢谢了
    但是有一点不是很明白:call.setTargetEndpointAddress("http://localhost:9080/axis/services/MyString");
    call.setOperationName( new QName("MyString", "toUpperCase") );
    call.addParameter( textToSend , XMLType.XSD_STRING, ParameterMode.IN);
    call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );好象有介绍还加了下面2句,不知道具体什么意思?
    --------------------------------------------
    call.setUseSOAPAction(true);
    call.setSOAPActionURI("http://localhost:9080/axis/services/MyString");
    -----------------------------------------------------
    ret = (String) call.invoke( new Object[] { textToSend } );
      

  6.   

    要用Web service也要看你选用什么样的Application Server了。如果用Tomcat,那可以直接把axis搬过来用,如果要用JBoss的话,就不用axis了,现在的JBoss-4.0把Web Service这块称为JBossWS,它不在是像3.x版本是把axis plugin进来,而是从头按照J2EE1.3的规范来做的,虽然也用到了axis的一些核心代码,但是整体结构都变了。需要有Sun的JWSDP的支持,才能编译,前段时间有个项目就是基于这个做的,感觉开发不太方便。Web services对于异构系统的集成有优势,这点无庸质疑,但是你本身就是用的Java的客户端,还有必要用Web service吗?不要单纯的为了学技术而去做项目啊!