使用工具自动生成代码,虽然比较快捷,但是产生的代码一大堆,一般人很难看懂里面的原理。而且根本不需要那么多东西在里面。只需要很简单的一个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文件自动生成然后使用。
1138

被折叠的 条评论
为什么被折叠?



