CXF框架的使用,利用cxf开发webservice(六)

CXF框架的使用,利用cxf开发webservice(六)_第1张图片1.CXF介绍

1.1 CXF的介绍(详细介绍 http://blog.csdn.net/dwarcheng/article/details/52449199)

CXF 简介

关于 Apache CXF

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 包含了大量的功能特性,但是主要集中在以下几个方面:

  1. 支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。
  2. Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。
  3. 容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。
  4. 支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。

项目目标

下面列出了来自 Apache CXF 官方网站(参见 参考资源)的项目目标。

概要

  • 高性能
  • 可扩展
  • 简单且容易使用

支持多种标准

  • 支持 JAX-WS、 JAX-WSA、JSR-181 和 SAAJ;
  • 支持 SOAP 1.1、1.2、WS-I BasicProfile、WS-Security、WS-Addressing、WS-RM 和 WS-Policy;
  • 支持 WSDL 1.1 、2.0;
  • 支持 MTOM;

多种传输方式、Bindings、Data Bindings 和 Format

  • Bindings:SOAP、REST/HTTP;
  • Data Bndings:目前支持 JAXB 2.0、Aegis 两种,默认是 JAXB 2.0。XMLBeans、Castor 和 JiBX 数据绑定方式将在 CXF 2.1 版本中得到支持;
  • 格式(Format):XML、JSON;
  • 传输方式:HTTP、Servlet、JMS 和 Jabber;
  • 可扩展的 API 允许为 CXF 增加其它的 Bindings,以能够支持其它的消息格式,比如:CSV 和固定记录长度。

灵活部署

  • 轻量级容器:可在 Tomcat 或基于 Spring 的容器中部署 Services;
  • 集成 JBI:可以在如 ServiceMix, OpenESB or Petals 等等的 JBI 容器中将它部署为一个服务引擎;
  • 集成 SCA:可以部署在如 Tuscany 之类的 SCA 容器中;
  • 集成 J2EE:可以在 J2EE 应用服务器中部署 Services,比如:Geronimo、JOnAS、JBoss、WebSphere Application Server 和 WebLogic Application Server,以及 Jetty 和 Tomcat;
  • 独立的 Java 客户端/服务器。

支持多种编程语言

  • 全面支持 JAX-WS 2.0 客户端/服务器编程模型;
  • 支持 JAX-WS 2.0 synchronous、asynchronous 和 one-way API's;
  • 支持 JAX-WS 2.0 Dynamic Invocation Interface (DII) API;
  • 支持 wrapped and non-wrapped 风格;
  • 支持 XML messaging API;
  • 支持 JavaScript 和 ECMAScript 4 XML (E4X) ,客户端与服务端均支持;
  • 通过 Yoko 支持 CORBA;
  • 通过 Tuscany 支持 SCA;
  • 通过 ServiceMix 支持 JBI ;

代码生成

  • Java to WSDL;
  • WSDL to Java;
  • XSD to WSDL;
  • WSDL to XML;
  • WSDL to SOAP;
  • WSDL to Service;

 

 

CXF 安装包

下载及目录结构

CXF 框架目前的最新版本是 2.0.2,可以访问 Apache 站点(链接请见 参考资源)下载 CXF 框架的安装包,下载时请选择“二进制发布包(Binary distribution)”,当然如果您有兴趣也可以下载相应版本的“源代码发布包(Source distribution)”。

下载完成后,将下载的文件解压缩到任意的文件夹中,比如:C:/Java/CXF,在后面的章节中使用 %CXF_HOME% 表示 CXF 框架的存放目录,解压缩后形成的文件目录结构按名称排序如下:

图 1、Apache CXF 发行包的目录结构示意图

文件目录结构及相关文件的详细说明:

  • bin(目录)

    bin 目录中是 CXF 框架中所提供的代码生成、校验、管理控制台工具:

    • Java to WSDL : java2wsdl
    • CXF Management Console Tool : mc
    • WSDL to Java : wsdl2java
    • WSDL to Service : wsdl2service
    • WSDL to SOAP : wsdl2soap
    • WSDL to XML : wsdl2xml
    • WSDL Validation : wsdlvalidator
    • XSD to WSDL : xsd2wsdl

 

 

 

2. CXF的安装和配置:

直接解压到某个盘下就可以使用:

 

 CXF框架的使用,利用cxf开发webservice(六)_第2张图片

2.1 CXF的环境变量的配置

环境变量:

 JAVA_HOME,

 CXF_HOME

 Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;

 CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar

 

2.2cxf创建一个java工程

2.2.1 服务端程序:

1)创建一个java工程

2)将第一天查询天气信息的代码拷贝到这个项目中,例如代码:

 

 

 

 

 

CXF框架的使用,利用cxf开发webservice(六)_第3张图片 

3)导入jar包(目录下全部的jar包)

 CXF框架的使用,利用cxf开发webservice(六)_第4张图片

4CXF是面向接口的编程,创建接口WeatherServerInterface

 

 

 CXF框架的使用,利用cxf开发webservice(六)_第5张图片

5)创建类WeatherServer实现以上的接口

 

 CXF框架的使用,利用cxf开发webservice(六)_第6张图片

6)创建QueryWebxmlClient调用网络天气预报的服务

 CXF框架的使用,利用cxf开发webservice(六)_第7张图片

7Resultjavabean对象,返回封装的结果集

 

 CXF框架的使用,利用cxf开发webservice(六)_第8张图片

8)使用JaxWsServerFactoryBean发布CXF的服务端

 CXF框架的使用,利用cxf开发webservice(六)_第9张图片

 

 

 

 

 

 

 

 

 

附录:

服务器端发布的类

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:

http://schemas.xmlsoap.org/soap/envelope/">

北京

 

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:

http://www.w3.org/2003/05/soap-envelope">

北京

9)发布后,在浏览器下输入:http://127.0.0.1:9999/weather?wsdl访问使用说明书

 

 CXF框架的使用,利用cxf开发webservice(六)_第10张图片

2.3 客户端程序(使用jdk提供的jaxws

1)创建一个java工程

2)使用wsimport生成客户端代码:

 CXF框架的使用,利用cxf开发webservice(六)_第11张图片

3)客户端代码测试:

CXF框架的使用,利用cxf开发webservice(六)_第12张图片 

 

2.4 客户端程序(使用CXF

使用CXFwsdl2java工具,它的功能就如同wsimport一样,可以生成一堆客户端调用的代码。

在命令行执行:

wsdl2java d . http://127.0.0.1:9999/weather?wsdl

这里注意

生成后WeatherService报错

原因是cxf需要JAX-WS API 2.2jdk6jax-ws2.1 版本需要

wsdl2java 使用-frontend jaxws21或者如果使用jdk1.7就不用加frontend

即如下

wsdl2java d . frontedn jaxws21 http://localhost:12345/weather?wsdl

 

1创建java工程

2使用wsdl2java生成客户端代码,并拷贝到项目中

 

3)客户端测试代码:

CXF框架的使用,利用cxf开发webservice(六)_第13张图片 

2.2.4 客户端程序(使用对象ServiceURLQName等)

1)客户端测试代码

CXF框架的使用,利用cxf开发webservice(六)_第14张图片 

2.2.5 客户端程序(使用JaxWsProxyFactoryBean

1)导入CXFjar

2)测试代码:

 CXF框架的使用,利用cxf开发webservice(六)_第15张图片CXF框架的使用,利用cxf开发webservice(六)_第16张图片

 

这里:大家把服务端的接口和实现类上的@bindingType改成SOAP12HTTP_BINDING看看会有什么变化

 

可以通过拦截器看到Soap1.1Soap1.2之前的区别。

 

你可能感兴趣的:(WebService)