本文我将通过三个简单的小实验来验证jax-ws和XFire在发布和调用WebService上的区别,从而得出相应的结论以便在以后使用他们发布和调用WebService时作为进行选择的依据。
【实验】
[Experiment1]:调用WebService的Client端采用jax-ws调用XFire发布的WebService;(Project:XfireJax)
流程:
1) 建立JavaProject;
2) 建立WebServiceClient:
(1) OtherèMyEclipseèWebServicesèWebServiceClient;
(2) “Strategy”只能选jax-ws(不能选XFire);
(3) 选用WSDL URL;((3)(4)两步表示只能用jax-ws采用WSDL解析的方式来调用WebService);
(4) 下一步会提示加入jax-ws的包;
(5) “Finish”后会自动产生很多的类;
3) 手动设计本地调用WebService的类,流程:
(1) 实例化一个Service:NumberPlusService srvc = new NumberPlusService()
(2) 生成该WebService的本地代理:
NumberPlusServicePortType delegate = srvc.getNumberPlusServiceHttpPort()
(3) 通过该代理调用服务中的Operation:
delegate.plus(4, 6)
[Experiment2]调用WebService的Client端采用XFire,采用WSDl解析的方式来调用jax-ws发布的WebService(Project:1234567);
流程:
1) 建立WebServiceProject(建立基于XFire的Client端要求建立的项目必须为WebServiceProject);
2) 建立WebServiceClient:
(1) OtherèMyEclipseèWebServicesèWebServiceClient;
(2) “Strategy”选XFire(这次是XFire和jax-ws均可选);
(3) 选用WSDL URL;(表示只采用WSDL解析的方式来调用WebService);
(4) 下一步会提示加入XFire1.2JAXBLibraries包;
(5) “Finish”后会自动产生很多的类(其中一个类XXXServiceClient中会有main()方法可以再其中写调用服务的代码);
结果:调用失败(原因不明)
[Experiment3]对基于JAX-WS发布的WebService采用将接口抓到本地的方式来调用;
流程:
1) 建立JavaProject;
2) 将JAX-WS发布的WebService的XXXDelegate抓到本地(就像将XFire发布的WebService的Interface抓到本地一样)
结果:这样显然不行!因为jax-ws发布的XXXDelegate类要用到该WebService的实现类,所以如果将XXXDelegate抓到本地就意味着要将WebService的实现类也抓到本地,而这是不可能的。
【结论】
1) 用基于jax-ws的Client端调用基于XFire和jax-ws的WebService都没有问题;
而用基于XFire的Client端调用基于XFire的WebService存在问题(什么原因目前还不明);
2) 基于Jax-ws的Client端只能通过解析WSDL文档的方式来调用WebService,不可以使用将WebService的接口抓到本地进行掉用的方式;
基于XFire的Client端则能够通过两种方式来调用WebService:(但目前这两种方式只针对XFire发布的WebService)
(1) 将WebService的Interface抓到本地,进行调用;
(2) 通过得到WebService的WSDLFile或是WSDL的URL,解析WSDL来调用WebService;
3) 基于jax-ws的WebServiceClient端可以建立在任何Project中;
基于XFire的