使用工具自動生成代碼,雖然比較快捷,但是產生的代碼一大堆,一般人很難看懂裏面的原理。而且根本不需要那麼多東西在裏面。只需要很簡單的一個Service類,然後配置一下server-config.xml文件就可以了。
後面將根據一個例子簡單說明一下過程。
- 1.編寫WS服務接口,實現類,並根據需要編寫作爲參數的類。
服務接口:
public interface IQDIIWebService {
public java.lang.String[] getTickers();
public String updatePoolDetail(QDIIStockPoolDetail detail);
public String updatePoolDetails(QDIIStockPoolDetail[] details);
}
服務實現類:
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:
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的命名空間
下面還有幾個序列化的例子:
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文件自動生成然後使用。