java调用.NET的webservice实例的二种方法soap方式axis模式

时间:2022-10-24 20:58:20

 

 

Apache Axis 是Apache WebService项目中的子项目,其最初起源于IBM的"SOAP4J",应该属于最早的一批用于构造基于SOAP应用的Framework。 目前Apache Axis已经发展到了第三代,其核心是一个SOAP处理器,用于开发包括客户端,服务器端,SOAP Gateway等各种应用。事实上Apache Axis在了1.0版后,其发行版本还包括了完整的J2EE服务器插件, WSDL支持和生成,TCP/IP监视器等组件,从这个意义上来说Apahce Axis已不仅仅是个SOAP框架了,它包含了除了UDDI外对整个Web Service协议栈(Protocol Stack)的支持。

       AXIS研究的时间不长,在下在到的AXIS包中有一个类叫WSDL2Java,从字面意思就能够理解到这个工具是做什么的。既:提供要调用的webservice描述WSDL,然后生成调用的时候需要的JAVA程序,目前为止我也是只研究到这,因为我们在调用另一个公司提供的webservice的时候对方返回的信息就是dataset,我用soap的方法已经没有办法实现了(后来调查是可以实现的,但是相当麻烦),经商议以后决定修改对方的webservice,将返回的dataset强制tostring,然后再返回到JAVA中作处理。虽然解决了问题,但是改动对方的webservice有损webservice的意义,所以就使用了AXIS。从网上查资料的时候查到了WSDL2JAVA这个类。对于编写基于AXIS方法能够调用.NET的JAVA程序,你必须有一下几个工具:1、 操作系统2、 (我使用的是j2sdk1.4.2)JDK3、 axis.jarcommons-discovery.jarcommons-logging.jarjaxrpc.jarlog4j-1.2.8.jarname.txtsaaj.jarwsdl4j.jar4、 集成开发环境(我的是Eclipse3.1.1)将axis包中的jar文件存到jdk下面,在windows控制台中进入jdk目录,然后运行Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost/Add.asmx?wsdl命令,注意:http://localhost/Add.asmx?wsdl 是你要的文件调用的webservice程序的地址,就是上文说到的那个wsdl文件,如果java环境没有问题的话,wsdl2java就应该将生成的java文件包,存放到jdk主目录下面。你的第一步成功了,生成的文件就能够实现粗略的功能了。

WSDL2Java生成的文件总结如下:

Client-side Bindings

Sample:    java org.apache.axis.wsdl.WSDL2Java AddressBook.wsdl

WSDL 子句

生成的Java

为在type区的每个条目

一个Java

一个Holder类,如果此type被用作inout/out参数

为每个portType

一个Java接口

为每个binding

一个Stub

为每个service

一个service接口

一个service实现(作为定位器)

Server-side Bindings

Sample: java org.apache.axis.wsdl.WSDL2Java --server-side AddressBook.wsdl

WSDL 子句

生成的Java

为每个binding

一个Skeleton(—skeletonDeploy设为true)

一个实现模板类(供用户修改为自己的实现)

为所有的services

一个deploy.wsdd文件

一个undeploy.wsdd文件

命令参数参考:

Usage:
  
java org.apache.axis.wsdl.WSDL2Java [options] WSDL-URI
Options:
-h, --help打印帮助信息后退出-v, --verbose打印报告信息-n, --noImports只生成直接的WSDL代码文档-O, --timeout <argument>超时秒数(默认45秒, -1表示不限定)-D, --Debug打印调试信息-W, --noWrapped关闭装订(wrapped)文档/文字支持-s, --server-side为web service发布服务端绑定-S, --skeletonDeploy <argument>在deploy.wsdd中展开纲要(true)或执行(false)。
默认为false。假定server-side.
-N, --NStoPkg <argument>=<value>命名空间到包的映射-f, --fileNStoPkg <argument>命名空间到包的映射文件(默认为NStoPkg.properties)

-p, --package <argument>用包名称覆盖所有的命名空间到包的映射-o, --output <argument>发行文件的输出目录-d, --deployScope <argument>增加范围到deploy.xml: Application(应用), Request(请求), Session(会话)-t, --testCase为web service发行junit测试用例类-a, --all为所有元素生成代码,包括未引用的元素-T, --typeMappingVersion指示1.1或1.2版. 默认为1.1版(SOAP 1.1适用JAX-RPC. 1.2标志SOAP 1.1编码.)-F, --factory <argument>执行GeneratorFactory接口的用户类名称(扩展Java generation函数)-i, --nsInclude <namespace>包含在生成代码中的特定命名范围(默认为所有命名空间,除非用-x选项)-x, --nsExclude <namespace>从生成代码中排除的特定命名空间(默认为none,排除直到第一个用-i选项包含的命名空间)-p, --property <name>=<value>用户GeneratorFactory的属性名称和值-H, --helperGen为meta数据发行分离Helper类-U, --user <argument>访问WSDL-URI的用户名-P, --password <argument>访问WSDL-URI的密码-c, --implementationClassName <argument> 用该项作为实现类假如我要调用的webservice中的laiheng方法,在生成的文件中就有LaihengResponseLaihengResult.Java文件,其中有一块是这样写的:    public LaihengResponseLaihengResult(           org.apache.axis.message.MessageElement [] _any) {           this._any = _any;}_any中就有你要的结果了。