webservice何许人也?webservice是企业发布的完成特定功能的在线服务。通过HTTP协议传输可以轻轻松松的实现分布式的服务调用。分布式在线服务也是web的一个发展方向。而axis是目前较为主流的webservice引擎。他来源于apache的soap协议的一个实现。我们今天来利用axis实现一个简单的分布式调用。
首先我们需要下载axis组件。其官方主页的地址是:http://www.apache.org/dyn/closer.cgi/ws/axis/1_4
我们将下载后的压缩包文件,解压到本地硬盘当中。接着将目录当中的webapps目录下的axis文件拷贝到tomcat的目录下(笔者使用的是tomcat6.0)。启动tomcat,在浏览器地址栏当中输入:http://localhost:8080/axis/我们可以看到如下页面:
点击Validation就可以看见webservice部署成功了
下面就要开始我们的axis之旅了。axis提供了两种发布的方式:即时发布(jws)和定制发布(wsdd)
这里即时发布不支持带包的类,但是大部分情况下发布的都是带包的类。所以这里我们就不介绍即时发布了,我们来说一说定制发布吧。
定制发布相对于即时发布稍微有点复杂。但是其灵活性也更加的强大一些。定制发布需要完成三个步骤:
第一步:创建服务器类:我们这里创建一个WsddServer的服务器类
package com.foolfish.wsdd;
/**
* @email foolfish.chen@gmail.com
* @author Administrator
*/
public class WsddServer {
public WsddServer(){}
public String say(String name){
return "Hello" + name;
}
}
该类提供了一个say方法。用于接受参数并返回操作结果。接着我们需要针对该类编写一个wsdd文件。我们把这个wsdd命名为deploy.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"> <service name="firstWsdd" provider="java:RPC"> <parameter name="className" value="com.foolfish.wsdd.WsddServer"/> <parameter name="allowedMethods" value="*"/> <parameter name="scope" value="request"/> </service> </deployment>
我们来看一下这个xml文件,该文件的核心部分是
<service name="firstWsdd" provider="java:RPC"> <parameter name="className" value="com.foolfish.wsdd.WsddServer"/> <parameter name="allowedMethods" value="*"/> <parameter name="scope" value="request"/> </service>
我们可以看出,我们给我们需要发布的服务器断的wenservice命名为firstwsdd.并在指定了其class的所在位置、允许被调用的方法以及可被调用的范围。我们需要将deploy.wsdd文件放置到tomcat下axis目录的WEB-INF目录下。接着,运行dos窗口,切换到该目录下运行
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd
需要注意的是在运行上面命令的时候我们需要启动tomcat,不然无法进行编译,编译后,会生成新的文件server-config.wsdd。
好了,我们接着就要开始写我们的客户端程序了,我们将创建一个名为WsddClient 的客户端程序。我们客户端将要调用服务器端的say方法。并输出结果。服务器端的代码如下图所示:
package com.foolfish.wsdd;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
/**
* @email foolfish.chen@gmail.com
* @author Administrator
*/
public class WsddClient {
public static void main(String[] args) {
String url = "http://localhost:8080/axis/services/firstWsdd";
try{
Service serv = new Service();
Call call = (Call) serv.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(url,"say"));
String result = (String)call.invoke(new Object[]{"foolfish"});
System.out.println("result = "+ result);
}
catch(ServiceException e){
e.printStackTrace();
}
catch(RemoteException e){
e.printStackTrace();
}
}
}
上面的代码看起来应该很容易理解,客户端通过路径访问到服务器,接着通过我们发布的wsdd查找需要调用类,并获得该类的方法,执行并返回结果。我们运行上面的程序,将会返回result = Hellofoolfish字符串。
怎么样,我们很简单的实现了一个简单的分布式调用了吧。我们现在来考虑一个问题,如果这个时候我们需要在调用服务器端的类的前后需要执行相应的操作。例如我们需要统计该webservice一共被调用几次。我们不方面在需要调用的类当中去写,这里我们就用到了axis的一个叫做handler的东西,利用handler我们可以在客户端调用服务器端之前或者之后执行相应的handler。
这里我们来编写一个handler。取名为WsddServerHandler,用来统计对我们上面制作的webservice的调用次数。
package com.foolfish.wsdd;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
/**
* @email foolfish.chen@gmail.com
* @author Administrator
*/
public class WsddServerHandler extends BasicHandler{
private static long count = 0L;
private int requestCount = 0;
//定义一个handler。用于统计某个webservice的调用次数
public void invoke(MessageContext args0) throws AxisFault {
requestCount++;
count++;
String status = (String)this.getOption("status");
System.out.println("The firstHandler status is: " +status + " count : " + " handlerrequest: " + requestCount);
}
}
我们定义好了一个handler。下面我们需要在deploy.wsdd当中去配置,我们来看一下新的deploy.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"> <handler name="fisrtHandler" type="java:com.foolfish.wsdd.WsddServerHandler" > <parameter name="status" value="success" /> </handler> <service name="firstWsdd" provider="java:RPC"> <requestFlow> <handler type="fisrtHandler" /> </requestFlow> <parameter name="className" value="com.foolfish.wsdd.WsddServer"/> <parameter name="allowedMethods" value="*"/> <parameter name="scope" value="request"/> </service> </deployment>
我们很容易的看出,我们定义了在调用我们先前定义的webservice的时候需要执行改handler,以便统计调用该handler的次数。
好吧,我们现在来运行下客户端程序。客户端仍然输出没有handler时候的的字符。我们来看下服务器端输出了什么
好了,我们的第一个axis完成了。效果还不错吧
^_^~~~~~~~