<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="com.whcyit.axis.SimpleObjectService"/>
<beanMapping languageSpecificType="java:com.whcyit.axis.SimpleObject"
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
</service>
注意service/beanMapping的定義。languageSpecificType中定義使用那個(gè)類, qname定義類的名稱。
2. 在Axis客戶端,注冊(cè)自定義對(duì)象的序列化/反序列化器。
核心代碼如下:
//創(chuàng)建調(diào)用對(duì)象
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
//注冊(cè)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對(duì)象傳遞的對(duì)象,必需繼承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
//服務(wù)程序
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
//客戶端調(diào)用文件
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";
//創(chuàng)建調(diào)用對(duì)象
Service service = new Service();
Call call = null;
call = (Call) service.createCall();//注冊(cè)SimpleObject的序列化類型
QName qn = new QName("urn:BeanService","SimpleObject");
call.registerTypeMapping(SimpleObject.class, qn,
new BeanSerializerFactory(SimpleObject.class, qn),
new BeanDeserializerFactory(SimpleObject.class, qn));
//調(diào)用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);
//調(diào)用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);//調(diào)用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
//服務(wù)端配置文件<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns:java="xmlns="<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<service name="SimpleObjectService" provider="java:RPC"><parameter name="allowedMethods" value="*"/>
<parameter name="className" value="com.whcyit.axis.SimpleObjectService"/>
<beanMapping languageSpecificType="java:com.whcyit.axis.SimpleObject"
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport></deployment>
AXIS有四種service styles,分別是:RPC, Document, Wrapped, and Message。最常用的就是RPC和Message。
RPC:在AXIS中是一個(gè)默認(rèn)選項(xiàng)。當(dāng)你部署的時(shí)候使用下列兩種方式:<service ... provider="java:RPC"> 或則 <service ... style="RPC">,它遵循SOAP RPC和編碼規(guī)則,就是說它的WSDL文件形式就想上面所說的HelloServicewsForSoap的echoString一樣。每個(gè)RPC都包括一個(gè)表示名稱的外部接點(diǎn)和一些表示參數(shù)的內(nèi)部接點(diǎn)。AXIS會(huì)根據(jù)規(guī)則將一個(gè)XML(WSDL文件)文件轉(zhuǎn)化成一個(gè)JAVA對(duì)象,并對(duì)對(duì)想賦上在文件中描述的值。也可以根據(jù)規(guī)則將一個(gè)JAVA對(duì)象轉(zhuǎn)化成XML文件。
Document
以下列方式部署:<service ... style="document"><service ... style="document">。適合于老的XML schema。
Wrapped
以下列方式部署:<service ... style="wrapped"><service ... style="wrapped"> 和DOCUMENT一樣,適合于老的XML schema。
在大多書情況下,你不許要擔(dān)心是DOCUMENT服務(wù)還是WRAPPED服務(wù)。
Message
以下列方式部署:<service name="MessageService" style="message">。以這種方式部署的話,會(huì)是AXIS失去意義,它使你的代碼真正的用XML形式,而不需要轉(zhuǎn)化成JAVA對(duì)象。以這種方式部署的有以下四種服務(wù)方法:
public Element [] method(Element [] bodies);
public SOAPBodyElement [] method (SOAPBodyElement [] bodies);
public Document method(Document body);
public void method(SOAPEnvelope req, SOAPEnvelope resp);
聯(lián)系客服