服务类型
在axis中有4中服务类型
RPC服务采用soap rpc的标准,and also the SOAP "section 5" encoding.
Document 服务没有采用任何编码(所以你在组装时不会看到复杂对象的序列化以及soap-style数组),但是仍然作了xml和java对象的互映射。
Wrapped服务和Document服务类似
Message 服务接受和返回soap Envelope中的任意的xml而不需要mapping/data得榜定。如果你想处理来自外部的原始的xml,可以采用Message 服务。
RPC服务
这个服务是axis默认的服务。我们在前面的例子中写的就是rpc服务。<service ... provider="java:RPC"> 。rpc服务遵从soap rpc规范和编码规则,意味着来自rpc服务的xml将类似上面例子中的“echoString”--每个rpc调用被模块化为一个外部元素,匹配操作名称,并包含了很多内部元素,每一个都是操作的一个参数。axis将把这些xml转化为java对象,配送给你得服务,并将序列化来自服务的java对象为xml.因为rpc服务默认采用soap section 5规则,对象将会通过"multi-ref" 序列化来编码。
Document / Wrapped 服务
这2个服务很类似,都不需要用soap编码来处理数据。他就是一个普通的xml格式。无论哪种情况,axis还是对他们做了xml到java得榜定,所以你最终处理的还是java对象,而不是xml结构的字符串。
下面的例子来说明他们2个之间的区别。
<soap:Envelope xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<soap:Body>
<myNS:PurchaseOrder xmlns:myNS="http://commerce.com/PO">
<item>SK001</item>
<quantity>1</quantity>
<description>Sushi Knife</description>
</myNS:PurchaseOrder>
</soap:Body>
</soap:Envelope>
相关的PurchaseOrder类型定义如下:
<schema targetNamespace="http://commerce.com/PO">
<complexType name="POType">
<sequence>
<element name="item" type="xsd:string"/>
<element name="quantity" type="xsd:int"/>
<element name="description" type="xsd:string"/>
</sequence>
</complexType>
<element name="PurchaseOrder" type="POType"/>
</schema>
对于一个document服务来说,他将对应到这样的方法
public void method(PurchaseOrder po)
换句话说,整个PurchaseOrder元素将被处理为一个单一的对象,包含3个属性。
而对于wrapped服务来说,他对应于下面的方法
public void purchaseOrder(String item, int quantity, String description)
注意到,在wrapped中,PurchaseOrder元素被映射为代表了一个方法。他的参数就是他的那些元素。
他们在wsdd得使用如下
<service ... style="document"> for document style
<service ... style="wrapped"> for wrapped style
Message 服务
当你需要处理纯xml而不是java对象时,你将会用到这种服务。
message服务的方法有4中签名
public Element [] method(Element [] bodies);
public SOAPBodyElement [] method (SOAPBodyElement [] bodies);
public Document method(Document body);
public void method(SOAPEnvelope req, SOAPEnvelope resp);