还珠格格之知画生孩子:转 axis 自定义对象序列化--阿甘正传1
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 18:53:24
基于Axis的自定义对象序列化
1. 在Axis服务端,注册自定义对象的序列化/反序列化器
主要是修改axis安装目录下WEB-INF/server-config.wsdd文件。
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
注意service/beanMapping的定义。languageSpecificType中定义使用那个类, qname定义类的名称。
2. 在Axis客户端,注册自定义对象的序列化/反序列化器。
核心代码如下:
//创建调用对象
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
//注册SimpleObject的序列化类型
QName qn = new QName("urn:BeanService","SimpleObject");
call.registerTypeMapping(SimpleObject.class, qn,
new BeanSerializerFactory(SimpleObject.class, qn),
new BeanDeserializerFactory(SimpleObject.class, qn));
全部代码示例如下:
//SimpleObject.java
//Web Service对象传递的对象,必需继承Serializable
package com.whcyit.axis;
import java.io.Serializable;
public class SimpleObject implements Serializable { private static final long serialVersionUID = -6414428095965735488L; private int i = 0;
private float f = 0.0f;
private String str = "";
public SimpleObject() {
}
public float getFloat() {
return f;
}
public void setFloat(float f) {
this.f = f;
} public int getInt() {
return i;
}
public void setInt(int i) {
this.i = i;
}
public String getString() {
return str;
}
public void setString(String str) {
this.str = str;
}
}
// SimpleObjectService.java
//服务程序
package com.whcyit.axis;
public class SimpleObjectService {
public String sayHello(String name) {
return "Hello " + name +"!";
}
public String getString(SimpleObject obj) {
System.out.println("SimpleObjectService getString invoked!");
return "return by serviced:"+obj.getString();
}
public SimpleObject createSimpleObject(int i,float f,String str) {
System.out.println("SimpleObjectService createSimpleObject invoked!"); SimpleObject so = new SimpleObject();
so.setInt(i);
so.setFloat(f);
so.setString(str);
return so;
}
}
// SimpleObjectClient.java
//客户端调用文件
package com.whcyit.axis;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
public class SimpleObjectClient {
public static void main(String[] args) {
String ret = "";
try {
String wsdlUrl = "http://localhost:8080/axis/services/SimpleObjectService?wsdl";
String nameSpaceUri = "http://localhost:8080/axis/services/SimpleObjectService";
//创建调用对象
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
//注册SimpleObject的序列化类型
QName qn = new QName("urn:BeanService","SimpleObject");
call.registerTypeMapping(SimpleObject.class, qn,
new BeanSerializerFactory(SimpleObject.class, qn),
new BeanDeserializerFactory(SimpleObject.class, qn));
//调用sayHello
System.out.println(">>>sayHello");
call.setOperationName(new QName(nameSpaceUri, "sayHello"));
call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
ret = (String) call.invoke(new Object[] { "liu2" });
System.out.println("return value is " + ret);
//调用getDesc
System.out.println(">>>getString");
SimpleObject so = new SimpleObject();
so.setString("hello!");
QName getDescQn = new QName(nameSpaceUri, "getString");
call.setOperationName(getDescQn);
call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
ret = (String) call.invoke(new Object[] { so });
System.out.println("return value is " + ret);
//调用createSimpleObject
System.out.println(">>>createSimpleObject");
QName getObjectQn = new QName(nameSpaceUri, "createSimpleObject");
call.setOperationName(getObjectQn);
call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
SimpleObject rtnSO = (SimpleObject) call.invoke(new Object[] { new Integer(1),new Float(0.1f),"liu2" });
System.out.println("return object " + rtnSO.getString());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
//server-config.wsdd
//服务端配置文件
xmlns="http://xml.apache.org/axis/wsdd/">
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
public static void main(String[] args) {
String ret = "";
try {
String wsdlUrl = "http://localhost:8080/axis/services/SimpleObjectService?wsdl";
String nameSpaceUri = "http://localhost:8080/axis/services/SimpleObjectService";
//创建调用对象
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
//注册SimpleObject的序列化类型
QName qn = new QName("urn:BeanService","SimpleObject");
call.registerTypeMapping(SimpleObject.class, qn,
new BeanSerializerFactory(SimpleObject.class, qn),
new BeanDeserializerFactory(SimpleObject.class, qn));
//调用sayHello
System.out.println(">>>sayHello");
call.setOperationName(new QName(nameSpaceUri, "sayHello"));
call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
ret = (String) call.invoke(new Object[] { "liu2" });
System.out.println("return value is " + ret);
//调用getDescSystem.out.println(">>>getString");SimpleObject so = new SimpleObject();so.setString("hello!");QName getDescQn = new QName(nameSpaceUri, "getString");call.setOperationName(getDescQn);call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));ret = (String) call.invoke(new Object[] { so });System.out.println("return value is " + ret);//调用createSimpleObjectSystem.out.println(">>>createSimpleObject");QName getObjectQn = new QName(nameSpaceUri, "createSimpleObject");call.setOperationName(getObjectQn);call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));SimpleObject rtnSO = (SimpleObject) call.invoke(new Object[] { new Integer(1),new Float(0.1f),"liu2" });System.out.println("return object " + rtnSO.getString());} catch (Exception ex) {ex.printStackTrace();}}}//server-config.wsdd//服务端配置文件xmlns="http://xml.apache.org/axis/wsdd/"> qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
Service Styles
AXIS有四种service styles,分别是:RPC, Document, Wrapped, and Message。最常用的就是RPC和Message。
RPC:在AXIS中是一个默认选项。当你部署的时候使用下列两种方式:
Document
以下列方式部署:
Wrapped
以下列方式部署:
在大多书情况下,你不许要担心是DOCUMENT服务还是WRAPPED服务。
Message
以下列方式部署:
public Element [] method(Element [] bodies);
public SOAPBodyElement [] method (SOAPBodyElement [] bodies);
public Document method(Document body);
public void method(SOAPEnvelope req, SOAPEnvelope resp);