转自: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. PHP empty函数报错的解决办法

    PHP empty函数在检测一个非变量情况下报错的解决办法. PHP开发时,当你使用empty检查一个函数返回的结果时会报错:Fatal error: Can't use function retur ...

  2. 区间 (vijos 1439) 题解

    [问题描述] 现给定n个闭区间[ai,bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排 ...

  3. 一元三次方程 (codevs 1038)题解

    [问题描述] 有形如:ax3+bx2+cx+d=0这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...

  4. Python之Flask Web开发

    下载python包管理工具Pip: 访问网址:https://pip.pypa.io/en/stable/installing/    下载文件get-pip.py到本地计算机 定位到get-pip. ...

  5. EF经验分享_jimmyzzc

    刚刚接触EF,总结了一些在实际工作中的心德经验,与大家分享一下. 一.Excression表达式树 表达式目录树在LINQ中用于表示分配给类型为Expression<TDelegate>的 ...

  6. Python核心编程--学习笔记--7--字典和集合

    本章介绍Python语言中的映射类型(字典)和集合类型,包括操作符.工厂函数.内建函数与方法. 1 字典 字典是Python中唯一的映射类型——键key直接映射到值value.字典是容器类型,其对象是 ...

  7. C基础 那些年用过的奇巧淫技

    引言 - 为寻一颗明星 为要寻一颗明星 徐志摩 1924年12月1日<晨报六周年纪念增刊> 我骑著一匹拐腿的瞎马, 向著黑夜里加鞭:—— 向著黑夜里加鞭, 我跨著一匹拐腿的瞎马.// 我冲 ...

  8. Python 以正确的宽度在盒子中居中打印一个字符

    注意://为整除的意思 代码: # -*- coding:UTF-8 -*- sentence = input("Sentence:") screen_width = 80 tex ...

  9. Go中简单的文件读写

    Go中的ioutil包可以方便的实现文件读写.代码: package main import ( "fmt" "io/ioutil" ) func main() ...

  10. linux 捕获信号处理中遇到的死锁

    tag: 信号 signal  sigchld  死锁 堆栈 我们的程序需要捕获信号自己处理,所以尝试对1-32的信号处理(后面33-64的信号不处理).但是在调试代码时,发现一个线程死锁的问题.程序 ...