WebService-AXIS進階特性 傳遞複雜物件

來源:互聯網
上載者:User

從用戶端除了傳遞字串以外還可以傳遞複雜物件(對象必須序列化了),List,Map,數組和檔案。


(1)定義一個對象實現了serializable 介面
package cn.com.chenlly.ssh.webservice.axis;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * @Class Address.java
 * @Description 
 * @Copyright (c) 2010,  All rights reserved.
 * @Autho
 * @Version 1.0
 * @Date Apr 19, 2010 5:03:23 PM
 */
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.wsdl檔案

<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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.