<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è)類(lèi), qname定義類(lèi)的名稱(chēng)。
2. 在A(yíng)xis客戶(hù)端,注冊自定義對象的序列化/反序列化器。
核心代碼如下://創(chuàng )建調用對象Service service = new Service();Call call = null;call = (Call) service.createCall();//注冊SimpleObject的序列化類(lèi)型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對象傳遞的對象,必需繼承Serializablepackage 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//客戶(hù)端調用文件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 )建調用對象Service service = new Service();Call call = null;call = (Call) service.createCall();//注冊SimpleObject的序列化類(lèi)型QName qn = new QName("urn:BeanService","SimpleObject");call.registerTypeMapping(SimpleObject.class, qn,new BeanSerializerFactory(SimpleObject.class, qn),new BeanDeserializerFactory(SimpleObject.class, qn));//調用sayHelloSystem.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//服務(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è)默認選項。當你部署的時(shí)候使用下列兩種方式:<service ... provider="java:RPC"> 或則 <service ... style="RPC">,它遵循SOAP RPC和編碼規則,就是說(shuō)它的WSDL文件形式就想上面所說(shuō)的HelloServicewsForSoap的echoString一樣。每個(gè)RPC都包括一個(gè)表示名稱(chēng)的外部接點(diǎn)和一些表示參數的內部接點(diǎn)。AXIS會(huì )根據規則將一個(gè)XML(WSDL文件)文件轉化成一個(gè)JAVA對象,并對對想賦上在文件中描述的值。也可以根據規則將一個(gè)JAVA對象轉化成XML文件。
Document
以下列方式部署:<service ... style="document"><service ... style="document">。適合于老的XML schema。
Wrapped
以下列方式部署:<service ... style="wrapped"><service ... style="wrapped"> 和DOCUMENT一樣,適合于老的XML schema。
在大多書(shū)情況下,你不許要擔心是DOCUMENT服務(wù)還是WRAPPED服務(wù)。
Message
以下列方式部署:<service name="MessageService" style="message">。以這種方式部署的話(huà),會(huì )是AXIS失去意義,它使你的代碼真正的用XML形式,而不需要轉化成JAVA對象。以這種方式部署的有以下四種服務(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)系客服