一。当在soap服务器上成功发布好共享服务后,对于远程客户端
如果想使用soap服务器上所发布的服 务,必须想要获取该服务
的相关信息,如调用的接口说明、传入传出参数等;例如对于
axis务,远程客户端可以使用
令查询AddressBook服务所发布的所有相关信息,即就是在请求
的最后加上?wsdl字样,这样该服务相关的详细信息会以wsdl语
言格式在客户端的浏览器上显示出来;
如:<?xml version="1.0" ?>
<definitions name="urn:AddressFetcher"
targetNamespace="urn:AddressFetcher2"
xmlns:tns="urn:AddressFetcher2"
xmlns:typens="urn:AddressFetcher2"
xmlns:xsd="
http://www.w3.org/1999/XMLSchema"
xmlns:soap="
http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="
http://schemas.xmlsoap.org/wsdl/">
<!-- type defs -->
<types>
<xsd:schema targetNamespace="urn:AddressFetcher2"
xmlns:xsd="
http://www.w3.org/1999/XMLSchema">
<xsd:simpleType name="stateType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="TX"/>
<xsd:enumeration value="IN"/>
<xsd:enumeration value="OH"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="phone">
<xsd:all>
<xsd:element name="areaCode" type="xsd:int"/>
<xsd:element name="exchange" type="xsd:string"/>
<xsd:element name="number" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="address">
<xsd:all>
<xsd:element name="streetNum" type="xsd:int"/>
<xsd:element name="streetName" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state"
type="typens:stateType"/>
<xsd:element name="zip" type="xsd:int"/>
<xsd:element name="phoneNumber"
type="typens:phone"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</types>
<!-- message declns -->
<message name="empty"/>
<message name="AddEntryRequest">
<part name="name" type="xsd:string"/>
<part name="address" type="typens:address"/>
</message>
<message name="GetAddressFromNameReques
t">
<part name="name" type="xsd:string"/>
</message>
<message name="GetAddressFromNameRespon
se">
<part name="address" type="typens:address"/>
</message>
<!-- port type declns -->
<portType name="AddressBook">
<operation name="addEntry">
<input message="tns:AddEntryRequest"/>
<output message="tns:empty"/>
</operation>
<operation name="getAddressFromName">
<input message="tns:GetAddressFromNameReques
t"/>
<output
message="tns:GetAddressFromNameRespon
se"/>
</operation>
</portType>
<!-- binding declns -->
<binding name="AddressBookSOAPBinding"
type="tns:AddressBook">
<soap:binding style="rpc"
transport="
http://schemas.xmlsoap.org/soap/http"/>
<operation name="addEntry">
<soap:operation soapAction=""/>
<input>
<soap:body use="encoded"
namespace="urn:AddressFetcher2"
encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/
"/>
</input>
<output>
<soap:body use="encoded"
namespace="urn:AddressFetcher2"
encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/
"/>
</output>
</operation>
<operation name="getAddressFromName">
<soap:operation soapAction=""/>
<input>
<soap:body use="encoded"
namespace="urn:AddressFetcher2"
encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/
"/>
</input>
<output>
<soap:body use="encoded"
namespace="urn:AddressFetcher2"
encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/
"/>
</output>
</operation>
</binding>
<!-- service decln -->
<service name="AddressBookService">
<port name="AddressBook"
binding="tns:AddressBookSOAPBinding">
<soap:address
k"/>
</port>
</service>
</definitions>
二。 在客户端浏览器上把网页内容另存为addressBook.wsdl文
二。 在客户端浏览器上把网页内容另存为addressBook.wsdl文
件;
三。 在客户端运行java org.apache.axis.wsdl.WSDL2Java
addressBook.wsdl命令,会在当前目录下生成几个java文件,这
些文件就充当了客户端的stub,客户端直接对这些文件操作就可
以和远程服务器进行交互,所有的连接信息都已经在相关类中生
成好了,如我这里的文件就是AddressBookSoapBindingSt
ub类,
该类中已经自动生成好了连接axis服务的代码,客户端可以使用
AddressBookServiceLocato
r来进行相关操作;
四。 相关类说明
1. <portType name="AddressBook"> ... </portType>为
服务器上所发布的相关操作的集合,我们称之为服务;会生成如
下对应类
public interface AddressBook extends Remote{
public abstract void addEntry(String s,
Address address)
throws RemoteException;
public abstract Address
getAddressFromName(String s)
throws RemoteException;
}
从该类中我们可以知道,远程服务器发布了两个操作
addEntry,getAddressFromName同时还用到了Address类作为参数
;<input message="tns:AddEntryRequest"/> 表示这个操作用
到了什么参数,在axis中参数都是用消息来描述的,如这里的
AddEntryRequest参数,对应如下
<message name="AddEntryRequest">
<part name="name" type="xsd:string"/>
<part name="address" type="typens:address"/>
</message>
可以看到addEntry方法的参数(AddEntryRequest描述)由两个
,一个为String类型的变量name,另一个为一个复合参数,由
typens:address来引用;
<xsd:complexType name="address">
<xsd:all>
<xsd:element name="streetNum" type="xsd:int"/>
<xsd:element name="streetName" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state"
type="typens:stateType"/>
<xsd:element name="zip" type="xsd:int"/>
<xsd:element name="phoneNumber"
type="typens:phone"/>
</xsd:all>
</xsd:complexType>
对于复合类型参数address,也会自动给你生成一个类
Address如
public class Address
implements
java.io.Serializable {
private int streetNum;
private java.lang.String streetName;
private java.lang.String city;
private AddressFetcher2.StateType state;
private int zip;
private AddressFetcher2.Phone phoneNumber;
public Address() {
}
。。。。。
同样,在Address定义又用到了<xsd:element
name="state" type="typens:stateType"/>和
<xsd:element name="phoneNumber" type="typens:phone"/>两
<xsd:element name="phoneNumber" type="typens:phone"/>两
个复合类型定义,系统也会自动 生成Phone.java和
StateType.java两个类文件;
2。 <binding name="AddressBookSOAPBinding"
type="tns:AddressBook">则用来表示具体操作的消息格式,以
及和远程服务器交互通信的协议等细节,如这里是使用soap协议
进行通信;
3。 <service name="AddressBookService">定义了特定的
服务通讯;其中每个
<port ...> ..</port>子元素定义了已经绑定具体通
讯协议的操作的集合,
<soap:address location="xxxx"/>
则定义了远程服
务器的连接信息;