axis入门

一、Axis简介
1. 什么是SOAP
SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。
SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。
2. 什么是Axis
Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本软件包可以从http://ws.apache.org/axis/下载得到。
但是Axis不仅仅是一个SOAP引擎,它还包括:
    一个独立运行的SOAP服务器
    一个servlet引擎的插件,这个servlet引擎可以是Tomcat
    对WSDL的扩展支持
    一个将WSDL的描述生成JAVA类的工具
    一些示例代码
    还有一个监控TCP/IP包的工具

二、Axis的安装
应用Axis开发Web Services,你需要安装如下软件:
1.JDK1.4.2及其以上
2.一个支持Servlet的服务器引擎,比如广为人知的Tomcat。
当安装好Tomcat之后,只需将下载的Axis软件包解压缩,将其中的“webapps”目录下的“axis”目录整个拷贝到Tomcat安装目录下的“webapps”目录下即可。
3.环境变量设置
  AXIS_HOME 即axis-bin-1_2.zip解压的目录(我的是在F:\soap\axis-1_2)
  AXIS_LIB   即 %AXIS_HOME%\lib
  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;也就是把%AXIS_LIB%下所用JAR文件都导入
三、Axis的测试
安装配置完毕后,应测试一下是否Axis可以正确运行了。
  启动Tomcat服务器,在浏览器中访问http://localhost:8080/axis/happyaxis.jsp,如果页面显示有错误,则需要回头检查一下相关配置是否正确,如果浏览页面能正确显示出系统组件、属性等参数配置信息,则表示安装成功。现在可以开始开发你的Web Services应用了。
四、服务的发布
Axis提供了两种服务发布方式,一种是即时发布(Instant Deployment),一种是定制发布(Custom Deployment)。
1. 使用即时发布 Java Web Service(JWS)
  对即时发布的支持是Axis的特色之一,使用即时发布使用户只需有提供服务的Java类的源代码,即可将其迅速发布成Web服务。每当用户调用这类服务的时候,Axis会自动进行编译,即使服务器重启了也不必对其做任何处理,使用非常简单快捷。
  使用即时发布首先需要一个实现服务功能的Java源文件,将其扩展名改为.jws(Java Web Service的缩写),然后将该文件放到“……\webapps\axis”目录下即可。
编写JAVA类Hello.java
public class Hello{
 public String hello(String name){
  if(name==null)
   name = "";
  return "hello,"+name;
}
}

将其名字更改为Hello.jws放到“……\webapps\axis”目录,通过访问http://localhost:8080/axis/Hello.jws?wsdl可以看到这个服务的WSDL描述文件,这说明Distance服务被成功发布了。
需要注意的是:JWS的web服务发布是一个很简单的Web服务发布方式,在页面中你不能使用包,而且由于代码是在运行期被编译的,所以在部署之后,你也很难找到错误所在。
客户端的开发:
先熟悉一下两个概念:
SOAP:简单对象访问协议。这是一种在松散的、分布的环境中使用XML对等地交换结构化的和类型化的信息提供了一个简单且轻量级的机制,它是一个基于XML的协议。它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
虽然这四个部分都作为SOAP的一部分,作为一个整体定义的,但他们在功能上是相交的、彼此独立的。特别的,信封和编码规则是被定义在不同的XML命名空间(namespace)中,这样使得定义更加简单。
SOAP的主要设计目标是简明性和可扩展性。这就意味着有一些传统消息系统或分布式对象系统中的特性将不包含在SOAP的核心规范中。这些特性包括:分布式垃圾收集;批量消息传输/处理;对象引用;对象激活。
WSDL:Web Service描述语言。使用了WSDL,我们就可以通过这种跨平台和跨语言的方法使Web Service代理的产生自动化。就像COM和CORBA的IDL文件,WSDL文件由客户和服务器约定。由于WSDL设计成可以绑定除SOAP以外的其他协议,这里我们主要关注WSDL在HTTP上和SOAP的关系。同样,由于SOAP目前主要用来调用远程的过程和函数,WSDL支持SOAP传输的文档规范。
WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务,截然不同的网站都可以实现。

打开命令行窗口,转到AXIS目录下的WEB-INF子目录。确保Tomcat服务已经处于启动状态,键入命令 :
Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/Hello.jws?wsdl

该命令执行的结果是在当前所在目录下产生一个子目录 localhost/axis/Hello_jws,该目录下有四个JAVA源文件,它们分别是:
Hello.java 定义了Web服务接口,此例中只有一个hello方法。
HelloService.java 定义了用于获取Web服务接口的方法。
HelloServiceLocator.java 接口HelloService的具体实现。
HelloSoapBindingStub.java Web服务客户端桩,通过该类与服务器交互。
这四个JAVA类帮我们处理了大部分的逻辑,我们需要的仅仅是把这些类加到我们的项目然后创建一个我们自己的类来调用它们即可。为此我们新加一个类Main.java,为了方便,让这个类与刚产生的四个类都在同一个包下。内容如下:
//Main.java
package localhost.axis.Hello_jws;
public class Main{
public static void main(String[] args) throws Exception{
 HelloService service = new HelloServiceLocator();
 Hello hello = service.getHello(); 
 System.out.println("Response:"+hello.hello("Peter")); 
 }
}

使用以下命令进行编译:
javac -classpath lib\axis.jar;lib\jaxrpc.jar localhost\axis\Hello_jws\*.java

如果编译没有问题的话执行该测试程序:
java -Djava.ext.dirs=lib -cp . localhost.axis.Hello_jws.Main//运行结果:Response:hello,Peter


或者编写如下代码进行测试:
package com.axis;


import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class TestClient {
	public static void main(String[] args) throws Exception {
		String endPoint="http://localhost:8080/axis/Hello.jws";
		Service service = new Service();
		Call call = (Call) service.createCall();
		call.setTargetEndpointAddress(new java.net.URL(endPoint));
		call.setOperationName("hello");
		String result = (String) call.invoke(new Object[]{"coris"});
		System.out.println(result);
	}
}

2. 使用定制发布 Web Service Deployment Descriptor(WSDD)
  即时发布是一项令人激动的技术,它使Web服务的开发变得如此简单;然而即时发布并不总是最好的选择,比如有些应用系统是第三方提供的,我们没有购买源代码,只有.class文件,但我们又希望将这个应用系统的一些功能对外发布成Web服务,使其能够在更大范围内产生作用,这个时候即时发布技术就无能为力了。此外,即时发布技术并不灵活,无法进行更多的服务配置,这使得它并不能满足一些特定系统的需求。
  因此,Axis提供了另一种服务发布方式,这就是定制发布。
首先编写java类
package com.axis;

public class Second {
	public String sayHello(String name){
		return "hello,"+name;
	}
}

将Second.java编译成Second.class,放到...\webapps\axis\WEB-INF\classes下
在...\webapps\axis\WEB-INF下新建deploy.wsdd文件,即SOAP服务发布描述文件
  deploy.wsdd
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <service name="Second" provider="java:RPC">
  <parameter name="className" value="com.axis.Second"/>
  <parameter name="allowedMethods" value="*"/>
 </service>
</deployment>

在DOS下转换目录到%TOMCAT_HOME%\webapps\axis\WEB-INF,命令:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
你会发现目录下多了一个server-config.wsdd文件,这就是AXIS的配置文件,以后所有的服务发布描述都会在里面找到。(当然,你可以直接修改它,不用再写deploy.wsdd)然后打开浏览器http://localhost:8080/axis/servlet/AxisServlet,你就会看到你的服务已发布
同样用客户端程序访问一下:
注意与上面的区别
package com.axis;


import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class SecondClient {
	public static void main(String[] args) throws Exception {
		String endPoint = "http://localhost:8080/axis/services/Second";//唯有这与上面不一样  
		Service service = new Service();
		Call call = (Call) service.createCall();
		call.setTargetEndpointAddress(new java.net.URL(endPoint));
		call.setOperationName("sayHello");
		String result = (String) call.invoke(new Object[]{"coris"});
		System.out.println(result);
	}
}

运行结果:hello,coris

你可能感兴趣的:(SOAP,axis)