WebService编程(1:Axis;2:Axis2/XFire;3:CXF;4:jdk6)

WebService编程(1:Axis;2:Axis2/XFire;3:CXF;4:jdk6)
2010-10-25 16:18

【虎.无名:很早以前用过axis,只要把任意java类改名为jws部署到tomcat中,就可以发布为一个webservice,觉得很神奇。后来用MyEclipse通过XFire向导创建WebService也很方便。到了java6时代,在 jdk中已经包含了wsgen和wsimport等命令,很容易发布和访问webservice,无需依赖任何框架或者库了。】

http://www.iteye.com/topic/128498 如何正确地在Axis、Axis2和Apache CXF之间抉择?
新一代的 Web Services 框架如 Axis2、CXF 都是由现有的项目中逐渐演化而来的,Axis2 是由大家熟悉的 Axis 1.x 系列演化过来,而 Apache CXF 则是由 Celtix 和 XFire 项目整合而生,并且刚刚发布了 2.0.2 的最新版本,不过仍是 Apache 的一个孵化项目。
Axis2 是对 Axis 进行了彻底的重写的一个新项目了,它使用了新的模块化架构,更方便于功能性的扩展等等。
Apache CXF 则是由 XFire 和 Celtix 两个现有的项目进行了重组。
问题:如果现有的应用程序是基于 Axis 1.x、XFire 或者 Celtix 的话,那应该怎么办?都迁移到这些新的框架上去吗?但是即使是要迁移,那应该迁移到哪个框架上去呢?
如果是编写一个新的 Web Services 应用程序的话,就不存在迁移的问题了,但是哪个框架是你应当选择进行使用的呢?哪个比哪个更好呢?
对于现在的应用程序的迁移,如果你的应用程序是稳定而成熟的,并且在可预知的未来的情况下,只要很少的一些需求变更要做的话,那么保存你的体力,不要去做“劳民伤财“的迁移工作了。
如果你的现有应用程序BUG缠身,性能,功能等等都一片糟糕的话,那就要考虑迁移了,那选哪个框架呢?先比较一下它们的不同之处:
1、Apache CXF 支持 WS-Addressing、WS-Policy、WS-RM、WS-Security和WS-I BasicProfile
2、Axis2 支持 WS-Addressing、WS-RM、WS-Security和WS-I BasicProfile,WS-Policy将在新版本里得到支持
3、Apache CXF 是根据Spring哲学来进行编写的,即可以无缝地与Spring进行整合
4、Axis2 不是
5、Axis2 支持更多的 data bindings,包括 XMLBeans、JiBX、JaxMe 和 JaxBRI,以及它原生的 data binding(ADB)。
6、Apache CXF 目前仅支持 JAXB 和 Aegis,并且默认是 JAXB 2.0,与 XFire 默认是支持 Aegis 不同,XMLBeans、JiBX 和 Castor 将在 CXF 2.1 版本中得到支持,目前版本是 2.0.2
7、Axis2 支持多种语言,它有 C/C++ 版本。
8、Apache CXF 提供方便的Spring整合方法,可以通过注解、Spring标签式配置来暴露Web Services和消费Web Services
如何抉择:
1、如果应用程序需要多语言的支持,Axis2 应当是首选了;
2、如果应用程序是遵循 Spring 哲学路线的话,Apache CXF 是一种更好的选择,特别对嵌入式的 Web Services 来说;
3、如果应用程序没有新的特性需要的话,就仍是用原来项目所用的框架,比如 Axis1,XFire,Celtrix 或 BEA 等等厂家自己的 Web Services 实现,就别劳民伤财了。
http://www.diybl.com/course/3_program/java/javajs/20071022/79306.html XFire的下一代产品CXF的入门(二)
http://blog.csdn.net/pengchua/archive/2008/07/29/2731895.aspx Axis1,Axis2,Xfire,CXF区别
XFire VS Axis
XFire是与Axis2 并列的新一代WebService平台。之所以并称为新一代,因为它:
1、支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等;
2、使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现;
3、容易上手,可以方便快速地从pojo发布服务;
4、Spring的结合;
5、灵活的Binding机制,包括默认的Aegis,xmlbeans,jaxb2,castor。
XFire与Axis1性能的比较
1、XFire比Axis1.3快2-6倍
2、XFire的响应时间是Axis1.3的1/2到1/5
XFire与Axis2的比较
虽然XFire与Axis2都是新一代的WebService平台,但是Axis2的开发者太急于推出1.0版本,所以1.0还不
是一个稳定的版本,它的开发者宣称1.1版本即将推出,希望1.1版本会是个稳定的版本。在XFire捐献给
apache后有人认为Axis2将会灭亡。其实在很多人眼里,Axis2并不是pojo形式,Dan Diephouse证明了
XFire比Axis更有市场,我也发现了有很多人开始从Axis转向XFire,包括我也在说服身边的人转向利用
XFire进行WebService的开发,很典型的是我可以在几分钟之内教会我的团队实用XFire来发布一个他自己
的Web服务。
本人倾向于XFire确实比Axis2简单很多
AXIS VS CXF
在SOA领域,我们认为Web Service是SOA体系的构建单元(building block)。对于服务开发人员来说,
AXIS和CXF一定都不会陌生。这两个产品都是Apache孵化器下面的Web Service开源开发工具。 Axis2的最
新版本是1.3.CXF现在已经到了2.0版本。
这两个框架 都是从已有的开源项目发展起来的。Axis2是从Axis1.x系列发展而来。CXF则是XFire和
Celtix项目的结合产品。Axis2是从底层全部重新实现,使用了新的扩展性更好模块架构。 CXF也重新的
深化了XFire和Celtix这两个开发工具。
新产品的退出导致了几个问题。是不是现有的使用Axis 1.x,XFire和Celix的应用需要迁移的新的版本上
。如果一个开发人员确定要迁移它的应用到新的框架上,那么他应该选择哪一个呢?相反的,如果一个开
发者决定从头开发一个新的Web Service,他应该使用哪个呢? 这两个框架哪一个更好一些呢?
对于系统迁移来说,也许迁移到新的框架并不难。Axis和CXF都提供了迁移的指导。能够给开发者一些迁
移的技巧和经验。但是对于这样迁移,这两个开源项目都没有提供迁移的工具。对于这样的迁移工作,尽
管很值得去寻找所有的可行方案。Axis2和CXF都有各自不同的WebService开发方法,每个方法都有相当数
量拥护者。
通过一个比较矩阵来比较Axis2和CXF变得有现实的意义。这两个项目都开发不够成熟,但是最主要的区别在以下几个方面:
1.CXF支持 WS-Addressing,WS-Policy, WS-RM, WS-Security和WS-I Basic Profile。Axis2不支持WS-Policy,但是承诺在下面的版本支持。
2. CXF可以很好支持Spring。Axis2不能
3. AXIS2支持更广泛的数据并对,如XMLBeans,JiBX,JaxMe和JaxBRI和它自定义的数据绑定ADB。注意
JaxME和JaxBRI都还是试验性的。CXF只支持JAXB和Aegis。在CXF2.1
4. Axis2支持多语言-除了Java,他还支持C/C++版本。
比较这两个框架的Web Service开发方法与比较它们的特性同样重要。 从开发者的角度,两个框架的特性
相当的不同。 Axis2的开发方式类似一个小型的应用服务器,Axis2的开发包要以WAR的形式部署到
Servlet容器中,比如Tomcat,通过这些容器可以对工作中的Web Service进行很好的监控和管理。Axis2
的Web administrion模块可以让我们动态的配置Axis2.一个新的服务可以上载,激活,使之失效,修改
web服务的参数。管理UI也可以管理一个或者多个处于运行状态的服务。这种界面化管理方式的一个弊端
是所有在运行时修改的参数没有办法保存,因为在重启动之后,你所做的修改就会全部失效。
Axis2允许自己作为独立的应用来发布Web Service,并提供了大量的功能和一个很好的模型,这个模型可
以通过它本身的架构(modular architecture)不断添加新的功能。有些开发人员认为这种方式对于他们
的需求太过于繁琐。这些开发人员会更喜欢CXF。
CXF更注重开发人员的工效(ergonomics)和嵌入能力(embeddability)。大多数配置都可以API来完成,替代了比较繁琐的XML配置文件, Spring的集成性经常的被提及,CXF支持Spring2.0和CXF's API和Spring的配置文件可以非常好的对应。CXF强调代码优先的设计方式(code-first design),使用了简单
的API使得从现有的应用开发服务变得方便。
不过你选择Axis2还是CXF,你都可以从开源社区得到大量的帮助。这两个框架都有商业公司提供服务,WSO2提供AXIS2的支持,Iona提供CXF的支持。这两公司都有很活跃的开发者社区。 Axis2出现的时间较早,CXF的追赶速度快。我的建议是:如果你需要多语言的支持,你应该选择AXIS2。如果你需要把你的实现侧重JAVA并希望和Spring集成,CXF就是更好的选择,特别是把你的Web Service嵌入其他的程序中。如果你觉得这两个框架的新特性对于你并没有太大的用处,你会觉得Axis1也是不错的选择,你应该继续使用
它知道你有充分的理由去更换它。
如何抉择:
1、如果应用程序需要多语言的支持,Axis2 应当是首选了;
2、如果应用程序是遵循 Spring 哲学路线的话,Apache CXF 是一种更好的选择,特别对嵌入式的 Web
Services 来说;
3、如果应用程序没有新的特性需要的话,就仍是用原来项目所用的框架,比如 Axis1,XFire,Celtrix
或 BEA 等等厂家自己的 Web Services 实现,就别劳民伤财了。

http://java.sun.com/developer/technicalArticles/J2SE/jax_ws_2/ 用NetBean 5.5以上就可直接开发WebService
http://www.cnitblog.com/sunnywang/archive/2009/04/14/56360.html MyEclipse下开发web service (Java 5+ Eclipse 3.2 +MyEclipse 5.0.0. )
http://www.blogjava.net/orangewhy/archive/2009/03/09/118485.html Eclipse下使用Axis开发webservice
1.4.       使用java2wsdl生成wsdl
1.5.       使用wsdl2java生成stub
http://www.ibm.com/developerworks/cn/edu/ws-dw-ws-eclipse-javase1.html?S_TACT=105AGX52&S_CMP=tec-cto 使用 Eclipse 和 Java SE 6 创建独立 Web Services 应用程序,第 1 部分: Web Services 服务端应用程序
http://chengda.iteye.com/blog/378569 用Eclipse在Java 6下开发Web Service
Java SE 6 对Web Service的开发提供了完全的支持。下面让我们利用Eclipse在Java 6下进行一个简单的Web Service的开发,希望能给初学者带来好处。
1、 软件环境
1)、Eclipse
在http://www.eclipse.org/downloads/下载最新的Eclipse。
2)、JDK
在http://java.sun.com/javase/downloads/下载Java SE development kit 6
3)、Ant
使用Eclipse自带的Ant插件,不用另外安装。
2、 开发服务器端程序
1)、创建一个Java项目,命名为MyWebService_server
2)、创建一个简单的类,代码如下:
package test.ws;
import javax.jws.WebService;
@WebService
public class Hello {
public String sayHello(String name) {
return "Hello " + name + "!";
}
}
这个类有一个方法(sayHello),参数是一个字符串,代表一个人的名字,返回值也是一个字符串,意思是向这个人打招呼。这就是我们的WebService要提供的服务。
请注意类声明的前面有个annotation “@WebService”,这个注释的作用就是标明这个类是一个WebService。
2)、创建一个Ant脚本build.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project default="wsgen">
<target name="wsgen">
<exec executable="D:\jdk1.6.0\bin\wsgen.exe">
<arg line="-cp ./bin -keep -s ./src -d ./bin test.ws.Hello" />
</exec>
</target>
</project>
请根据你自己的jdk安装路径对上面内容做适当修改
3)、运行ant脚本
4)、刷新项目,查看生成的Java文件
5)、编写WebService启动程序
package test.ws;
import javax.xml.ws.Endpoint;
public class RunWebService {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8000/hello", new Hello());
}
}
6)、启动WebService
7)、在IE中测试(访问 http://localhost:8000/hello?wsdl)
3、 开发客户端程序
1)、创建一个新的Java项目,命名为MyWebservice_client
2)、创建Ant脚本build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project default="wsimport">
<target name="wsimport">
<exec executable="D:\jdk1.6.0\bin\wsimport.exe">
<arg line="-s ./src -d ./bin http://localhost:8000/hello?wsdl" />
</exec>
</target>
</project>
同样,请按您的jdk安装路径修改。
3)、运行ant脚本,生成客户端程序,刷新项目查看新生成的文件:
4)、编写测试程序,测试客户端。
package test.ws.call;
import test.ws.Hello;
import test.ws.HelloService;
public class CallWebService {
public static void main(String[] args) {
Hello hello = new HelloService().getHelloPort();
String str = hello.sayHello("Mike");
System.out.println(str);
}
}
4、 总结
一切都很顺利,“Hello Mike!”让我们着实兴奋了一阵子。我们用了很短的时间开发了一个简单的WebService及其客户端程序,显然这一切有赖于Java 6对WebService的完美支持。当然,这只是小试牛刀,读者可以自己尝试编写复杂的服务,比如:多参数、复杂类型参数、复杂类型返回值、抛出异常,等等。通过阅读不同情况下生成的wsdl你会理解WebService的内部机制。
WebService还有很多其他具体实现方法。比如apache的axis和axis2,weblogic也有自己的实现方法,等等。值得一提的是 axis2,它也不需要开发者自己编写WSDL脚本,甚至不需要在服务器端生成任何额外的程序文件,只需把程序按规范部署就可以了,而且可以简单的部署到各种web服务器上。读者可以多尝试一下,根据实际情况取舍。
WebService做为SOA中的一项具体技术应用已经非常广泛,随着各种辅助工具的完善,我们的开发工作变得越来越容易和规范,看着清爽的代码,真的是一种享受。

【虎.无名】补充一些Axis2的资料,但就我个人不推荐使用。
http://zhangjunhd.blog.51cto.com/113473/23690 基于Tomcat5.0和Axis2开发Web Service应用实例
http://www.ibm.com/developerworks/cn/webservices/ws-webaxis1/ 通过 Axis2 开发 Web 服务,第 1 部分: 通过 Axis2 运行时部署和使用简单 Web 服务(2006 年 6 月 13 日)
http://hideto.iteye.com/blog/56835 2007-03-01 Axis2快速上手指南
http://blog.csdn.net/mudboy/archive/2006/09/08/1194535.aspx 慎用AXIS2
AXIS2自带了Version.aar的示例,好象是返回一个STRING,可以运行,但用它的客户端工具自动生成的代码实在难看:
1、 为什么非得封装一个***Reponse, getMsg之类的参数和响应呢(使用ADB数据绑定)?在前面的版本中,生成的客户端使用起来就象是在本地一样(客户端代理完全实现了服务端接口/或说发布的方法签名完成一样),但现在却不是这样的,为了使用接口,你不得不生成一个封装类,再将你的参数设置进去,而返回时,又不得不从***Response中显示的获取返回值(好像有个叫get_return之类的方法),很是别扭。
2、 生成客户端时提供好几种数据绑定方式,但我认为没有一种有以前的简洁,花哨不实用。
3、 文档太简单了,真该花点时间写些像样的文档,最起码的,services.xml的DTD或Schema总得有一份呀!
接下来我们发现,使用自定义参数(无非是自己写的POJO)的接口发布后无法设用成功,返回的异常信息:reader is null(大概),开始还以为名称空间映射的问题,我们的自定义参数似下面的代码:
经过一番网上搜索和改配置(几乎试了所有的选项)/代码之类的操作,还是没有找到答案,错误还是发生。最好只好跟它的代码了,过程我就不多说了,只说结果吧。
1、 错误发生在执行完要返回的路了,正准备将返回值序列化成SOAP消息。
2、 在ADB的代码中,有BeanUtils(不知道后面有没有S),里面有getFullParser方法,也就是,在序列化过程就,要通过该方法拿到一个Reader,但该方法返回了null。
3、 该方法里面写得有些粗糙,很多可能的问题都没有想到,比如说,上面的POJO,在返回时有些为null,这应该是很正常的,但代码却假设任何一个属性都不为null(直接调用value.toString()方法),导致了NullpointException,发生该异常后,未记任何日志,而是直接返回了null,导致客户端跟据异常查错不太方便。
4、 我们将我们的POJO改了改,对属性均做了初始化,使返回时每个属性都不为null,意外的时,我们还是没有成功。
5、 这次异常还是因为getFullParser返回了null,难道不止一次调用了该方法?跟进去!发现代码是递归调用,即对于每个属性,也调用了该方法,代码里也是一堆if/else if/之类的,对一些数据类型进行了处理,我发现在我们属性类型是Timestamp时返回了null,……
6、 它的序列化返序列化算法效率也有问题。
上面的过程很明显表现也AXIS2是那么的不成熟不完善,代码BUG如此明显也是出人意料,本以为AXIS2应该有个飞跃(至少多实现了几个标准),但却没想到基石却如此不牢固,建议今后别在正式的项目中使用。
说到这,我又想起前段时间网上的一篇文章,大意也是说AXIS如何不好的话,说是一堆研究生写出来的,当时我并未在意,并一如既往的支持AXIS,直到昨天开始接触AXIS2,我的态度有了变化…

你可能感兴趣的:(eclipse,spring,编程,Web,webservice)