以tomcat为例,网上找个axis-bin-1_4.zip
找到%TOMCAT_HOME%为tomcat安装目录
1解压axis-bin-1_4.zip这个包可以看到webapps目录,双击进入把里面的AXIS文件夹拷到%TOMCAT_HOME%/webapps目录下,之后拷贝activation.jar、mail.jar、tools.jar到%TOMCAT_HOME%/webapps/axis/WEB-INF/lib目录下(还需要把解压出来的文件夹里的lib目录下的jar包也引入,不然写程序的时候会没工具类导入)。启动tomcat,访问http://localhost:8080/axis/happyaxis.jsp如果访问成功,表明基本的配置你已经做完。
2现在来说一下最关键的Webservice的发布。AXIS提供了两种发布方式,一种是即时发布(Instant Deployment),另外一种是定制发布(Custom Deployment)。即时发布提供了一种非常简单的webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发布才是首选。
一、即时发布:
即时发布提供了一种非常简单发布方式,发布者只要有Java源代码(也就是.java文件),然后把其后缀名改成jws(也就是 java web service的缩写)拷贝到%TOMCAT_HOME%/webapps/axis目录下即完成了所有的发布工作。AXIS的编译引擎会处理接下来的所有事情。下面是一段示例代码:
java 代码
public class HelloAXIS {
public String Hello(String name){
return "AXIS say hello to " + name;
}
}
把HelloAXIS.java 文件改成HelloAXIS.jws 然后拷贝到%TOMCAT_HOME%/webapps/axis目录下,启动Tomcat之后访问http://localhost:8080/axis/HelloAXIS.jws 如果能看到 Click to see the WSDL这个超链接就说明已经发布成功了,点击进去就可以看到这个Webservice的WSDL描述文件。server端的发布已经完成了,接下来就是编写Client端测试代码了。
java 代码
package com.yourcompany.Test;
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class Test {
public static void main(String[] args) throws Exception{
String targetEendPoint ="http://localhost:8080/axis/HelloAXIS.jws";
Service service = new Service();
Call call = (Call) service.createCall();
call.setOperationName(new QName(targetEendPoint,"Hello"));
call.setTargetEndpointAddress(new URL(targetEendPoint));
String result = (String) call.invoke(newObject[]{"Robert"});
System.out.println(result);
}
}
4定制发布:
比起即时发布定制发布更加烦琐也更复杂,但是换来的却是更大的灵活性,因此在实际项目中定制发布还是不二的选择。定制发布需要你自己编写一个WSDD(Web ServiceDeployment Descriptor)文件,这个东东类似与XML稍后会做出介绍。废话不多说,我们来看代码:
java 代码
package com.chnic.webservice;
public class HelloWorld {
public HelloWorld(){
}
public String hello(String str){
return "Hello " + str;
}
public int add(int a, int b){
return a + b;
}
}
一个带包的很简单的类,在eclipse下编译后按照包名拷到 %TOMCAT_HOME%/webapps/axis/WEB-INF/classes目录下。以这个类为例,拷贝完之
后这个HelloWorld.class的路径就是
%TOMCAT_HOME%/webapps/axis/WEB-INF/classes/com/chnic/webservice。PS:如果嫌这样太麻烦,可以另外建一个Java Web工程用myeclipse的发布工具发布到Tomcat之后,整体一次性拷贝到websericve的工程中。
接下来就需要编写发布文件deploy.wsdd。到%TOMCAT_HOME%/webapps/axis/WEB-INF目录下建立这个文件并在其中添加如下内容:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="HelloWorld"provider="java:RPC">
<parameter name="className" value="com.chnic.webservice.HelloWorld"/>
<parameter name="allowedMethods"value="*"/>
</service>
</deployment>
简单的介绍下各个节点的含义:
"HelloWorld"当然是这个webservice的名字,后面紧跟的java:RPC指的是服务类型。这里一共有有4种类型,分别是:RPC,Document, Wrapped 和 Message。有兴趣可以看下 org.apache.axis.providers这个包和子包下面的类的API文档。之后的parameter节点第一个当然是指出具体的类,第二个从字面上也很好理解:允许调用的方法。这里的配置告诉引擎可以调用所有的public方法,当然你也可以自己指定。
编写完配置发布文件之后,cmd打开windows的控制台,进入%TOMCAT_HOME%/webapps/axis/WEB-INF目录下键入如下命令
java org.apache.axis.client.AdminClientdeploy.wsdd
或者
javaorg.apache.axis.client.AdminClient –l http://localhost:8088/axis/services/HelloWorld deploy.wsdd
控制台显示<Admin>Done processingAdmin> 说明配置成功
在此,需要将需要的jar包加入classpath中
创建环境变量,设置AXIS的环境变量.
这种方式的编码,先要设置一下命令行的环境.右键我的电脑――>属性――>
选择高级选项卡――>新建用户变量――>输入用户变量如下:
变量名:AXIS_LIB
变量值: E:/tomcat5.28/Tomcat5.0/webapps/axis/WEB-INF/lib
变量名:CLASSPATH
变量值:.;%AXIS_LIB%/axis.jar;
%AXIS_LIB%/activation.jar;
%AXIS_LIB%/axis-ant.jar;
%AXIS_LIB%/commons-discovery-0.2.jar;
%AXIS_LIB%/commons-logging-1.0.4.jar;
%AXIS_LIB%/jaxrpc.jar;
%AXIS_LIB%/log4j-1.2.8.jar;
%AXIS_LIB%/mail.jar;
%AXIS_LIB%/saaj.jar;
%AXIS_LIB%/wsdl4j-1.5.1.jar;
%AXIS_LIB%/xmlsec-1.4.0.jar;
%AXIS_LIB%/dom4j-1.6.1.jar;
变量名:AXIS_HOME
变量值:E:/tomcat5.28/Tomcat5.0/webapps/axis
发布成功之后你可以通过访问http://localhost:8080/axis/servlet/AxisServlet 来查看你所有的定制发布的服务
客户端测试代码
String targetEendPoint ="http://localhost:8080/axis/services/HelloWorld";
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(newURL(targetEendPoint));
call.setOperationName(newQName(targetEendPoint, "hello"));
String result = (String) call.invoke(newObject[]{"Robert"});
System.out.println(result);
call.setOperationName(newQName(targetEendPoint, "add"));
Integer res = (Integer) call.invoke(newObject[]{new Integer(1), new Integer(2)});
System.out.println("The result is:" + res);