Axis創建自己的WebService--Step by Step 續

      使用工具自動生成代碼,雖然比較快捷,但是產生的代碼一大堆,一般人很難看懂裏面的原理。而且根本不需要那麼多東西在裏面。只需要很簡單的一個Service類,然後配置一下server-config.xml文件就可以了。
    後面將根據一個例子簡單說明一下過程。

  • 1.編寫WS服務接口,實現類,並根據需要編寫作爲參數的類。

服務接口:

package com.lucas.busin.qdii.webservice;

public interface IQDIIWebService {
    
public java.lang.String[] getTickers();

    
public String updatePoolDetail(QDIIStockPoolDetail detail);

    
public String updatePoolDetails(QDIIStockPoolDetail[] details);
}

服務實現類:

package com.lucas.busin.qdii.webservice;

import org.apache.log4j.Logger;

/**
 * Author:Lucas
 * Date: 2008-3-21
 * Time: 23:22:56
 
*/

public class QDIIWebServiceImpl implements IQDIIWebService {
    
private static final Logger LOGGER = Logger.getLogger(QDIIWebServiceImpl.class);

    
public String[] getTickers(){
        
// 在這裏實現業務邏輯        

        LOGGER.info(
"***************************************");
        LOGGER.info(
"QDIIWebService: getTickers() successful!!!");
        LOGGER.info(
"ticker[] size:" + tickers.length);
        LOGGER.info(
"***************************************");

        
return tickers;
    }


    
public String updatePoolDetail(QDIIStockPoolDetail detail) {        
        
// 在這裏實現業務邏輯

        LOGGER.info(
"***************************************");
        LOGGER.info(
"QDIIWebService: updatePoolDetail(QDIIStockPoolDetail) successful!!!");
        LOGGER.info(
"Ticker:" + detail.getLocalTicker());
        LOGGER.info(
"***************************************");

        
return "updatePoolDetail successful!!!";
    }


    
public String updatePoolDetails(QDIIStockPoolDetail[] details) {
        
for(QDIIStockPoolDetail detail : details) {
            updatePoolDetail(detail);
        }

        LOGGER.info(
"***************************************");
        LOGGER.info(
"QDIIWebService: updatePoolDetails(QDIIStockPoolDetail[]) successful!!!");
        LOGGER.info(
"Array size:" + details.length);
        LOGGER.info(
"***************************************");

        
return "updatePoolDetails successful!!!";
    }

}

使用到的參數類QDIIStockPoolDetail:

package com.lucas.busin.qdii.webservice;

import java.io.Serializable;

public class QDIIStockPoolDetail  implements Serializable {
    
private java.lang.Double priceLocal;

    
private java.lang.Double mktCap;

    
public Double getPriceLocal() {
        
return priceLocal;
    }


    
public void setPriceLocal(Double priceLocal) {
        
this.priceLocal=priceLocal;
    }


    
public Double getMktCap() {
        
return mktCap;
    }


    
public void setMktCap(Double mktCap) {
        
this.mktCap=mktCap;
    }

}
  • 2.編寫server-config.wsdd文件
    <?xml version="1.0" encoding="UTF-8"?>

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

      
    <globalConfiguration>

        
    <parameter name="sendMultiRefs" value="true"/>

        
    <parameter name="disablePrettyXML" value="true"/>

        
    <parameter name="dotNetSoapEncFix" value="true"/>

        
    <parameter name="enableNamespacePrefixOptimization" value="false"/>

        
    <parameter name="sendXMLDeclaration" value="true"/>

        
    <parameter name="sendXsiTypes" value="true"/>

      
    </globalConfiguration>

      
    <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>

      
    <transport name="http">

        
    <requestFlow>

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

          
    <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>

        
    </requestFlow>

        
    <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>

        
    <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>

        
    <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>

      
    </transport>

      
    <transport name="local">

            
    <responseFlow>

                
    <handler type="LocalResponder"/>

            
    </responseFlow>

      
    </transport>

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

        
    <parameter name="className" value="com.sinitek.busin.qdii.webservice.QDIIWebServiceImpl"/>

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

        
    <parameter name="wsdlServiceElement" value="QDIIWebService"/>

        
    <parameter name="wsdlTargetNamespace" value="urn:QDIIWebService"/>

        
    <beanMapping

            
    languageSpecificType="java:com.sinitek.busin.qdii.webservice.QDIIStockPoolDetail"

            qname
    ="ns1:QDIIStockPoolDetail"

            xmlns:ns1
    ="urn:QDIIWebService"/>

      
    </service>

    </deployment>
  • className:對應服務實現類
  • allowedMethods:*表示允許服務類的所有方法暴露給客戶端
  • wsdlServiceElement:對應客戶端看到的服務類名--比如EXCEL中用Web Service References引入WebService後看到的服務類名稱
  • wsdlServicePort:
  • wsdlPortType:
  • wsdlTargetNamespace:對應用戶的命名空間
  • scope:比如Session

對於自己定義的參數類,需要序列化:比如上面的beanMapping

  • languageSpecificType:參數類的全路徑
  • qname:xml 命名空間:類名
  • xmlns:定義xml的命名空間

下面還有幾個序列化的例子:

<typeMapping 
      
      
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" 
      
      encodingStyle
="http://schemas.xmlsoap.org/soap/encoding/" 

      serializer
="org.apache.axis.encoding.ser.BeanSerializerFactory" 

      type
="java:com.sinitek.busin.qdii.webservice.QDIIStockPoolDetail" 

      qname
="ns1:QDIIStockPoolDetail" 

      xmlns:ns1
="urn:QDIIWebService"/>

<arrayMapping 
   
      
innerType="ns2:QDIIStockPoolDetail" 
    
      languageSpecificType
="java:com.sinitek.busin.qdii.webservice.QDIIStockPoolDetail[]" 

      qname
="ns2:ArrayOfQDIIStockPoolDetail"

      xmlns:ns2
="urn:QDIIWebService"/>

<arrayMapping 

       
innerType="soapenc:string"

       languageSpecificType
="java:java.lang.String[]" 

       qname
="ns3:ArrayOf_soapenc_string" 

       xmlns:ns3
="urn:QDIIWebService"

       xmlns:soapenc
="http://schemas.xmlsoap.org/soap/encoding/"/>

 

  • 3.以上文件準備好以後,啓動web服務器。通過網址http://localhost:port/services查看發佈的web服務。
  • 4.訪問web service
  • 4.1使用vb訪問:通過web service references找到服務
  • 4.2使用java訪問:如上一篇所講,通過wsdl文件自動生成然後使用。
發佈了6 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章