前戏:
其实有很多方式可以发布Webservice,我试验成功的有xfire和Axis,本来对xfire情有独钟的,无奈xfire的jar包太多,随便数了下有40多个,与我原项目中的多数jar包相冲突,并且有的版本和名称都不一样,手动挑选可能会发生些不可预计的错误,于是我转用Axis.
无论用哪种方式开发,或者开发什么,首先你都得到其官网下载它的包.我下的是最新的axis-bin-1_4.tar.gz,找到它里面的lib文件夹,它包括这几个jar包.
这里面共有8个jar包,往往log4j-1.2.8.jar和commons-logging-1.0.4.jar与原工程中的包会产生冲突,所以我们可只导入其余6个jar包.
接下来我们在我们项目中书写将要被调用的类.
这个类的意图是为了将来客户端访问的时候,在客户端传入一个字符串参数,在服务端响应后返回一串字符串.
这个类书写完成后,将其改名为Hello.jws,将你的项目发布后,假设你的Hello.jws不在任何包中,浏览器的地址栏输入: http://172.20.108.211:8080/axis/Hello.jws?wsdl 即可看到你想要发布服务的wsdl文件.
然后为了客户端能够方便调用,还需要写两个文件
在WEB-INF目录下创建deploy.wsdd,内容如下
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="Hello" provider="java:RPC"> <parameter name="className" value="Hello"/> <param eter name="allowedMethods" value="showKeyword"/> </service> </deployment>
相信大家应该看得很明白了,<parameter name="className" value="Hello"/>代表我要发布的服务的类名是什么,第二句showKeyword代码客户端可以调用我哪个方法.
这个文件完了还要书写一个server-config.wsdd文件,这文件可以手写生成,也可以让系统自动生成
当项目发布后,打开DOS窗口,进入到deploy.wsdd文件所在目录,假如你的应用服务器是Tomcat,打入如下语句
D:\jakarta-tomcat-5.0.28\webapps\axis\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd
系统会自动生成server-config.wsdd文件,内容就不贴了,太长了.
这里有个细节要注意的,-Djava.ext.dirs=lib 这句的意思是所有jar文件要从你项目中寻找,这里我们还需要导入两个jar文件activation.jar和mail.jar.这两个文件在我们下载的官方包中是没有的,好像1.4版本前的包有这两个jar文件,导入到你程序中就可以了.
至此服务端的开发基本完成,接下来就是客户端了
客户端也导入之前所说的一些包,其实服务端很简单,可以写个类来调用刚才服务端发布的服务
例如你可以写
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class HelloClient
{
public static void main(String [] args) throws Exception {
String endpoint = "http://172.20.108.211:8080/axis/Hello?wsdl";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName("showHi") ;
String res = (String) call.invoke( new Object[] {"mymymy"} );
System.out.println( res );
}
}
这个类最重要的就是那串URL地址,我们可以通过这个URL地址来调用不同服务端发布的服务.
其实由此已经可见一斑了,客户端往往调用的都是比我们这个例子复杂得多的逻辑,我们可以将这些逻辑在服务端写好,return出客户端所需要的就可以了.