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

来源:互联网 发布:大数据中的云计算技术 编辑:程序博客网 时间:2024/05/26 08:43

 

 

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)JDK
3、 axis.jar
commons-discovery.jar
commons-logging.jar
jaxrpc.jar
log4j-1.2.8.jar
name.txt
saaj.jar
wsdl4j.jar
4、 集成开发环境(我的是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中就有你要的结果了。