axis1的手动配置

Axis简介


1.
什么是SOAP

SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.21.1中相对混乱的部分做了改进。
SOAP
被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。


2.
什么是Axis

AxisApache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。
但是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”目录下即可。

三、Axis的配置

Axis基于Java开发,可以部署于多种操作系统,使用前需要配置一系列的系统变量,在此假定你已经在本机上装好了Tomcat 4.0以上的版本,需要配置的系统变量如下表所示:

CATALINA_HOME
C:\Tomcat_4_1

(此处应为Tomcat的安装位置,注意路径名中不要有空格)

AXIS_HOME
%CATALINA_HOME%\webapps\axis

AXIS_LIB
%AXIS_HOME%\lib

AXISCLASSPATH
%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar

CLASSPATH 中加入:
%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.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源文件,将其扩展名改为.jwsJava Web Service的缩写),然后将该文件放到“……\webapps\axis”目录下即可。
   
在此给出一个从英里到公里的长度单位转换的服务,其源码如下:

文件Distance.jws

public class Distance
{
    public double convertMile2Kilometre( double mile )
    { 
 return mile * 1.609;  //
实现英里到公里的距离转换
    }
}

将其放到“……\webapps\axis”目录,通过访问http://localhost:8080/axis/Distance.jws?wsdl可以看到这个服务的WSDL描述文件,这说明Distance服务被成功发布了。描述的WDSL代码如下:
<?xml version="1.0" encoding="UTF-8" ?> 
- <wsdl:definitions targetNamespace="http://192.168.0.26:8080/axis/Distance.jws" xmlns="http://schemas.xmlsoap.org/wsdl/ 
   xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://192.168.0.26:8080/axis/Distance.jws" xmlns:intf="http://192.168.0.26:8080/axis/Distance.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wsdl:message name="convertMile2KilometreRequest">
  <wsdl:part name="mile" type="xsd:double" /> 
  </wsdl:message>
- <wsdl:message name="convertMile2KilometreResponse">
  <wsdl:part name="convertMile2KilometreReturn" type="xsd:double" /> 
  </wsdl:message>
- <wsdl:portType name="Distance">
- <wsdl:operation name="convertMile2Kilometre" parameterOrder="mile">
  <wsdl:input message="impl:convertMile2KilometreRequest" name="convertMile2KilometreRequest" />
  <wsdl:output message="impl:convertMile2KilometreResponse" name="convertMile2KilometreResponse" /> 
  </wsdl:operation>
  </wsdl:portType>
- <wsdl:binding name="DistanceSoapBinding" type="impl:Distance">
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> 
- <wsdl:operation name="convertMile2Kilometre">
  <wsdlsoap:operation soapAction="" /> 
- <wsdl:input name="convertMile2KilometreRequest">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded" /> 
  </wsdl:input>
- <wsdl:output name="convertMile2KilometreResponse">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://192.168.0.26:8080/axis/Distance.jws" use="encoded" /> 
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="DistanceService">
- <wsdl:port binding="impl:DistanceSoapBinding" name="Distance">
  <wsdlsoap:address location="http://192.168.0.26:8080/axis/Distance.jws" /> 
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>

需要注意的是:JWSweb服务发布是一个很简单的Web服务发布方式,在页面中你不能使用包,而且由于代码是在运行期被编译的,所以在部署之后,你也很难找到错误所在。

2. 使用定制发布 Web Service Deployment Descriptor(WSDD)

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

  因此,Axis提供了另一种服务发布方式,这就是定制发布。

  在此给出一个从加仑到升的容积单位转换的服务,其源码如下:

  文件Capacity.java
    package samples.capacity;
    public class Capacity
    {
        public double convertGallon2Litre( double gallon )
 {
     return gallon * 4.546;//
实现加仑到升的容积转换
 }//convertGallon2Litre()

    }/* Capacity */
 
   
将其编译成.class文件,放置到“……\webapps\axis\samples\capacity”目录下,即可着手进行发布。
   
定制发布不需要构建.jws文件,但必须创建服务发布描述文件deploy.wsddWeb Service Deployment Descriptor的缩写),这个文件负责描述服务的名称、入口等信息,其内容如下:
   
文件deploy.wsdd

    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <service name="Capacity" provider="java:RPC">
 <parameter name="className" value="samples.capacity.Capacity"/>
 <parameter name="allowedMethods" value="*"/>
 </service>
    </deployment>

    在这里服务的提供者是“java:RPC”,它被内建在Axis中,而且指明了一个JAVA RPC服务,做这个处理的类是org.apache.axis.providers.java.RPCProvider
   
我们是通过一个<parameter>标签告诉RPC服务应该调用的类,而另外一个<parameter>标签则告诉引擎,它可以调用这个类中的任何的Public方法。你也可以指定通过使用名字空间或者一些可以调用的方法列表,来指明那些方法可以被调用。

  将该文件也放到“……\webapps\axis\samples\capacity”目录下,然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。
  
“……\webapps\axis\samples\capacity”目录下,运行:

   java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -l http://localhost:8081/WebServiceTest/services/WebServiceServer.WSServer deploy.wsdd

   如果运行时说没有找到类,那么可能是类路径没有配置好,建议将所有的与axis相关的jar都写到classpath中去。这样只要运行:

   java org.apache.axis.client.AdminClient deploy.wsdd
  
可以看到以下运行结果:

 Processing file deploy.wsdd
 <Admin>Doneprocessing</Admin>

  这表明Capacity服务定制发布完成。
 
  
你也可以调用:
 java org.apache.axis.client.AdminClient undeploy.wsdd 
来取消部署。

   你也可以调用:
 java org.apache.axis.client.AdminClient list
来获得所有的已经部署的服务的列表。在这里你会看到services, handlers, transports等等,注意这个调用只是列出了WEB-INF\server-config.wsdd的文件内容。

   一定要注意:编译后的class文件要拷贝到web-inf/classes的目录中,如果该文件中有包存在的话,别忘了还要在classes目录下创建包的目录
  
通过访问http://localhost:8080/axis/services/Capacity?wsdl可以看到这个服务的WSDL描述文件,这说明Capacity服务被成功发布了。

查看要看你的deploy配置文件是怎么写的http://localhost:8080/项目/services/deploynamevalue?wsdl

http://localhost:8080/axis/servlet/AxisServlet查看所有定制发布的服务。
   WDSL
如下:
  <?xml version="1.0" encoding="UTF-8" ?> 
- <wsdl:definitions targetNamespace="http://localhost:8080/axis/services/Capacity" xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/axis/services/Capacity" xmlns:intf="http://localhost:8080/axis/services/Capacity" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wsdl:message name="convertGallon2LitreResponse">
  <wsdl:part name="convertGallon2LitreReturn" type="xsd:double" /> 
  </wsdl:message>
- <wsdl:message name="convertGallon2LitreRequest">
  <wsdl:part name="in0" type="xsd:double" /> 
  </wsdl:message>
- <wsdl:portType name="Capacity">
- <wsdl:operation name="convertGallon2Litre" parameterOrder="in0">
  <wsdl:input message="impl:convertGallon2LitreRequest" name="convertGallon2LitreRequest" /> 
  <wsdl:output message="impl:convertGallon2LitreResponse" name="convertGallon2LitreResponse" />
  </wsdl:operation>
  </wsdl:portType>
- <wsdl:binding name="CapacitySoapBinding" type="impl:Capacity">
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> 
- <wsdl:operation name="convertGallon2Litre">
  <wsdlsoap:operation soapAction="" /> 
- <wsdl:input name="convertGallon2LitreRequest">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://capacity.samples" use="encoded" /> 
  </wsdl:input>
- <wsdl:output name="convertGallon2LitreResponse">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/Capacity" use="encoded" /> 
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="CapacityService">
- <wsdl:port binding="impl:CapacitySoapBinding" name="Capacity">
  <wsdlsoap:address location="http://localhost:8080/axis/services/Capacity" /> 
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>

  WSDD 的高级功能:
  (1) AXIS
支持三种对象范围:
     "request"
范围:这是默认的情况,每一次Soap请求的时候都将创建新的对象。
     "application"
范围:将会为所有的请求生成一个单独的共享的对象。
     "session"
范围:为每一个session期的客户端请求创建一个对象。
 
指定方法如下:
  <service name="MyService"...>
  <parameter name="scope" value="value"/>
  ...
  </service>
  (2)
更多部署内容:Handlers and Chains
 
让我们来深入挖掘一下Axis引擎的更强大的特性。如果我们想跟踪我们的服务被调用了多少次,那么我们只需要包含一个简单的handler,它存放在samples/log目录下。要使用这个handler,你就首先应该部署这个handler,然后使用在部署服务时给它指定的名字。下面是一个wsdd文件的例子:
  <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
   <!-- define the logging handler configuration -->
    <handler name="track" type="java:samples.userguide.example4.LogHandler">
      <parameter name="filename" value="MyService.log"/>
    </handler>
  
   <!-- define the service, using the log handler we just defined -->
    <service name="LogTestService" provider="java:RPC">
     <requestFlow>
       <handler type="track"/>
     </requestFlow>
  
     <parameter name="className" value="samples.userguide.example4.Service"/>
     <parameter name="allowedMethods" value="*"/>
    </service>
  </deployment>

  第一段指明了一个名为trackhandler,它是samples.userguide.example4.LogHandler类的实例。另外还指定了一个参数filename,用于指定日志文件名称。
 
下面的那段指明了一个RPC服务,和我们在上面的例子中看到的一样,所不同的是在service标签中的<requestFlow>标签,它指定了一些在调用服务前应该被调用的handler集。也就是由于我们在部署中插入了这个"track"的引用,所以我们确定每次调用服务的时候都将被记录到日志文件中去。
  
  (3)
远程管理:
  <service name="AdminService" provider="java:MSG">
 <parameter name="className" value="org.apache.axis.util.Admin"/>
 <parameter name="allowedMethods" value="*"/>
 <parameter name="enableRemoteAdmin" value="true"/>
  </service>
  WARNING: enabling remote administration may give unauthorized parties access to your machine. If you do this, please make sure to add security to your configuration!
 
所以远程管理涉及到安全问题,不建议采用。

---------------------------------------华丽的分隔符-------------------------------------------------

上面是基于axis项目的发布,下面来说说搭建自己webservice项目的步骤:

1.新建一个web项目
2.准备axis1的jar包,拷贝到项目中
3.配置axis的home,lib,classpath等环境变量。
4.建立源代码,书写server端代码
  

package webServiceServer;

public class WSServer {
	public String CallWSServer(String args){
		String returnString = ""; 
		if(args == null){
			returnString="what a fucking day!!";
		}else{
			returnString = args;
		}
		return returnString;
	}
}

 5.定制发布这个webservice
6.书写一个deploy.wsdd发布文件

<deployment xmlns="http://xml.apache.org/axis/wsdd/"  
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
    
    <service name="WSServer" provider="java:RPC">  
    	<parameter name="className" value="webServiceServer.WSServer"/>  
        <parameter name="allowedMethods" value="*"/>  
    </service>  
</deployment>

 放到与服务器端classes文件一起,用cmd进入这个目录下,输入以下命令:

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -l http://localhost:8081/WebServiceTest/services/WebServiceServer.WSServer deploy.wsdd

 对这个命令给予以下说明:%AXISCLASSPATH%为axis的classpath的环境变量名称;http://localhost:8081/WebServiceTest/services/WebServiceServer.WSServer这个为你部署这个webservice的项目路径,可以不带但是带上最好。WebServiceTest为项目名称services为web.xml中配置目录WebServiceServer.WSServer中WebServiceServer为服务器端程序的包名WSServer为程序名称。
输入命令后如果显示 

Processing file deploy.wsdd
 <Admin>Doneprocessing</Admin>

则发布成功,其它为错误,可以根据错误的提示信息,改正。

7.发布成功后,我们可以看看发布的情况
在浏览器中输入:http://localhost:8081/MyWebService/servlet/AxisServlet其中MyWebService为项目名称其它的固定,就可以看到你现在已经发布的webservice。从此也可以知道哪个webservice的wsdl地址
例如刚刚发布的地址为:http://localhost:8081/MyWebService/services/WSServer?wsdl
8.开发客户端

package webServiceClient;

import javax.xml.namespace.QName;

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

public class WSClient {
		public static void main(String[] args){ 
			try{ 
				String endpoint = "http://localhost:8081/MyWebService/services/WSServer?wsdl"; 
				Service service = new Service(); 
				Call call = null; 
				call = (Call) service.createCall(); 
				call.setOperationName(new QName( "http://localhost:8081/MyWebService/services/WSServer?wsdl", "CallWSServer")); 
				call.setTargetEndpointAddress (new java.net.URL(endpoint)); 
				String ret = (String) call.invoke(new Object[] {"张君"}); 
				System.out.println("return value is :" + ret); 
			}catch(Exception ex){ 
				//ex.printStackTrace();
				ex.printStackTrace();
			}
		} 
}

 运行就能调用了!

 

你可能感兴趣的:(apache,tomcat,应用服务器,配置管理,SOAP)