天天看点

WebService(3)-AXIS高级特性 传递复杂对象

从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件。

(1)定义一个对象实现了serializable 接口

package cn.com.chenlly.ssh.webservice.axis;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.List;

public class Address implements Serializable {

 private Integer identifier;

 private String address;

 private String city;

 private String province;

 private String country;

 private String []array;

 private List<Integer> list;

 private boolean isExst;

 //constructor

 public Address(){

  list = new ArrayList<Integer>();

  list.add(1);

  list.add(2);

  list.add(3);

 }

 public Integer getIdentifier() {

  return identifier;

 }

 public void setIdentifier(Integer identifier) {

  this.identifier = identifier;

 }

 public String getAddress() {

  return address;

 }

 public void setAddress(String address) {

  this.address = address;

 }

 public String getCity() {

  return city;

 }

 public void setCity(String city) {

  this.city = city;

 }

 public String getProvince() {

  return province;

 }

 public void setProvince(String province) {

  this.province = province;

 }

 public String getCountry() {

  return country;

 }

 public void setCountry(String country) {

  this.country = country;

 }

 public String[] getArray() {

  return array;

 }

 public void setArray(String[] array) {

  this.array = array;

 }

 public List<Integer> getList() {

  return list;

 }

 public void setList(List<Integer> list) {

  this.list = list;

 }

 public boolean isExst() {

  return isExst;

 }

 public void setExst(boolean isExst) {

  this.isExst = isExst;

 }

}

(2)定义server-config.wsdd文件

<deployment xmlns="http://xml.apache.org/axis/wsdd/"

 xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 <handler name="URLMapper"

  type="java:org.apache.axis.handlers.http.URLMapper" />

 <handler name="wsTestHandler"

  type="java:cn.com.chenlly.ssh.webservice.axis.WSTestServiceHandle">

  <parameter name="status" value="success" />

 </handler>

 <!-- 自定义服务 -->

 <service name="ws" provider="java:RPC">

  <parameter name="className"

   value="cn.com.chenlly.ssh.webservice.axis.WSTestServiceImpl" />

  <parameter name="allowedMethods" value="*" />

  <parameter name="scope" value="request" />

  <responseFlow>

   <handler type="wsTestHandler" />

  </responseFlow>

  <requestFlow>

   <handler type="wsTestHandler" />

  </requestFlow>

  <beanMapping qname="myNSD:Address"

   xmlns:myNSD="urn:AddressManager"

   languageSpecificType="java:cn.com.chenlly.ssh.webservice.axis.Address">

  </beanMapping>

 </service>

 <transport name="http">

  <requestFlow>

   <handler type="URLMapper" />

  </requestFlow>

 </transport>

</deployment>

//主要是<beanMapping>标签中名字空间和qname写法

第一个你自定义的命名空间和第二个节点本地部分会组成一个新的QName。

在IE 中打开链接

http://192.168.1.98:8082/SSHProject/services/ws?wsdl

生成的WSDL有如下一段

- <schema targetNamespace="urn:AddressManager" xmlns="http://www.w3.org/2001/XMLSchema">

  <import namespace="http://192.168.1.98:8082/SSHProject/services/ws" />

  <import namespace="http://xml.apache.org/xml-soap" />

  <import namespace="http://schemas.xmlsoap.org/soap/encoding/" />

- <complexType name="Address">

- <sequence>

  <element name="address" nillable="true" type="soapenc:string" />

  <element name="array" nillable="true" type="impl:ArrayOf_soapenc_string" />

  <element name="city" nillable="true" type="soapenc:string" />

  <element name="country" nillable="true" type="soapenc:string" />

  <element name="exst" type="xsd:boolean" />

  <element name="identifier" nillable="true" type="soapenc:int" />

  <element name="list" nillable="true" type="impl:ArrayOf_xsd_anyType" />

  <element name="province" nillable="true" type="soapenc:string" />

  </sequence>

  </complexType>

  </schema>

这个新的schema就是把对象序列化以后生成了xml流文件。

(3) webService 服务方法

public Address dealAddress(Address address) {

   System.out.println("service exst:"+address.isExst());

   //客户端对象传递过来设置标志为true

   address.setExst(true);

   return address;

}

(4) 客户端

package cn.com.chenlly.ssh.webservice.axis;

import java.util.ArrayList;

import java.util.List;

import javax.xml.namespace.QName;

import javax.xml.rpc.ParameterMode;

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 WSTestServiceClient {

 public static void main(String[] args) {

  Service service = new Service();

  try {

   Call call = (Call) service.createCall();

   String url = "http://192.168.1.98:8082/SSHProject/services/ws?wsdl";

   call.setTargetEndpointAddress(new java.net.URL(url));

                        //定义对象

   Address address = new Address();

   address.setIdentifier(1);

   address.setProvince("湖南");

   address.setCity("长沙");

   address.setExst(false);

   QName qn = new QName("urn:AddressManager", "Address");//第一个参数名字空间URI,第二个参数本地部分,注意这两部分在server-config.wsdd文件中标签beanMapping配置

   call.registerTypeMapping(Address.class, qn,

     new BeanSerializerFactory(Address.class, qn),//序列化

     new BeanDeserializerFactory(Address.class, qn));

   call.setOperationName(new QName(url,"dealAddress"));

   call.addParameter("arg0", qn, ParameterMode.IN);//定义一个参数类型,如果是String类型的参数可以不需要这句话

   call.setReturnClass(Address.class);//指定返回类型

   Address result = (Address) call.invoke(new Object[]{address});//这里传递给service的是一个对象

   System.out.println(result.isExst());

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

}

//在服务器端打印的isExst()方法是false;然后设置address的exst为true;最后又传送到客户端打印的result结果为true