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

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

 

package com.interfacepackge;

public interface ServerProtInterface {

    public GoPO getElement(GoVO vo);}

import java.io.Serializable;

public class GoPO implements Serializable{

    private static final long serialVersionUID = 5292943075702291483L;

    private String add;

    public String getAdd(){return add;}

    public void setAdd(String add){this.add = add;}

}

import java.io.Serializable;

public class GoVO implements Serializable{

    private static final long serialVersionUID = -8563449093441945059L;

    private String title;

    public String getTitle() {return title;}

    public void setTitle(String title) {this.title = title;}

}

public class ServiceProtInterfaceImpl implements ServiceProtInterface {

    public GoPO getElement(GoVO vo) {

        return null;

    }

}

 

然后把包含有接口和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;(客户端要用)

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

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

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

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

 

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

 

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

 

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));

 

接着,把编译后的服务端程序的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

 

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();

              }

       }

}

 

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

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

 

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

丁一郎

 

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

评论
发表评论

您还没有登录,请登录后发表评论

14489130
搜索本博客
博客分类
最近加入圈子
最新评论