web service中返回复杂对象的方法

作者在 2007-07-08 23:28:00 发布以下内容

 

推荐使用(有复杂的数据对象传输时,定制发布)

1. 在服务端程序中先编写提供服务的接口,以及接口中方法要调用或要返回的javabean对象(必须序列化), 命令中-p指定接口中要用到对象的包路经。然后把包含有接口和bean对象的文件拷贝到AXIS目录下的WEB-INF子目录,使用如下指令:

java -Djava.ext.dirs=lib org.apache.axis.wsdl.Java2WSDL -o temp.wsdl -l"http://localhost:8090/axis/services/WS_UP_OBJ" -n "urn:WS_UP_OBJ" -p"com.lovo.upobj,com.lovo.upobj.po" "urn:WS_UP_OBJ" com.lovo.upobj.bo.UpObjIface

//WS_UP_OBJ 是 web service 的服务名,8090 是web服务的端口 ,WS_UP_OBJ可以修改为你自己定义的web service 的服务名
//com.lovo.upobj,com.lovo.upobj.po 接口中方法要调用或要返回的javabean对象
//com.lovo.upobj.bo.UpObjIface 为服务端 接口

运行上述命令 后,在当前目录可以得到 temp.wsdl 服务描述文件


2:有了temp.wsdl服务描述文件,就可以使用它来生成JAX-RPC 的框架,这个框架使得我们编程变得简单

在AXIS目录下的WEB-INF子目录,使用以下的命令就可以生成这个框架:

java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -S true -Nurn:WS_UP_OBJ com.lovo.upobj.bo temp.wsdl

//WS_UP_OBJ 是 web service 的服务名,com.lovo.upobj.bo 为服务端 接口 UpObjIface 所在的包

 

使用这个命令后将 在 包含有接口和bean对象的文件 中 生成以下新文件:

***Interface.java:新的***Interface接口,它扩展了java.rmi.Remote接口;

***InterfaceService.java:客户端服务接口,用来获得***Interface对象的引用;

***InterfaceServiceLocator.java:在客户端使用,主要用来服务定位;

***SoapBindingImpl.java:服务端实现类,它实现了***Interface接口,服务端的业务方法实现代码就在这里编写;

***SoapBindingSkeleton.java:服务端Skeleton;

***SoapBindingStub.java:客户端Stub;

BookVO.java:新的BookVO序列化对象;

deploy.wsdd:部署这个Web服务的脚本;

undeploy.wsdd:卸载这个Web服务的脚本。

在***SoapBindingImpl.java编写服务端的业务方法实现代码;

然后在***SoapBindingStub.java 文件 的对应返回 po对象 的方法中 注册 po 对象
QName  qn  = new QName( "TaxSgsWS" //服务名, "TaxSgsWS" //服务名);
   _call.registerTypeMapping(com.sgs.bank.CallPO.class, qn,               
  new org.apache.axis.encoding.ser.BeanSerializerFactory(com.sgs.bank.CallPO.class //po对象, qn),       
   new org.apache.axis.encoding.ser.BeanDeserializerFactory(com.sgs.bank.CallPO.class //po对象, qn));


3:接下来的工作是编译服务端相关的文件:生成.class 文件。(可以把web-info下的文件包copy回eclipse下编译成.class文件)

4:把编译后的服务端程序的class文件连同完整的包目录 拷贝到服务器相应部署目录下的 AXIS\WEB-INF\class子目录。

5: 部署
        在控制台中,转到deploy.wsdd所在的目录,执行以下的命令就可以完成部署(必须启动tomcat服务器)
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8090/axis/services/AdminService deploy.wsdd

卸载:
 在控制台中,转到undeploy.wsdd所在的目录,执行以下的命令就可以完成卸载
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8090/axis/services/AdminService undeploy.wsdd


6:修改server-config.wsdd,在<service name= "相应的web service服务名"></service>最后一行前 加入

<beanMapping languageSpecificType="java:com.sgs.bank.CallPO"
 qname="ns7:TaxSgsWS" xmlns:ns7="TaxSgsWS"/>

//com.sgs.bank.CallPO   是欲 返回的 可序列化的 javabean 对象,可修改为你自己的 对象。
//TaxSgsWS              web service 服务名,可改为你自己定义的 服务名

注意:6可以省略....(如果不能正常运行客服端时才用到).如果客服端和服务器不在一个进程调用时,需要将服务器产生的所需要的类(如果不清楚就将全部)打成jar以方便客服端调用.

webservice | 阅读 6296 次
文章评论,共0条
游客请输入验证码
浏览54950次