转自:https://blog.csdn.net/chjttony/article/details/6209998

1.AXIS简介:

Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。
但是Axis不仅仅是一个SOAP引擎,它还包括:

(1). 一个独立运行的SOAP服务器。
(2).一个servlet引擎的插件,这个servlet引擎可以是Tomcat。
(3).对WSDL的扩展支持。

(4).一个将WSDL的描述生成JAVA类的工具。
(5).一些示例代码。
(6).还有一个监控TCP/IP包的工具。

2.Axis安装配置:

(1)、环境 J2SE SDK, Servlet 容器,如Tomcat 6.0。

(2)、到 http://ws.apache.org/Axis/网站下载Axis安装包。
(3)、解压缩安装包,将Axis_UNZIP_PATH/Axis-version/webapps下的Axis包拷贝到TOMCAT_HOME/webapps目录下,以下约定Axis_HOME为该TOMCAT_HOME/webapps/Axis目录。

(4)、启动tomcat,访问http://localhost:8080/Axis 检查安装是否成功。

(5)、以上步骤执行成功,可以开发webservice例子了。

3.AXIS的发布方式:

AXIS提供了两种Webservice的发布方式:

及时发布(Instant
Deployment)。

定制发布(Custom
Deployment)。

4.AXIS的及时发布方式——java web service(jws):

(1).对即时发布的支持是Axis的特色之一,使用即时发布只需将提供服务的Java类的源代码后缀改为”.jws”,然后将该jws文件放到”%Tomcat_HOME%/webapps/axis”目录下,即可将其迅速发布成Web服务。每当用户调用这类服务的时候,Axis会自动进行编译,即使服务器重启了也不必对其做任何处理,使用非常简单快捷。

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

5.AXIS定制发布方式——wsdd方式:

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

(2).将java源代码编译成.class文件,放置到“%Tomcat_HOME%/webapps/axis/”目录下,即可着手进行发布。定制发布不需要构建.jws文件,但必须在” %Tomcat_HOME%/webapps/axis/WEB-INF/”目录下创建服务发布描述文件deploy.wsdd(Web Service Deployment Descriptor的缩写),这个文件负责描述服务的名称、入口等信息,其内容如下:

  1. <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  2. <!--provider=””java:RPC”是服务类型,除了RPC方式以外,还有Document、Wrapped和Message方式-->
  3. <service name="服务名" provider="java:RPC">
  4. <!--告诉服务应该调用的类-->
  5. <parameter name="className" value="服务实现类全路径"/>
  6. <!--告诉服务可以调用这个类中的任何的Public方法,也可以指定方法名-->
  7. <parameter name="allowedMethods" value="*"/>
  8. <parameter name=”scope” value=”request”/>
  9. </service>
  10. </deployment>

(3).部署定制服务:

使用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。
   在“%Tomcat_HOME%/webapps/axis/”目录下,运行:

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>

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

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

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

6.客户端调用AXIS发布的服务:

  1. String url =”AXIS服务的发布地址路径”;
  2. Service serv = new Service();
  3. Call call = (Call)serv.createCall();
  4. call.setTargetEndpointAddress(url);
  5. call.setOperationName(new QName(url, “调用服务的方法名”));
  6. call.invoke(new Object[]{参数对象});

7. AXIS支持三种对象范围:
(1).request范围:这是默认的情况,每一次Soap请求的时候都将创建新的对象。
(2).application范围:将会为所有的请求生成一个单独的共享的对象。
(3).session范围:为每一个session期的客户端请求创建一个对象。
  指定方法如下:

  1. <service name="MyService"...>
  2. <parameter name="scope" value="对象范围"/>
  3. ...
  4. </service>

8. AXIS的Handler和Handlers Chain:

Webservice的Handler可以在Webservice每个方法调用之前或之后做一些特定事情,如权限验证,记录日志等等常用操作。

(1).定义Handler:

自定义的Handler必须要继承BasicHandler类,并实现其中的invoke(MessageContext
context)方法,其中MessageContext参数是AXIS上下文。

Handler通过getOperation(String string)方法获得配置文件的属性值,通过<requestFlow>标签来讲Handler引入到某个Service中。

(2).配置Handler:

在wsdd文件中加入如下配置:

  1. <handler name=”handler名称” type=”java:handler全路径名”>
  2. <parameter name=”handler变量名” value=”……”/>
  3. ……
  4. </handler>

(3).为WebService引入Handler:

在wsdd文件的<service>中加入如下配置:

  1. <requestFlow>或者<responseFlow>
  2. <handler type=”handler名”/>
  3. </requestFlow>或者</responseFlow>

(4).Hanlder Chain:

a.定义Handler Chain:

Handler Chain是实现一连串多个Handler的链,Chain必须继承SimpleChain类,然后在构造方法中使用:this.addHandler(handler对象);将Handler加入到Chain中。

b.配置Handler Chain:

在wsdd文件中,Chain的配置和Handler有些不同,<chain>元素中的子元素只允许是<handler>或者<chain>,即允许<chain>嵌套,具体配置如下:

  1. <chain name=”chain名”>
  2. <handler type=”java:chain的全路径”/>
  3. ......
  4. </chain>

9.WebService传递复杂对象:

(1).创建Qname:

  1. Qname表示XML规范中定义的限定名称,由名称空间URI、本地部分和前缀组成,如:
  2. //第一个参数是名称空间,第二个参数是本地部分
  3. Qname qn = new Qname(”urn:AddressManager”, ”Address”);

(2).注册对象类型映射:

如:

  1. call.registerTypeMapping(对象.class, QName,
  2. new org.apache.axis.encoding.ser.BeanSerializerFactory(对象.class, QName),
  3. new org.apache.axis.encoding.ser.BeanDeSerializerFactory(对象.class, QName));

(3).返回值类型设置:

如:

  1. call.setReturnClass(ArrayList.class);

(4).设置传递的方法参数类型:

如:

  1. call.addParameter(“参数名”, XMLType.XSD_ANYTYPE, ParameterModel.IN);

(5).在wsdd文件中加上类型映射:

在<service>标签中加入如下配置:

  1. <beanMapping qname=”前缀:本地名”
  2. xmlns:前缀=”urn:名称空间”
  3. languageSpecificType=”java:自定义类型全路径”/>

10.WebService传递带有内部类的复杂对象:

(1).内部类必须是可序列化的,内部类必须是静态的,否则不能被序列化。

(2).内部类也要像自定义类一样进行映射和注册,如:

  1. call.registerTypeMapping(外部类.内部类.class, QName,
  2. BeanSerializerFactory.class, BeanDeSerializerFactory.class);

(3).在wsdd文件中配置内部类的相关映射:

如:

  1. <beanMapping qname=”本地名”
  2. xmlns:前缀=”urn:名称空间”
  3. languageSpecificType=”java:外部类全路径$内部类名”/>

11.Webservice的RMI调用方式:

本地实现一个Remote接口,其中包含远程webservice的调用方法(同名、同返回类型、同参数类型),则通过service可以获得一个对远程webservice对象的引用,用该引用可以直接像调用本地方法一样调用远程方法。

(1).服务器端不用继承或者实现任何接口。

(2).通过如下方法使本地的远程接口获取webservice引用:

  1. 接口类型 对象 =  (接口类型)Service对象.getPort(endpoint/QName, ProxyInterface.class);

12.WebService传递异常对象:

(1).自定义异常。

(2).方法中抛出该异常对象。

(3).在wsdd文件中加入如下配置:

在<service>元素的<operation>标签中加入<fault>子标签如下:

  1. <operation name=”……”>
  2. <fault name=”……”
  3. qname=”……”
  4. type=”tns:ServerException”/>
  5. </operation>
  6. <typeMapping qname=”……”
  7. type=”java:自定义异常类全路径”
  8. serializer=”org.apache.axis.encoding.ser.BeanSerializerFactory”
  9. deserializer=“org.apache.axis.encoding.ser.BeanDeSerializerFactory”
  10. encodingStyle=http://schemas.xmlsoap.org/soap/encoding/”/>

13.WebService传递文件:

(1).服务器端方法:

  1. public String receive(DataHandler handler, String fileName){
  2. File file = new File(fileName);
  3. if(handler == null || filename == null || fileName.equals(“”)){
  4. return “failure”;
  5. }
  6. InputStream input = null;
  7. FileOutputStream fos = null;
  8. try{
  9. input = handler.getInputStream();
  10. fos = new FileOutputStream(file);
  11. byte[] buffer = new byte[1024];
  12. while(input.read(buffer) != -1){
  13. fos.writer(buffer);
  14. }
  15. }catch(Exception e){
  16. e.printStackTrace();
  17. }finally{
  18. if(input != null){
  19. try{
  20. input.close();
  21. }catch(IOException e){
  22. }
  23. }
  24. if(fos != null){
  25. try{
  26. fos.close();
  27. }catch(Exception e){
  28. }
  29. }
  30. }
  31. return “success”;
  32. }

注意:DataHandler是一个专门的传送器,通过它可以把文件进行序列化。

(2).wsdd文件进行如下配置:

  1. <service name=”FileReceiverServer” provider=”java:RPC”>
  2. <parameter name=”className” value=”服务器文件接收类全路径”/>
  3. ……
  4. <operatiojn name=”receive”
  5. qname=”operNS:receive”
  6. xmlns:operNS=”receive”
  7. returnType=”rtns:String”
  8. xmlns:rtns=”http://www.w3.org/2001/xmlSchema”>
  9. <parameter name=”handler” type=”myns:DataHandler”
  10. xmlns:myns=http://www.w3.org/XmlSchema”/>
  11. <parameter name=”fileName” type=”tns:String”
  12. xmlns:tns=http://www.w3.org/XmlSchema”/>
  13. </operation>
  14. <typeMapping qname=”myns:DataHandler”
  15. xmlns:myns=”DataHandler”
  16. languageSpecific=”java:javax.activation.DataHandler”
  17. serializer=”org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory”
  18. deserializer=”org.apache.axis.encoding.ser.JAFDataHandlerDeSerializerFactory” encodingstyle=http://schemas.xmlsoap.org/soap/encoding/”/>
  19. </service>

(3).客户端传递DataHandler对象:

  1. DataHandler dh = new DataHandler(new FileDataSource(文件路径名));

文件路径名的获取一般写法如:

  1. FileSenderClient.class.getResource(文件名).getPath();

8.AXIS1基础的更多相关文章

  1. Numpy基础学习

    Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包. 主要的功能: 1.ndarray,一个具有矢量运算和复杂广播工能的快速且节省空间的多维数组 2.用于对整组数据 ...

  2. 小白眼中的AI之~Numpy基础

      周末码一文,明天见矩阵- 其实Numpy之类的单讲特别没意思,但不稍微说下后面说实际应用又不行,所以大家就练练手吧 代码裤子: https://github.com/lotapp/BaseCode ...

  3. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  4. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  7. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  8. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  9. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

随机推荐

  1. Rman备份及不完全恢复操作

    最后更新时间:2018/12/18 启用归档 --检查是否为归档 SQL> archive log list; Database log mode              No Archive ...

  2. Object-C,四则运算计算器

    下面是是一个比较复杂的类. 定义一个四则运算计算器Caculator的接口和实现. 在main函数中,让用户输入四则运算表达式,比如a+b,a-b. 最后,在控制台输出结果. 用到的语法:接口.类的定 ...

  3. 【Uva 11584】Partitioning by Palindromes

    [Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...

  4. Spring Cloud学习笔记【六】Hystrix 监控数据聚合 Turbine

    上一篇我们介绍了使用 Hystrix Dashboard 来展示 Hystrix 用于熔断的各项度量指标.通过 Hystrix Dashboard,我们可以方便的查看服务实例的综合情况,比如:服务调用 ...

  5. [PostCss] Easily Load Google Fonts with PostCSS Font Magician

    Configuring Google Fonts can be quite an annoying process to setup. Using Font Magician with PostCSS ...

  6. HDU Victor and World (最短路+状态压缩)

    题目链接:传送门 题意: n个城市m条路.刚開始在点1,求把每一个城市都遍历一边最后回到1的花费的最小值. 分析: ​​+n​2​​∗2​n​​). 转自Bestcode. 以下说说我的状态转移,首先 ...

  7. 随机模拟的基本思想和常用采样方法(sampling)

    转自:http://blog.csdn.net/xianlingmao/article/details/7768833 引入 我们会遇到很多问题无法用分析的方法来求得精确解,例如由于式子特别,真的解不 ...

  8. 开源系统源码分析(filter.class.php)

    <?php class baseValidater { //最大参数个数 const MAX_ARGS=3; public static function checkBool($var) { r ...

  9. 再次学习 Iterator 迭代器 与 Generator 生成器

    Iterator : 返回的结果是:{value, done} function chef(foods){ let i = 0; return { next(){ let done = ( i> ...

  10. Hi3531D搭建环境时,出现的问题

    1.展开SDK包得时候,运行./sdk.unpack得时候出现: 原因:ubuntu14.04中默认得是dash,要将dash改成bash. 解决方法:sudo ln -fs /bin/bash /b ...