这段时间做了个项目,需要使用润乾报表的接口,所以研究了一把webservice。现在把使用心得总结下,供初学者参考。
Axis是一个soap引擎,支持wsdl。下面介绍如何使用ant生成服务端和客户端,并配置webservice。
ant是一个基于JAVA的自动化脚本引擎,脚本格式为XML。下载ant的网址:http://ant.apache.org/。下载后直接解压,设置环境变量ANT_HOME为%解压后路径%。在path中添加%ANT_HOME%/bin。
从axis的官方网站上下载(http://ws.apache.org/axis/)axis-bin-1_3.zip将解压后的lib下的jar包放入文件夹D:/os/webservice/1.3/lib中。另建立D:/os/webservice/1.3/classes和D:/os/webservice/1.3/generated-sources两个文件夹。在D:/os/webservice/1.3下建立build.xml。
build.xml脚本内容如下:
<project name="Axis web service generator" default="all" basedir=".">
<description>
Generate an Axis Web Service with the axis-ant tasks.
</description>
<target name="init">
<path id="axis.classpath">
<pathelement path="D:/os/webservice/1.3/classes"/>
<fileset
dir="${basedir}/lib/">
<include name="**/*.jar" />
</fileset>
</path>
<taskdef
resource="axis-tasks.properties" classpathref="axis.classpath" />
</target>
<target name="2wsdl" depends="init">
<axis-java2wsdl
classname="com.landray.kmss.sys.webservice.reportattach.ReportAttach"
output="${basedir}/ReportAttach.wsdl"
namespace="http://com/landray/kmss/sys/webservice/reportattach/ReportAttach.wsdl"
location="http://java.kmss.net:8080/EKPReport/axis/ReportAttachService">
</axis-java2wsdl>
</target>
<target name="2java" depends="init">
<axis-wsdl2java
output="${basedir}/generated-sources"
testcase="true"
serverside="true"
url="${basedir}/ReportAttach.wsdl"
verbose="true">
<mapping namespace="http://com/landray/kmss/sys/webservice/reportattach/ReportAttach.wsdl" package="com.landray.kmss.sys.webservice.reportattach"/>
</axis-wsdl2java>
</target>
</project>
上面脚本定义了源文件夹classes,输出文件夹generated-sources,及相关命令。将编译好的class文件(包含类包)放入classes文件夹。这里以ReportAttach.class为例具体讲解。
ReportAttach.class:
import javax.activation.DataHandler;
public interface ReportAttach {
public DataHandler[] getReportRun(java.lang.Object[] in0) throws java.rmi.RemoteException;
}
运行cmd,cd D:/os/webservice/1.3。执行ant 2wsdl,再执行ant 2java。这样服务端和客户端就生成好了。
将generated-sources下的文件拷贝到你的服务端和客户端相应的模块下,注意包路径保持一致。同时将lib下的jar包拷贝到你服务端和客户端应用的lib下。
在服务端你的应用路径/web-inf/classes下建立server-config.wsdd。内容如下:
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 value="admin" name="adminPassword" />
<parameter value="org.apache.axis.attachments.AttachmentsImpl"
name="attachments.implementation" />
<parameter value="true" name="sendXsiTypes" />
<parameter value="true" name="sendMultiRefs" />
<parameter value="true" name="axis.development.system" />
<parameter value="true" name="sendXMLDeclaration" />
<parameter value="true" name="axis.sendMinimizedElements" />
<parameter value="true" name="dotNetSoapEncFix" />
<parameter value="false" name="sendMultiRefs" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter value="session" name="scope" />
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter value="request" name="scope" />
<parameter value=".jwr" name="extension" />
</handler>
</requestFlow>
</globalConfiguration>
<handler type="java:org.apache.axis.transport.local.LocalResponder"
name="LocalResponder" />
<handler type="java:org.apache.axis.handlers.http.URLMapper"
name="URLMapper" />
<handler
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"
name="Authenticate" />
<service provider="java:RPC" name="Version">
<parameter value="getVersion" name="allowedMethods" />
<parameter value="org.apache.axis.Version" name="className" />
</service>
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="true"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<!-- Services from AxisSalesOrderService WSDL service -->
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>
</deployment>
找到你生成的deploy.wsdd文件,拷贝service节点的内容到<!-- Services from AxisSalesOrderService WSDL service -->后面。找到服务端的ReportAttachServiceSoapBindingImpl.java,这是根据你提供的ReportAttach生成的实际功能实现的service。修改getReportRun方法(也是你在ReportAttach里定义的),在里面写你的具体实现。到这里服务端已经配置完成了。那么,在客户端如何调用呢?这里再啰嗦一句,如果你没把需要的jar包和生成的文件拷到客户端,也就是前面没看仔细,就请重新看下再往下操作。以下我贴出客户端调用的代码:
com.landray.kmss.sys.webservice.reportattach.ReportAttachServiceSoapBindingStub binding;
try {
binding = (com.landray.kmss.sys.webservice.reportattach.ReportAttachServiceSoapBindingStub)
new com.landray.kmss.sys.webservice.reportattach.ReportAttachServiceLocator().getReportAttachService();
}
catch (javax.xml.rpc.ServiceException jre) {
if(jre.getLinkedCause()!=null)
jre.getLinkedCause().printStackTrace();
throw new junit.framework.AssertionFailedError("JAX-RPC ServiceException caught: " + jre);
}
// Time out after a minute
binding.setTimeout(60000);
// Test operation
Attach[] ret =binding.getReportRun(paras);
我这里用到了javax.activation.DataHandler,axis支持使用它进行二进制数据流的传输。如果要传输bean,记得实现java.io.Serializable接口。