WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx

上传人:b****5 文档编号:21305346 上传时间:2023-01-29 格式:DOCX 页数:7 大小:30.33KB
下载 相关 举报
WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx_第1页
第1页 / 共7页
WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx_第2页
第2页 / 共7页
WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx_第3页
第3页 / 共7页
WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx_第4页
第4页 / 共7页
WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx

《WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx》由会员分享,可在线阅读,更多相关《WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。

WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx

上传图像,imageByte参数表示上传图像文件的字节,

length参数表示图像文件的字节长度(该参数值可能小于imageByte的数组长度)

boolean 

uploadImageWithByte(byte[] 

imageByte, 

int 

length)

FileOutputStream 

fos 

null;

try

将上传的图像保存在D盘的test1.jpg文件中

new 

FileOutputStream("

d:

\\test1.jpg"

);

开始写入图像文件的字节

fos.write(imageByte, 

0, 

length);

fos.close();

}

catch 

(Exception 

e)

return 

false;

finally

if 

(fos 

!

null)

true;

返回一维字符串数组

String[] 

getArray()

strArray 

String[]{ 

"

自行车"

 

飞机"

火箭"

};

strArray;

返回二维字符串数组

getMDArray()

;

返回DataForm类的对象实例

DataForm 

getDataForm()

DataForm();

将DataForm类的对象实例序列化,并返回序列化后的字节数组

byte[] 

getDataFormBytes() 

throws 

Exception 

java.io.ByteArrayOutputStream 

baos 

java.io.ByteArrayOutputStream();

java.io.ObjectOutputStream 

oos 

java.io.ObjectOutputStream(baos);

oos.writeObject(new 

DataForm());

baos.toByteArray();

二、实现DataForm类

DataForm是要返回的对象实例所对应的类,该类的实现代码如下:

package 

data;

implements 

java.io.Serializable

private 

String 

name 

bill"

age 

20;

getName()

name;

void 

setName(String 

name)

this.name 

getAge()

age;

setAge(int 

age)

this.age 

三、发布WebService

由于本示例的WebService类使用了一个Java类(DataForm类),因此,在发布WebService之前,需要先将DataForm.class文件复制到<

Tomcat安装目录>

\webapps\axis2\WEB-INF\classes\data目录中,然后将ComplexTypeService.class文件复制到<

\webapps\axis2\WEB-INF\pojo目录中,最后启动Tomcat(如果Tomcat已经启动,由于增加了一个DataForm类,因此,需要重新启动Tomcat)。

四、使用Java编写调用WebService的客户端代码

在客户端仍然使用了RPC的调用方式,代码如下:

client;

javax.xml.namespace.QName;

org.apache.axis2.addressing.EndpointReference;

org.apache.axis2.client.Options;

org.apache.axis2.rpc.client.RPCServiceClient;

ComplexTypeRPCClient

static 

main(String[] 

args) 

Exception

RPCServiceClient 

serviceClient 

RPCServiceClient();

Options 

options 

serviceClient.getOptions();

EndpointReference 

targetEPR 

EndpointReference(

http:

//localhost:

8080/axis2/services/ComplexTypeService"

options.setTo(targetEPR);

下面的代码调用uploadImageWithByte方法上传图像文件

/////////////////////////////////////////

打开图像文件,确定图像文件的大小

java.io.File 

file 

java.io.File("

f:

\\images.jpg"

java.io.FileInputStream 

fis 

java.io.FileInputStream("

创建保存要上传的图像文件内容的字节数组

buffer 

byte[(int) 

file.length()];

将图像文件的内容读取buffer数组中

fis.read(buffer);

System.out.println("

文件长度:

file.length());

Object[] 

opAddEntryArgs 

Object[]{ 

buffer, 

Class[] 

classes 

Class[]{ 

Boolean.class 

QName 

opAddEntry 

QName("

//ws.apache.org/axis2"

uploadImageWithByte"

fis.close();

开始上传图像文件,并输出uploadImageWithByte方法的返回传

System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, 

classes)[0]);

下面的代码调用了getArray方法,并返回一维String数组

///////////////////////////////////////// 

getArray"

(String[]) 

serviceClient.invokeBlocking(opAddEntry,

new 

Object[]{}, 

Class[]{String[].class 

})[0];

for 

(String 

:

strArray)

System.out.print(s 

System.out.println();

下面的代码调用了getMDArray方法,并返回一维String数组

getMDArray"

serviceClient.invokeBlocking(opAddEntry,new 

Object[]{},

Class[]{String[].class})[0];

array 

s.split("

for(String 

ss:

array)

System.out.print("

<

ss 

>

下面的代码调用了getDataForm方法,并返回DataForm对象实例

getDataForm"

data.DataForm 

df 

(data.DataForm) 

serviceClient.invokeBlocking(opAddEntry, 

Object[]{},

 

Class[]{data.DataForm.class})[0];

System.out.println(df.getAge());

下面的代码调用了getDataFormBytes方法,并返回字节数组,最后将返回的字节数组反序列化后,转换成DataForm对象实例

getDataFormBytes"

(byte[]) 

Class[]{byte[].class})[0];

java.io.ObjectInputStream 

ois 

java.io.ObjectInputStream(

java.io.ByteArrayInputStream(buffer));

ois.readObject();

System.out.println(df.getName());

//////////////////////////////////////////

运行上面的程序,将输出如下的内容:

3617

true

自行车 

飞机 

火箭 

自行车>

飞机>

火箭>

中国>

美国>

德国>

超人>

蜘蛛侠>

钢铁侠>

20

bill

五、使用C#编写调用WebService的客户端代码

在VisualStudio中使用WebService就简单得多。

假设引用WebService时的引用名为complexType,则下面的代码调用了uploadImageWithByte方法来上传图像文件。

在VisualStudio引用WebService时,uploadImageWithByte方法多了两个out参数,在使用时要注意。

complexType.ComplexTypeService 

cts 

WSC.complexType.ComplexTypeService();

System.IO.FileStream 

fs 

System.IO.FileStream(@"

\images.jpg"

System.IO.FileMode.Open);

byte[fs.Length];

fs.Read(buffer, 

(int)fs.Length);

bool 

r;

rs;

cts.uploadImageWithByte( 

(int)fs.Length, 

true, 

out 

r, 

rs);

在获得二维数组时,可以将数据加载到DataGridView或其他类似的控件中,代码如下:

cts.getMDArray();

(int 

0;

strArray.Length;

i++)

用正则表达式将带分隔符的字符串转换成String数组

columns 

strArray[i].Split('

'

如果DataGridView的表头不存在,向DataGridView控件添加三个带表头的列

(dataGridView1.Columns.Count 

== 

0)

columns.Length;

j++)

dataGridView1.Columns.Add("

column"

(j 

1).ToString(), 

列"

1).ToString());

添加行

dataGridView1.Rows.Add

(1);

for(int 

dataGridView1.Rows[i].Cells[j].Value 

columns[j];

向DataGridView控件添加数据后的效果如图1所示。

图1 

对于其他的WebService方法的调用都非常简单,读者可以自己做这个实验。

要注意的是,由于.net和java序列化和反序列化的差异,通过序列化的方式传递对象实例只使用于客户端与服务端为同一种语言或技术的情况,如客户端和服务端都使用Java来编写。

如果读者要上传大文件,应尽量使用FTP的方式来传递,而只通过WebService方法来传递文件名等信息。

这样有助于提高传输效率。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1