WebService传输复杂数据类型

  几天前只对其WebService传输简单数据类型进行了一些尝试。本次项目中将设计到如对象在内的复杂类型的传输,几天前的知识点显然不够,经过两天的翻看资料和赵家志等人的帮助,终于对 WebService 传输复杂数据类型的相关知识,或者说是步骤有了一些认识。以下演示的就是从客户端传一个 GoVO 对象到服务端,服务端经过处理,把数据封装成一个 GoPO 对象传到客户端,当然实际项目中没有这么简单,为了让自己不便于以后的知识点重构上有较大障碍,所以写下以下文字,希望从糟粕中提练精华。

首先,在服务端程序中编写提供服务的接口,以及接口中方法要调用或要返回的javabean对象(必须序列化),当然还有实现接口的类,不过不用写具体处理过程。

<o:p> </o:p>

package com.interfacepackge;<o:p></o:p>

public interface ServerProtInterface {<o:p></o:p>

    public GoPO getElement(GoVO vo);}<o:p></o:p>

import java.io.Serializable;<o:p></o:p>

public class GoPO implements Serializable{<o:p></o:p>

    private static final long serialVersionUID = 5292943075702291483L;<o:p></o:p>

    private String add;<o:p></o:p>

    public String getAdd(){return add;}<o:p></o:p>

    public void setAdd(String add){this.add = add;}<o:p></o:p>

}<o:p></o:p>

import java.io.Serializable;<o:p></o:p>

public class GoVO implements Serializable{<o:p></o:p>

    private static final long serialVersionUID = -8563449093441945059L;<o:p></o:p>

    private String title;<o:p></o:p>

    public String getTitle() {return title;}<o:p></o:p>

    public void setTitle(String title) {this.title = title;}<o:p></o:p>

}<o:p></o:p>

public class ServiceProtInterfaceImpl implements ServiceProtInterface {<o:p></o:p>

    public GoPO getElement(GoVO vo) {<o:p></o:p>

        return null;<o:p></o:p>

    }<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

然后把包含有接口和bean对象的文件拷贝到AXIS目录下的WEB-INF目录下,使用如下指令:(是一句命令!!)

<o:p> </o:p>

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<o:p></o:p>

<o:p> </o:p>

//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 服务描述文件

<o:p> </o:p>

2:有了temp.wsdl服务描述文件,就可以使用它来生成JAX-RPC 的框架,这个框架使得我们编程变得简单,在AXIS目录下的WEB-INF子目录,使用以下的命令就可以生成这个框架:(也是一句命令哦!!)

<o:p> </o:p>

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<o:p></o:p>

<o:p> </o:p>

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

<o:p> </o:p>

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

<o:p> </o:p>

*Interface.java:新的*Interface接口,它扩展了java.rmi.Remote接口;(客户端要用)

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

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

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

*SoapBindingSkeleton.java:服务端Skeleton

*SoapBindingStub.java:客户端Stub;(客户端要用)

GoVO.java:新的GoVO序列化对象;(客户端要用)-

GoPO.java:新的GoVO序列化对象;(客户端要用)

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

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

<o:p> </o:p>

然后可以摒弃我们刚才写的那些代码,把以上生成的框架拷贝到我们的工程中。并在*SoapBindingImpl.java编写服务端的业务方法实现代码;

<o:p> </o:p>

然后在***SoapBindingStub.java 文件 的对应位置添加如下代码:(目的是把我们在传输过程中使用的传输对象进行注册。以便它以流的方式传输。)

<o:p> </o:p>

QName  qn  = new QName( "OO", "OO");

_call.registerTypeMapping(com.interfacepackge.GoPO.class, qn,               

new org.apache.axis.encoding.ser.BeanSerializerFactory(com.interfacepackge.GoPO.class, qn),       

new org.apache.axis.encoding.ser.BeanDeserializerFactory(com.interfacepackge.GoPO.class, qn));

       

QName  qn1  = new QName( "OO", "OO");

_call.registerTypeMapping(com.interfacepackge.GoVO.class, qn1,               

new org.apache.axis.encoding.ser.BeanSerializerFactory(com.interfacepackge.GoVO.class, qn1),       

new org.apache.axis.encoding.ser.BeanDeserializerFactory(com.interfacepackge.GoVO.class, qn1));

<o:p> </o:p>

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

然后开始部署(此处需要把deploy.wsdd拷贝到WEB-INF目录下)

在控制台中,转到AXIS\WEB-INF,执行以下的命令就可以完成部署

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8090/axis/services/AdminService deploy.wsdd<o:p></o:p>

<o:p> </o:p>

OK,服务端完成了,接着我们需要干的是编写我们的客户端代码,在这之前需要把前面标有“客户端要用”的类的类文件打包,以便我们客户端导入。

客户端程序为:(需要导入AXIS引擎中lib里所有的jar文件)

public class ClientText {

       public static void main(String [] args){

              GoVO vo = new GoVO();

              vo.setTitle("丁一郎");

              ServerProtInterfaceServiceLocator locator = new ServerProtInterfaceServiceLocator();

              ServerProtInterface inter;

              try {

                     inter = locator.getWS_UP_OBJ ();

                     GoPO po = inter.getElement(vo);

                     System.out.println(po.getAdd());

              } catch (ServiceException e) {

                     // TODO 自动生成 catch

                     e.printStackTrace();

              } catch (RemoteException e) {

                     // TODO 自动生成 catch

                     e.printStackTrace();

              }

       }

}

<o:p> </o:p>

如果要远程调用此WebService,则应该把ServerProtInterfaceServiceLocator.源文件的URL地址改为IP地下。

private java.lang.String /WS_UP_OBJ _address = "http://localhost:8080/axis/services//WS_UP_OBJ ";

<o:p> </o:p>

这样就可以实现对远程访问了。以上客户端运行结果为:

丁一郎

<o:p> </o:p>

以上为WebService传输复杂数据类型,主要是通常三条命令来完成,其间生成的框架为我们的开发做了很多实质性的东西,至此WebService可以说是入门了吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值