转自:http://www.cnblogs.com/snake-hand/archive/2013/06/09/3129915.html

前言

上节课我们对WebService进行了简单的介绍,对于其所应用到的技术有了一定的了解。今天主要讲解下WebService的两个流行的框架Axis和CXF。

正题

一、服务端发布WebService

在讲解之前,我们先来看一下这篇博客主要讲解的内容:

每一种框架都有自己的特点,有自己的侧重,但是他们的共同之处在于对发布WebService进行了封装,所以我们只需编写一个配置文件或者使用@WebService注解就可以发布WebService,我们这里着重说一下他们各自的特点:

1.Axis1

Axis1有两种发布方式:

1)JWS方式

a.这种方式很简单,只需要将源码java文件放到AXIS_HOME下面,然后将后缀改为.jws,这样,Axis 会自动编译.jws文件,并把它自动加入到Java WebServie的服务中。

b.但是这种方式的缺点是:只能是java源代码,同时类中不能含有包名。

2)WSDD方式

1.写一个java类(需要引入axis的jar包)

2.配置web.xml文件(配置AxisServlet,AdminServlet,SOAPMonitorService和AxisHTTPSessionListener)

3.写一个deloy.wsdd文件,部署项目(tomcat启动就可以部署项目)

安装axis1到tomcat:

1.Axis官方网站:http://ws.apache.org/axis/,可以在官网下载最新1.4的包:axis-bin-1_4.zip

2.将解压后的axis-1_4\webapps\下的axis目录考到%TOMCAT_HOME%/Webapps/目录下

3.启动tomcat后在浏览器里输入http://localhost:port/axis

4.点击上图中的Validataion链接,页面上会提示已经有的包和缺少的包的信息,根据提示将必须的包下载全,

将这些类包复制到%tomcathome%/webapps/axis/WEB-INF/lib/目录下

重新启动tomcat,直到Validation页面中看不到有Error与Warning的提示信息。

2.Axis2

客户端对于数据类型的不同有两种调用方式:RPCServiceClient和OMAbstractFactory方式

1)RPC方式:

处理基本的数据类型,如String,int等

2)OM方式:

可处理基本数据类型和自定义数据类型(比如java实体对象):通过xml的参数形式进行传递(传递的参数需要转换为OMElement)

注:如果参数或返回值是List类型则需要进行手动处理转换(手动编写一个服务端对传递过来的参数进行处理,将传过来的OMElement手动转换为List类型,调用执行方法,然后将返回的List类型再转换为OMElement传回客户端)

Axis2发布文件(编写services.xml)

1.将官网下载的axis2.war包拷贝到tomcat_home/webapps下,运行即会解压

2.将其conf,modules和services文件夹拷贝到项目的WEB-INF下面,并将lib下的jar包拷贝到web-inf/lib下面

3.配置Web.xml(配置AxisServlet和AxisAdminServlet)

4.编写services下面的services.xml文件,指定要发布的类

3.CXF

CXF发布WebService有三种方式:main方式,基于和不基于Spring发布到容器

1)main方式

引入jar包,在接口和实现类上使用@WebService即可,发布完成后即可在浏览器中访问url,不需要启动tomcat等服务。

2)不基于Spring方式发布到容器

a)引入cxf的jar包,编写web.xml(配置自定义的CXFServlet,该CXFServlet需要继承CXFNonSpringServlet)

b)编写实体类,业务类和服务类(实体类需要和服务类在同一包下,否则报错)

c)启动Tomcat,即可发布服务

3)基于Spring方式发布到容器

a)web.xml配置(Spring配置,cxf封装的CXFServlet配置)

b)applicationContext-server.xml配置

<!--Import apache CXF bean definition 固定-->

<importresource="classpath:META-INF/cxf/cxf.xml" />

<importresource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

<importresource="classpath:META-INF/cxf/cxf-servlet.xml" />

<!--services接口配置 -->

<beanid="helloServicesBean"class="com.ms.services.impl.HelloServicesImpl" />

<!--CXF 配置WebServices的服务名及访问地址 -->

<jaxws:serverid="helloServices" address="/HelloServices"

serviceClass="com.ms.services.IHelloServices">

<!--要暴露的webservice服务 -->

<jaxws:serviceBean>

<refbean="helloServicesBean"/>

</jaxws:serviceBean>

</jaxws:server>

c)编写类

实体类

服务接口(类头使用@WebService)

服务实现(类头使用@WebService(endpointInterface="com.ms.services.IHelloServices"))

以上是关于Axis和CXF发布特点及其需要注意的地方,是我做例子时的总结,有兴趣的同学可以下载源码

二、客户端调用WebService

服务端将接口发布成功后,就等着客户端来进行调用了,客户端如何并通过什么方式来调用我们服务端发布的wsdl文件呢?

1.调用一次WebService的本质:

1.客户端把调用方法参数,转换生成XML文档片段(SOAP消息,input消息,该文档片段必须符合WSDL定义的格式),通过网络,把XML文档片段传给服务器

2.服务器接收到XML文档片段,解析XML文档片段,提取其中的数据,并把数据转换调用WebService所需要的参数值。

3.服务器执行方法。

4.把执行方法得到的返回值,再次转换生成为XML文档片段(SOAP消息,output消息)——该文档片段必须符合WSDL定义的格式,通过网络,把XML文档片段传给客户端。

5.客户端接收到XML文档片段,解析XML文档片段,提取其中数据,并把数据转换调用WebService的返回值。

从上面调用本质来看,要一个语言支持WebService,唯一的要求是:该语言支持XML文档解析、生成、支持网络传输。

2.客户端调用方式:

客户端调用服务端方法总体来说有三种方式:

1)DII(Dynamic Invocation Interface)

采用直接调用方式,可以在程序中设置诸多的调用属性,使用较为灵活,但是调用过程却相对繁琐复杂,易造成代码膨胀且可重用性低,每次调用不同的Web Service都要重复进行大量编码。

这也是我们比较常用的一种方法,就是调用invoke方法,传入方法名和方法参数即可。

2)Stubs

JAX-RPC使用静态的Stub方式包装对底层接口的调用,从而提供一种更为简便的调用方式。使用该方式需要利用支持环境(比如Axis)所提供的工具根据WSDL预生成WebService客户端的实现代码。因此如果服务的WSDL发生变化,就必须重新生成新的客户端代码并进行重新部署。

该方法需要使用wsdl2java命令来预生成WebService客户端代码,为了支持该命令,需要安装一些环境。

3)Dynamic Proxy

动态代理(Dynamic Proxy)的方法实现对Web Service的动态调用,可以在运行时根据用户定义的Client端接口创建适配对象。从而避免了直接操作底层的接口,减少了客户端的冗余,屏蔽了调用相关的复杂性。

该方法主要在于客户端接口,该客户端接口需要继承java.rmi.Remote接口,然后将服务端的接口中的方法copy过来。

小结:

从发展历史角度来看,很容易理解他们的侧重点,Axis1最早,所以注重的只是简单的发布接口即可,之后随之Axis2对其进行了优化,可以支持自定义参数,但并不完善,所以CXF的出现对这一功能进行了完善并且适应了潮流,实现了与Spring的集成,跟这些比起来,EJB3中对于WebService的支持只需要使用一个@WebService即可完成,所以软件的开发是让使用者变傻,而我们学习这些是为了理解其原理和本质。

WebService流行框架之Axis和CXF的更多相关文章

  1. WebService流行框架CXF

    CXF官方网址:http://cxf.apache.org/   CXF官方网址:官网学习地址:http://cxf.apache.org/docs/index.html   官网下载cxf压缩文件: ...

  2. 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较

    几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 来源   XFire VS Axis XFire是与Axis2 并列的新一代WebService平台.之所 ...

  3. webservice主流框架Axis、Axis2、XFire、CXF的比较

    http://ws.apache.org/axis/ http://axis.apache.org/axis2/java/core/ http://xfire.codehaus.org/ http:/ ...

  4. 分布式架构探索 - 2. WebService RPC框架之Apache CXF

    Apache CXF是一个开源的WebService RPC框架. 例子: 1. 新建一个maven web项目, 添加pom 如下: <?xml version="1.0" ...

  5. 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制

    推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...

  6. 60.Android通用流行框架大全

    转载:https://segmentfault.com/a/1190000005073746 Android通用流行框架大全 1. 缓存 名称 描述 DiskLruCache Java实现基于LRU的 ...

  7. 基于soapUI构建WebService测试框架

    基于soapUI构建WebService测试框架 http://www.docin.com/p-775523285.html

  8. Akka.NET是Java/Scala 流行框架Akka的一个 .NET 开源移植

    Akka.NET v1.0 已发布,支持Mono Akka.NET 是Java/Scala 流行框架Akka的一个 .NET 开源移植.可用于构建高并发,分布式和容错事件驱动的应用在 .NET 和 M ...

  9. 15类Android通用流行框架

    15类Android通用流行框架 Android流行框架 缓存 DiskLruCache Java实现基于LRU的磁盘缓存 图片加载 Android Universal Image Loader 一个 ...

随机推荐

  1. 正确使用stl map的erase方法

    先声明:下面的文章是针对windows的用法,因为std::map的erase函数的windows的实现版本是返回一个std::map的迭代器,但是STL标准里面的该函数的返回值确是: map.era ...

  2. php反射应用实例代码

    php反射应用示例. 代码如下:<?php function custom(){ } class custom{    public function index(){    }  } prin ...

  3. C# 多线程操作样例

    using System; using System.Threading; //引用多线程 namespace ThreadTest { public class Alpha { public voi ...

  4. 【转】javascript性能优化-repaint和reflow

    repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline,visibility,background color,不会影响到dom结构渲 ...

  5. javascript jquery each 影响 函数返回值

    实例如下: $(function(){ if(chkInput()){ alert('OK!') } }); function chkInput(){ var data = jsonData(略); ...

  6. pure css做的pc登陆界面

    源码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  7. JLINK V8 Keil MDK4.10 STM32

    新买的JLINK v8仿真器,第一次使用,编译环境是Keil MDK4.10,目前芯片是STM32F103x. 按照光盘的说明先安装了驱动,USB接上JLINK v8,显示驱动成功.但是在debug或 ...

  8. Box of Bricks最小移动砖块数目

    Description Little Bob likes playing with his box of bricks. He puts the bricks one upon another and ...

  9. 为了android sdk下载,必须修改hosts

    #Download 下载 203.208.46.146 dl.google.com 203.208.46.146 dl-ssl.google.com #Groups 203.208.46.146 gr ...

  10. hdu 5273 Dylans loves sequence

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5273 Dylans loves sequence Description Dylans is give ...