Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。目前它仍只是 Apache 的一个孵化项目。
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。
CXF 包含了大量的功能特性,但是主要集中在以下几个方面:
下面列出了来自 Apache CXF 官方网站(参见 参考资源)的项目目标。
CXF 框架目前的最新版本是 2.0.2,可以访问 Apache 站点(链接请见 参考资源)下载 CXF 框架的安装包,下载时请选择“二进制发布包(Binary distribution)”,当然如果您有兴趣也可以下载相应版本的“源代码发布包(Source distribution)”。
下载完成后,将下载的文件解压缩到任意的文件夹中,比如:C:/Java/CXF,在后面的章节中使用 %CXF_HOME% 表示 CXF 框架的存放目录,解压缩后形成的文件目录结构按名称排序如下:
文件目录结构及相关文件的详细说明:
bin 目录中是 CXF 框架中所提供的代码生成、校验、管理控制台工具:
直接解压到某个盘下就可以使用:
环境变量:
• JAVA_HOME,
• CXF_HOME
• Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;
• CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar
(1)创建一个java工程
(2)将第一天查询天气信息的代码拷贝到这个项目中,例如代码:
(3)导入jar包(目录下全部的jar包)
(4)CXF是面向接口的编程,创建接口WeatherServerInterface
(5)创建类WeatherServer实现以上的接口
(6)创建QueryWebxmlClient调用网络天气预报的服务
(7)Result的javabean对象,返回封装的结果集
(8)使用JaxWsServerFactoryBean发布CXF的服务端
附录:
服务器端发布的类
l ServerFactoryBean
l JaxWsServerFactoryBean(建议使用)
2个对象,都可以发布服务端,但是我们建议使用JaxWsServerFactoryBean,因为它生成的wsdl文件更加规范。
服务器端的拦截器:
// 输入拦截器
jaxWsServerFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
// 输出拦截器
jaxWsServerFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
目的是用来输出响应的头部信息,可以看到soap协议的格式(http请求+Xml数据):
例如:
Soap1.1:
ID: 10
Address: http://127.0.0.1:9999/weather
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[text/xml, multipart/related], connection=[keep-alive], Content-Length=[218], content-type=[text/xml; charset=UTF-8], Host=[127.0.0.1:9999], SOAPAction=[""], User-Agent=[JAX-WS RI 2.2.4-b01]}
Payload:
Soap1.2:
ID: 2
Address: http://127.0.0.1:9999/weather
Encoding: UTF-8
Http-Method: POST
Content-Type: application/soap+xml; charset=utf-8;action=""
Headers: {Accept=[application/soap+xml, multipart/related], connection=[keep-alive], Content-Length=[216], content-type=[application/soap+xml; charset=utf-8;action=""], Host=[127.0.0.1:9999], User-Agent=[JAX-WS RI 2.2.4-b01]}
Payload:
(9)发布后,在浏览器下输入:http://127.0.0.1:9999/weather?wsdl访问使用说明书
(1)创建一个java工程
(2)使用wsimport生成客户端代码:
(3)客户端代码测试:
使用CXF的wsdl2java工具,它的功能就如同wsimport一样,可以生成一堆客户端调用的代码。
在命令行执行:
wsdl2java –d . http://127.0.0.1:9999/weather?wsdl
这里注意:
生成后WeatherService报错:
原因是cxf需要JAX-WS API 2.2,而jdk6的jax-ws是2.1 版本,需要
wsdl2java 使用“-frontend jaxws21“,或者如果使用jdk1.7就不用加frontend
即如下:
wsdl2java –d . –frontedn jaxws21 http://localhost:12345/weather?wsdl
(1)创建java工程
(2)使用wsdl2java生成客户端代码,并拷贝到项目中
(3)客户端测试代码:
(1)客户端测试代码
(1)导入CXF的jar包
(2)测试代码:
这里:大家把服务端的接口和实现类上的@bindingType改成SOAP12HTTP_BINDING看看会有什么变化
可以通过拦截器看到Soap1.1和Soap1.2之前的区别。