




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
axis2实现WebService之复合类型数据的传递 接着昨天的程序,今天又进了一步,学习了webservice的复合类型数据的传递,尤其是教程上没有的部分,我自己尝试着写,虽说耗费了一个下午的时间,但是还是非常值的,废话少说,看招! 在实际的应用中,不仅需要使用WebService来传递简单类型的数据,有时也需要传递更复杂的数据,这些数据可以被称为复合类型的数据。数组与类(接口)是比较常用的复合类型。在Axis2中可以直接使用将WebService方法的参数或返回值类型声明成数组或类(接口)。但要注意,在定义数组类型时只能使用一维数组,如果想传递多维数组,可以使用分隔符进行分隔,如下面的代码所示:String strArray = new String 自行车,飞机,火箭,中国,美国,德国,超人,蜘蛛侠,钢铁侠 ; 上面的代码可以看作是一个3*3的二维数组。 在传递类的对象实例时,除了直接将数组类型声明成相应的类或接口,也可以将对象实例进行序列化,也就是说,将一个对象实例转换成字节数组进行传递,然后接收方再进行反序列化,还原这个对象实例。 下面的示例代码演示了如何传递数组与类(接口)类型的数据,并演示如何使用字节数组上传图像。本示例的客户端代码使用Java编写。要完成这个例子需要如下几步: 一、实现服务端代码java view plaincopy<span style=font-size:14px;>import java.io.FileOutputStream; import data.DataForm; public class ComplexTypeService / 上传图像,imageByte参数表示上传图像文件的字节, / length参数表示图像文件的字节长度(该参数值可能小于imageByte的数组长度) public boolean uploadImageWithByte(byte imageByte, int length) FileOutputStream fos = null; try / 将上传的图像保存在D盘的test1.jpg文件中 fos = new FileOutputStream(d:test1.jpg); / 开始写入图像文件的字节 fos.write(imageByte, 0, length); fos.close(); catch (Exception e) return false; finally if (fos != null) try fos.close(); catch (Exception e) return true; / 返回一维字符串数组 public String getArray() String strArray = new String 自行车, 飞机, 火箭 ; return strArray; / 返回二维字符串数组 public String getMDArray() String strArray = new String 自行车,飞机,火箭,中国,美国,德国, 超人,蜘蛛侠,钢铁侠 ; return strArray; / 返回DataForm类的对象实例 public DataForm getDataForm() return new DataForm(); / 将DataForm类的对象实例序列化,并返回序列化后的字节数组 public byte getDataFormBytes() throws Exception java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos); oos.writeObject(new DataForm(); return baos.toByteArray(); </span> 二、实现DataForm类java view plaincopy<span style=font-size:14px;>package data; public class DataForm implements java.io.Serializable private String name = bill; private int age = 20; settergetter方法 </span> 三、发布WebService 由于本示例的WebService类使用了一个Java类(DataForm类),因此,在发布WebService之前,需要先将DataForm.class文件复制到<Tomcat安装目录>webappsaxis2WEB-INFclassesdata目录中,然后将ComplexTypeService.class文件复制到<Tomcat安装目录>webappsaxis2WEB-INFpojo目录中,最后启动Tomcat(如果Tomcat已经启动,由于增加了一个DataForm类,因此,需要重新启动Tomcat)。发布之后的结果如下图所示java view plaincopy<span style=font-size:14px;></span> java view plaincopy<p align=left><span style=color:black;></span><span style=font-size:14px;> </span></p><p align=left><span style=font-size:14px;> </span></p><p align=left><span style=font-size:14px;><img alt= src=/uploads/201211/06/1352191996_1125.PNG></span></p> 四、使用Java编写调用WebService的客户端代码 在客户端仍然使用了RPC的调用方式,代码如下:java view plaincopy<span style=font-size:14px;>package client; import space.QName; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; public class ComplexTypeRPCClient public static void main(String args) throws Exception RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); EndpointReference targetEPR = new EndpointReference( http:/localhost:8080/axis2/services/ComplexTypeService); options.setTo(targetEPR); / 下面的代码调用uploadImageWithByte方法上传图像文件 / 打开图像文件,确定图像文件的大小 java.io.File file = new java.io.File(f:images.jpg); java.io.FileInputStream fis = new java.io.FileInputStream( f:images.jpg); / 创建保存要上传的图像文件内容的字节数组 byte buffer = new byte(int) file.length(); / 将图像文件的内容读取buffer数组中 int n = fis.read(buffer); System.out.println(文件长度: + file.length(); Object opAddEntryArgs = new Object buffer, n ; Class classes = new Class Boolean.class ; QName opAddEntry = new QName(/axis2, uploadImageWithByte); fis.close(); / 开始上传图像文件,并输出uploadImageWithByte方法的返回传 System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)0); / 下面的代码调用了getArray方法,并返回一维String数组 opAddEntry = new QName(/axis2, getArray); String strArray = (String) serviceClient.invokeBlocking(opAddEntry, new Object , new Class String.class )0; for (String s : strArray) System.out.print(s + ); System.out.println(); / 下面的代码调用了getMDArray方法,并返回一维String数组 opAddEntry = new QName(/axis2, getMDArray); strArray = (String) serviceClient.invokeBlocking(opAddEntry, new Object , new Class String.class )0; for (String s : strArray) String array = s.split(,); for (String ss : array) System.out.print(< + ss + > ); System.out.println(); System.out.println(); / 下面的代码调用了getDataForm方法,并返回DataForm对象实例 opAddEntry = new QName(/axis2, getDataForm); data.DataForm df = (data.DataForm) serviceClient.invokeBlocking( opAddEntry, new Object , new Class data.DataForm.class )0; System.out.println(df.getAge(); / 下面的代码调用了getDataFormBytes方法,并返回字节数组,最后将返回的字节数组反序列化后,转换成DataForm对象实例 opAddEntry = new QName(/axis2, getDataFormBytes); buffer = (byte) serviceClient.invokeBlocking(opAddEntry, new Object , new Class byte.class )0; java.io.ObjectInputStream ois = new java.io.ObjectInputStream( new java.io.ByteArrayInputStream(buffer); df = (data.DataForm) ois.readObject(); System.out.println(df.getName(); </span> 运行上面的程序,将输出如下的内容:文件长度:3617true自行车 飞机 火箭 <自行车> <飞机> <火箭><中国> <美国> <德国><超人> <蜘蛛侠> <钢铁侠>20 如果读者要上传大文件,应尽量使用FTP的方式来传递,而只通过WebService方法来传递文件名等信息。这样有助于提高传输效率。 以上的就是教程上的,照猫画虎,没什么技术含量,几分钟搞定,唯一需要的就是对java的io包,及java的输入输出要熟悉,不然就比较麻烦了。虽说自己懂了,但是看着客户端代码,我不禁问自己,调用webservice难道就这么复杂吗,有着现成的wsdl2java.bat我们为什么不用呢,难道教程上没有的我们就不学了吗?教程上的就一定是最好的吗?带着这些问题我开始了探索之旅,废话少说,看招! 生成stub类的方法我就不多讲了,不懂得朋友可以去看我的上一篇文章点击打开链接,引入生成的stub类,这个类是通过wsdl文件转化而来的,它把发布到webservice的方法封装成了类,把方法的参数封装成了方法(就像javabean一样的set方法一样),但是用当前类的对象去访问这个stub类的时候又是我们平常所熟悉的那样,没变,估计这么说也不明白,直接上代码。 java view plaincopy<span style=font-size:14px;>package client; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.rmi.RemoteException; import javax.activation.DataHandler; import javax.activation.DataSource; import data.DataForm; public class ComplexStubClient public static void main(String args) throws Exception ComplexTypeServiceStub stub = new ComplexTypeServiceStub(); ComplexTypeServiceStub.GetArray ga = new ComplexTypeServiceStub.GetArray(); ComplexTypeServiceStub.GetDataForm gdf = new ComplexTypeServiceStub.GetDataForm(); ComplexTypeServiceStub.GetDataFormBytes gdfb = new ComplexTypeServiceStub.GetDataFormBytes(); ComplexTypeServiceStub.GetMDArray gmda = new ComplexTypeServiceStub.GetMDArray(); ComplexTypeServiceStub.UploadImageWithByte uiwb = new ComplexTypeServiceStub.UploadImageWithByte(); upload(stub, uiwb); arrayOD(stub, ga); arrayMD(stub, gmda); dataForm(stub, gdf); dataFormByte(stub, gdfb); public static void dataFormByte(ComplexTypeServiceStub stub, ComplexTypeServiceStub.GetDataFormBytes gdfb) throws RemoteException, ComplexTypeServiceExceptionException, IOException, ClassNotFoundException DataHandler dh = stub.getDataFormBytes(gdfb).get_return(); /System.out.println(dh.getContent().getClass(); DataSource ds = dh.getDataSource(); java.io.ObjectInputStream ois = new java.io.ObjectInputStream(ds.getInputStream(); DataForm df = (data.DataForm) ois.readObject(); System.out.println(df.getName(); public static void dataForm(ComplexTypeServiceStub stub, ComplexTypeServiceStub.GetDataForm gdf) throws RemoteException client.ComplexTypeServiceStub.DataForm df = stub.getDataForm(gdf).get_return();/对象实例 System.out.println(df.getAge()+ +df.getName();/变量 public static void arrayMD(ComplexTypeServiceStub stub, ComplexTypeServiceStub.GetMDArray gmda) throws RemoteException String strArry = stub.getMDArray(gmda).get_return(); for(String s:strArry) String str = s.split(,); for(String s2:str) System.out.print(s2+ ); System.out.print( ); System.out.println(); public static void arrayOD(ComplexTypeServiceStub stub, ComplexTypeServiceStub.GetArray ga) throws RemoteException String strArry = stub.getArray(ga).get_return(); for(String s:strArry) System.out.print(s+ ); System.out.println(); public static void upload(ComplexTypeServiceStub stub, ComplexTypeServiceStub.UploadImageWithByte uiwb) throws FileNotFoundException, IOException, RemoteException File file = new File(f:images.jpg); FileInputStream fis = new FileInputStream(f:images.jpg); / 创建保存要上传的图像文件内容的字节数组 final byte buffer = new byte(int) file.length(); int n = fis.read(buffer); System.out.println(文件长度: + file.length(); uiwb.setLength(n); uiwb.setImageByte(new DataHandler(new DataSource() public InputStream getInputStream() return new ByteArrayInputStream(buffer); public OutputStream getOutputStream() return null; public String getContentType() return ; public String getName() return ; ); System.out.println(stub.uploadImageWithByte(uiwb).get_return(); </span> 在这个方法里应该着重强调的是upload(stub, uiwb);和 dataFormByte(stub, gdfb); upload(stub, uiwb);中setImageByte()方法中的参数在服务器端是字节数组类型的,但是到了stub类中奇迹般的变成了DataHandler类型,而这个类型是jdk1.6才有的,如下式API文档的介绍DataHandler 类为在多种不同源和格式下可用的数据提供一致的接口。它使用 DataContentHandler 管理简单流到字符串的转换以及相关操作。它提供对能够操作数据的命令的访问。使用 CommandMap 可以找到这些命令。有兴趣的可以自己去查一下,为了把字节数组转换成这种类型,我花了九牛二虎之力才达到,居然是要通过两层转化,还是内部类,哎,坑爹啊。如下图所示 最坑爹的还不是这个,到了dataFormByte(stub, gdfb);方法中又需要把DataHandler类型转化成字节数组类型,你说这不是耍我吗,就是这一耍,搞了我两个小时,不过从结果来看被耍的还是值的,哈哈,人怎么就这么贱呢。java view plainc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高铁预制箱梁施工课件
- 济南市2024-2025学年七年级下学期语文期中测试试卷
- 济南市2025-2026学年八年级上学期语文月考模拟试卷
- 高速路政日常工作课件
- 电芯销售知识培训内容课件
- 电脑知识应用培训记录课件
- 高考改革课件
- SGLT-2 抑制剂作用机制试卷及答案
- 电网廉洁从业课件
- 广西河池市凤山县2022-2023学年九年级上学期期中化学试题(含答案)
- 系统规划与管理师教程
- 导游如何提高自身的解说与讲解技能
- 《光的相干性》课件
- 2024年河北电工理论考试试题电工技师考试内容(全国通用)
- 铁路信号工(普速车站与区间信号设备维修)
- 一只窝囊的大老虎第二课时
- 新部编五年级上册语文全册表格式教案(含教学反思)
- 40篇 短文搞定3500词汇
- 什么是朗诵艺术与技巧
- C语言开发基础教程(Dev-C++)(第2版)PPT完整全套教学课件
- 卡通开学季收心班会幼儿开学第一课小学一二三年级开学第一课PPT通用模板课件开学主题班会
评论
0/150
提交评论