WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx
《WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx》由会员分享,可在线阅读,更多相关《WebService大讲堂之Axis22复合类型数据的传递Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
上传图像,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数组中
n
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
s
:
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
i
0;
strArray.Length;
i++)
用正则表达式将带分隔符的字符串转换成String数组
columns
strArray[i].Split('
'
如果DataGridView的表头不存在,向DataGridView控件添加三个带表头的列
(dataGridView1.Columns.Count
==
0)
j
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方法来传递文件名等信息。
这样有助于提高传输效率。