Axis引擎支持自动生成wsdl文档,形式: http://....?wsdl
axis发布web service
1、 即时发布(Instant Deployment)
首先建立一个服务器端web project,并将axis里面webapps下的web.xml拷贝到新建的工程下,导入lib下所有jar包
编写java类,不能有包名
代码如下:
public class Calculator {
public int add(int i1, int i2)
{
return i1 + i2;
}
public int subtract(int i1, int i2)
{
return i1 - i2;
}
}
Copy ${your.java}源文件到${tomcat_home}/webapps/${your projects}下
改变扩展名${your.jws}
编写一个客户端的java project测试:路径为http://localhost:8080/${your project}/${your}.jws
主要代码如下:
public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
//创建服务对象
Service service = new Service();
//通过服务对象创建调用对象
Call call=(Call)service.createCall();
//设置对象的操作名称
call.setOperationName("add");
String url = "http://localhost:8080/MyAxisWebService/Calculator.jws";
//设置调用的目标终端地址
call.setTargetEndpointAddress(new URL(url));
//进行调用
Object o = call.invoke(new Integer[]{1,2});
System.out.println(o);
}
运行客户端,成功的打印出返回信息则成功
2、 定制发布(Custom Deployment)
定制发布需要引入WSDD:Web Service Deployment Descriptor (webservice部署描述)
新建一个服务器端的web project编写服务器端JAVA类(可以有包名)
服务器端主要代码:
package cn.com.test.ce.webservice;
public class HelloWorldService {
public HelloWorldService(){
System.out.println("new出了一个新的服务");
}
public String sayHello(String name){
return "hello:"+name;
}
}
新建一个客户端的普通javaproject 编写wsdd文件(位置无所谓,最好位于项目的跟路径下)(以下测试均为项目根路径)
客户端wsdd文件:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="HelloWordService" provider="java:RPC">
<parameter name="scope" value="session"/>
<parameter name="className" value="cn.com.test.ce.webservice.HelloWorldServic/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
调用命令发布
Adminclient(运行的是这个类中的main方法)
要运行AdminClient中的main方法可以在客户端点击java project右键选择run as里面的open run dialog运行的main方法选择AdminClient的main方法,并且配置arguments为以下命令
-l http://localhost:8080/${your server project}/servlet/AxisServlet deploy.wsdd
该命令实际上是一个上传命令,将deploy.wsdd文档上传给服务器端AxisServlet,让其服务器生成server-config.wsdd,然后再次建立一个客户端测试,基本跟即时发布差不多,在url上有小小的不同:
代码:
//测试Service的范围
public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
//创建服务对象
Service service = new Service();
//通过服务对象创建调用对象
Call call=(Call)service.createCall();
//设置对象的操作名称
call.setOperationName("sayHello");
String url = "http://localhost:8080/MyAxisCDWebService/services/HelloWordService";
//设置调用的目标终端地址
call.setTargetEndpointAddress(new URL(url));
//将所有调用设置成一个会话
call.setMaintainSession(true);
//进行调用
Object o = call.invoke(new String[]{"张三"});
Object o1 =call.invoke(new String[]{"lisi"});
System.out.println(o);
System.out.println(o1);
}
最后定制发布的一些常用命令:
1、 如果不配置arguments里面的-l直接写deploy.wsdd的话默认发布到http://localhost:8080/axis/servlet/AxisServlet
2、 Undeploy.wsdd 卸载服务
3、 List //列出所有服务
4、 如果arguments里面什么都不配置,将会列出可选命令的列表
最后还有一个限定web Service的范围:(request,session,application)
在定制发布中的deploy.wsdd文件中加入:
<parameter name="scope" value="session"/>即限定发布的webservice在session范围内,可以通过在web service的java类构造方法中打印一句话来测试(上面的代码笔者已经贴出来了),并在编写客户端测试
客户端主要通过call.setMaintainSession(true);每次请求都使用同一个session,实际上上面的例子就是测试的一个session范围的例子,如果还想测其他的范围请读者自行测试了