Axis技术文档
简介:Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架,Axis目前版本是为Java编写的,不过为C++的版本正在开发中。而在工作中我们可以方便的通过Axis进行Webservice的开发。
下面我们就一步一步的来进行Axis的开发
1. 从 Axis的官方网站上下载(http://ws.apache.org/axis/).解压缩axis-bin-1_3.zip。在lib中包含Axis必须使用的jar包。
2. 下载完成之后,安装axis.( Axis 1.3,tomcat 5.028, jdk 1.42),复制你的Axis -bin-1_3安装包下webapps文件夹中的axis目录到tomcat的webapps下,发布你的Axis应用,启用你的Tomcat,IE地址栏中输入http://localhost:8080/axis, 这时就会出现axis的欢迎画面.进入Validation链接以检查axis所使用的jar包是否全都存在,如果不存在,就下载那部分不存在的,下载完后,把下载解压后文件夹中lib目录下的.jar文件复制到tomcat/webapps/ axis/WEB-INF/lib目标下,重启Tomcat,最终如果出现下面的界面,说明安装axis成功。
3. 测试axis
a) 新建一web项目,名称为testServiceAxis,把tomcat/webapps/ axis/WEB-INF/lib目录下的所有jar包全部复制到testServiceAxis项目的web-inf/lib目录中去。在src目录下新建一文件去名称为HelloWorld.jws,里面的代码很简单,就是一个方法打印一句话,”Hi,你好,XXX,欢迎你来到精彩的axis世界上。”
public class HelloWorld{ public String hello(String name) { if (name == null) { name = ""; } return "Hi,你好 " + name + ",欢迎你来到精彩的axis世界上!"; } } |
让上面的代码做为服务器端来运行。也就是说,供别个调用的一个服务。
b) 另建一web项目,名称为testClieatAxis,把把tomcat/webapps/ axis/WEB-INF/lib目录下的所有jar包全部复制到testServiceAxis项目的web-inf/lib目录中去。现在我们编写调用web service上的程序,也就是说,我们现在进行两个应用间的通信。在src目标下新建一测试类,名称为Test.java,代码如下:
import java.net.MalformedURLException; import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call; import org.apache.axis.client.Service;
public class Test {
/** * @param args */ public static void main(String[] args) { String endpoint = "http://192.168.1.234:" + "8080" + "/testServiceAxis/HelloWorld.jws"; // 以定制发布方式,如果是jws文件,则endpoint为相应的jws文件
Service service = new Service(); Call call; try { call = (Call) service.createCall(); String str="Fangtengfei"; call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName("hello"); //object数组为远程方法的参数 String res = (String) call.invoke(new Object[] { str }); System.out.println(res); } catch (ServiceException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } } |
最后如果能够进行正常的打印,就说明已经配置成功了,一个最简单的web服务,客户端和服务器端就完成了通信了。
c) 以上的程序把它放到两个程序中的目的就是,为了让用户更容易明白,服务端和客户端之间的通信,让两者间不混淆。所以把它放在两个项目中来处理,其实放到一个项目中来测试也是可以的。
d) 在实际web service开发中,是绝对没这么简单的,下面让我们来看一下,如何通过WSDL的方式进行通信,也即通过可配置的形式进行通信。
4. 通过WSDL进行webservice的通信:
a) 什么是WSDL(Web Services Description Language): 是一个用来描述Web服务和说明如何与Web服务通信的XML语言。具体详细内容请参考http://blog.youkuaiyun.com/ftf_tengfei/archive/2007/09/20/1793221.aspx
b) 另介绍一个Eclispe的插件,Wsdl转java的插件http://www.myspotter.com/wsdl2java.shtml,在此份文档中,我们转换还是通过java命令来完成。由于要用到相关的java命令,我们需要配置相关的系统环境变量:
1) 先要保证java系统环境变量没问题,具体内容可参考网上教程。
2) 另要配置axis的系统环境变量,主要有以下几个:
l AXIS_LIB
l AXIS_HOME
l AXISCLASSPATH:%AXIS_LIB%/axis.jar;%AXIS_LIB%/commons-discovery-0.2.jar;%AXIS_LIB%/commons-logging-1.0.4.jar;%AXIS_LIB%/jaxrpc.jar;%AXIS_LIB%/saaj.jar;%AXIS_LIB%/log4j-1.2.8.jar;
注意此目录一定要配置正确,不然等下出现类找不到错误,也就是说,如果出现classDefFine的时候,就可来这里找下原因。
c) 新键一web工程,取名称为testAxisWSDL,同样需要在项目的classpath中加入axis文件夹下的jar包
d) 在src目录编写一个和上面一样.java文件,文件名称和内容如下:
HelloWorld.java
public class HelloWorld{ public String hello(String name) { if (name == null) { name = ""; } return "Hi,你好 " + name + ",欢迎你来到精彩的axis世界上!"; } } |
编译上述文件,并把他copy到tomcat/webapps/ axis/WEB-INF/classes
e) 同在src目录下,新建一个WSDL文件,取名称deploy.wsdd
HelloWorld.java
<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="HelloWorld"/> <parameter name="allowedMethods" value="sayHello"/> </service> </deployment> |
f) 在DOS下转换目录到%TOMCAT_HOME%/webapps/axis/WEB-INF/ classes,命令:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
注意执行这个命令的时候,一定要保证Tomcat是启动的,否则执行不成功。
g) 最后,回到testAxisWSDL项目中,新建一个测试类,名称和内容如下所示:
HelloClient.java
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://localhost:" + "8080" + "/axis/services/MyService";// 注意!差别仅仅在这里!!
Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName("hello");
String res = (String) call.invoke(new Object[] {"Fangtengfei"});
System.out.println(res); } } |
h) 是不是这里的运行结果和刚才上面的运行结果是一样的呢,是的,是完全一样的,只是我们采用了不同的实现方式,到这里一个入门级别的axis就算实现了,是的,确实到这,就完全实现了。。
i) 到这过程中,如果读者有什么不明白的地方,请发邮件至:ftf_tengfei#163.com