axis2实现WebService之复合类型数据的传递.docx
- 文档编号:2928941
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:5
- 大小:19.40KB
axis2实现WebService之复合类型数据的传递.docx
《axis2实现WebService之复合类型数据的传递.docx》由会员分享,可在线阅读,更多相关《axis2实现WebService之复合类型数据的传递.docx(5页珍藏版)》请在冰豆网上搜索。
axis2实现WebService之复合类型数据的传递
axis2实现WebService之复合类型数据的传递
接着昨天的程序,今天又进了一步,学习了webservice的复合类型数据的传递,尤其是教程上没有的部分,我自己尝试着写,虽说耗费了一个下午的时间,但是还是非常值的,废话少说,看招!
在实际的应用中,不仅需要使用WebService来传递简单类型的数据,有时也需要传递更复杂的数据,这些数据可以被称为复合类型的数据。
数组与类(接口)是比较常用的复合类型。
在Axis2中可以直接使用将WebService方法的参数或返回值类型声明成数组或类(接口)。
但要注意,在定义数组类型时只能使用一维数组,如果想传递多维数组,可以使用分隔符进行分隔,如下面的代码所示:
String[]strArray=newString[]{"自行车,飞机,火箭","中国,美国,德国",
"超人,蜘蛛侠,钢铁侠"};
上面的代码可以看作是一个3*3的二维数组。
在传递类的对象实例时,除了直接将数组类型声明成相应的类或接口,也可以将对象实例进行序列化,也就是说,将一个对象实例转换成字节数组进行传递,然后接收方再进行反序列化,还原这个对象实例。
下面的示例代码演示了如何传递数组与类(接口)类型的数据,并演示如何使用字节数组上传图像。
本示例的客户端代码使用Java编写。
要完成这个例子需要如下几步:
一、实现服务端代码
[java]viewplaincopy<spanstyle="font-size:
14px;">importjava.io.FileOutputStream;importdata.DataForm;publicclassComplexTypeService{//上传图像,imageByte参数表示上传图像文件的字节,//length参数表示图像文件的字节长度(该参数值可能小于imageByte的数组长度)publicbooleanuploadImageWithByte(byte[]imageByte,intlength){FileOutputStreamfos=null;try{//将上传的图像保存在D盘的test1.jpg文件中fos=newFileOutputStream("d:
\\test1.jpg");//开始写入图像文件的字节fos.write(imageByte,0,length);fos.close();}catch(Exceptione){returnfalse;}finally{if(fos!
=null){try{fos.close();}catch(Exceptione){}}}returntrue;}//返回一维字符串数组publicString[]getArray(){String[]strArray=newString[]{"自行车","飞机","火箭"};returnstrArray;}//返回二维字符串数组publicString[]getMDArray(){String[]strArray=newString[]{"自行车,飞机,火箭","中国,美国,德国","超人,蜘蛛侠,钢铁侠"};returnstrArray;}//返回DataForm类的对象实例publicDataFormgetDataForm(){returnnewDataForm();}//将DataForm类的对象实例序列化,并返回序列化后的字节数组publicbyte[]getDataFormBytes()throwsException{java.io.ByteArrayOutputStreambaos=newjava.io.ByteArrayOutputStream();java.io.ObjectOutputStreamoos=newjava.io.ObjectOutputStream(baos);oos.writeObject(newDataForm());returnbaos.toByteArray();}}</span>
二、实现DataForm类
[java]viewplaincopy<spanstyle="font-size:
14px;">packagedata;publicclassDataFormimplementsjava.io.Serializable{privateStringname="bill";privateintage=20;setter…………getter方法}</span>
三、发布WebService
由于本示例的WebService类使用了一个Java类(DataForm类),因此,在发布WebService之前,需要先将DataForm.class文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\classes\data目录中,然后将ComplexTypeService.class文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\pojo目录中,最后启动Tomcat(如果Tomcat已经启动,由于增加了一个DataForm类,因此,需要重新启动Tomcat)。
发布之后的结果如下图所示
[java]viewplaincopy<spanstyle="font-size:
14px;"></span>[java]viewplaincopy<palign="left"><spanstyle="color:
black;"></span><spanstyle="font-size:
14px;"></span></p><palign="left"><spanstyle="font-size:
14px;"></span></p><palign="left"><spanstyle="font-size:
14px;"><imgalt=""src="
四、使用Java编写调用WebService的客户端代码在客户端仍然使用了RPC的调用方式,代码如下:
[java]viewplaincopy<spanstyle="font-size:
14px;">packageclient;importjavax.xml.namespace.QName;importorg.apache.axis2.addressing.EndpointReference;importorg.apache.axis2.client.Options;importorg.apache.axis2.rpc.client.RPCServiceClient;publicclassComplexTypeRPCClient{publicstaticvoidmain(String[]args)throwsException{RPCServiceClientserviceClient=newRPCServiceClient();Optionsoptions=serviceClient.getOptions();EndpointReferencetargetEPR=newEndpointReference("http:
//localhost:
8080/axis2/services/ComplexTypeService");options.setTo(targetEPR);//下面的代码调用uploadImageWithByte方法上传图像文件//打开图像文件,确定图像文件的大小java.io.Filefile=newjava.io.File("f:
\\images.jpg");java.io.FileInputStreamfis=newjava.io.FileInputStream("f:
\\images.jpg");//创建保存要上传的图像文件内容的字节数组byte[]buffer=newbyte[(int)file.length()];//将图像文件的内容读取buffer数组中intn=fis.read(buffer);System.out.println("文件长度:
"+file.length());Object[]opAddEntryArgs=newObject[]{buffer,n};Class[]classes=newClass[]{Boolean.class};QNameopAddEntry=newQName("http:
//ws.apache.org/axis2","uploadImageWithByte");fis.close();//开始上传图像文件,并输出uploadImageWithByte方法的返回传System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0]);//下面的代码调用了getArray方法,并返回一维String数组opAddEntry=newQName("http:
//ws.apache.org/axis2","getArray");String[]strArray=(String[])serviceClient.invokeBlocking(opAddEntry,newObject[]{},newClass[]{String[].class})[0];for(Strings:
strArray)System.out.print(s+"");System.out.println();//下面的代码调用了getMDArray方法,并返回一维String数组opAddEntry=newQName("http:
//ws.apache.org/axis2","getMDArray");strArray=(String[])serviceClient.invokeBlocking(opAddEntry,newObject[]{},newClass[]{String[].class})[0];for(Strings:
strArray){String[]array=s.split(",");for(Stringss:
array)System.out.print("<"+ss+">");System.out.println();}System.out.println();//下面的代码调用了getDataForm方法,并返回DataForm对象实例opAddEntry=newQName("http:
//ws.apache.org/axis2","getDat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- axis2 实现 WebService 复合 类型 数据 传递