CXF学习笔记2

CXF 安装包

下载及目录结构

CXF 框架目前的最新版本是 2.4.2,可以访问 Apache(http://cxf.apache.org/) 站点下载 CXF 框架的安装包,下载时请选择“二进制发布包(Binary distribution)”,当然如果您有兴趣也可以下载相应版本的“源代码发布包(Source distribution)”。我这边用的老的版本(2.2.2),最新版的JAXB版本2.2与6以下的版本有冲突。

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


图 1、Apache 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
  • docs(目录)

    CXF 所有类(class)对应的 API 文档,为开发者使用 CXF 完成应用开发提供应有的帮助。

  • etc(目录)

    包含一个基本的 Service 暴露所需要的 web.xml 文件,及其它的配置文件。

  • lib(目录)

    lib 目录中包含 CXF 及其运行时所需要的和可选的第三方支持类包(.jar 文件),可以根据不同项目所需的 CXF 特性选择所需要的支持类包。如果不想一一去区分的话,可以直接在 Web 项目中包含所有的 CXF 及其运行时所需要的第三方支持类包(.jar 文件)即可。

    其中 cxf-2.0.2-incubator.jar 是 CXF 框架的二进制包文件,包含了全部的模块(modules),cxf-manifest-incubator.jar 是列表清单文件 manifest jar 。

    以下的 jar 包是所有 CXF 项目所必需的:

    • cxf.jar
    • commons-logging.jar
    • geronimo-activation.jar (Or the Sun equivalent)
    • geronimo-annotation.jar (Or the Sun equivalent)
    • geronimo-javamail.jar (Or the Sun equivalent)
    • neethi.jar
    • jaxb-api.jar
    • jaxb-impl.jar
    • stax-api.jar
    • XmlSchema.jar
    • wstx-asl.jar
    • xml-resolver.jar

    对于 Java2WSDL 和 WSDL2Java,除了必需的之外,还需要再增加如下 jar 包:

    • jaxb-xjc.jar
    • veliocity.jar
    • velocity-dep.jar

    为了支持 JAX-WS ,除了必需的之外,还需要再增加如下 jar 包:

    • jaxws-api.jar
    • saaj-api.jar
    • saaj-impl.jar
    • asm.jar (可选的,但是可以提升包装类型的性能)

    为了支持 XML 配置,除了必需的之外,还需要再增加如下 jar 包:

    • aopalliance.jar
    • spring-beans.jar
    • spring-context.jar
    • spring-core.jar
    • spring.web.jar

    为了独立的 HTTP 服务支持,除了必需的之外,还需要再增加如下 jar 包:

    • geronimo-servlet.jar
    • jetty.jar
    • jetty-sslengine.jar
    • jetty-util.jar
    • sl4j.jar & sl4j-jdk14.jar (可选的,但是可以提升日志 logging)

    为了支持 Aegis ,除了必需的之外,还需要再增加如下 jar 包:

    • jaxen.jar
    • jdom.jar
    • stax-utils.jar

    为了支持 WS-Security ,除了必需的之外,还需要再增加如下 jar 包:

    • bcprov-jdk14.jar
    • wss4j.jar
    • xalan.jar
    • xmlsec.jar

    为了支持 HTTP Binding ,除了必需的之外,还需要再增加如下 jar 包:

    • jra.jar
    • jettison.jar (仅为 JSON 服务所需的)
  • licenses(目录)

    列表了引用第三方 jar 包的相关许可协议。

  • modules(目录)

    modules 目录中包含了 CXF 框架根据不同特性分开进行编译的二进制包文件。发布基于 CXF 框架的 Web 项目时,可以选择使用该目录下的所有 .jar 文件,也可以选择 lib 目录中的 cxf-2.0.2-incubator.jar 文件。

  • samples(目录)

    samples 目录中包含了所有随 CXF 二进制包发布的示例,包含这些示例的源代码和相关 Web 应用配置文件,可以方便地用 Ant 来编译运行测试这些示例,来了解 CXF 的开发和使用的方法。可以通过 samples 目录和它各个子目录下的 README.txt 的文件来详细了解示例的编译与运行的步骤。

  • DISCLAIMER 由于仍是处于 Apache 孵化状态的项目,这里描述了一些说明。
  • LICENSE 文件中包含了 CXF 框架的授权协议 Apache License Version 2.0 。
  • NOTICE 罗列了 CXF 框架用到的相关第三方组件的授权协议以其它的相关信息。
  • README 文件中包含了 CXF 框架本身的一些简要说明。
  • release_notes.txt 包含了 CXF 发布时的一些信息,包括运行时所需要的环境,修复 BUG 的列表等。

CXF 之初体验

下面我们将通过直接运行与简单修改 CXF 自带的例子体验一下服务的发布与消费。

配置与检查环境变量

UNIX 上:

CXF_HOME=/opt/Java/CXF
JAVA_HOME=/opt/JDK/1.5.0
ANT_HOME=/opt/Java/Ant
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$CXF_HOME/bin:$PATH
export CLASSPATH=.:$CXF_HOME/lib/cxf-manifest-incubator.jar:./build/classes

Windows 上:

set CXF_HOME=C:\Java\CXF
set JAVA_HOME=C:\JDK\1.5.0
set ANT_HOME=C:\Java\Ant
set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%CXF_HOME%\bin;%PATH%
set CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest-incubator.jar;.\build\classes

为了部署到 Java EE 的容器中进行测试,示例采用 Tomcat 来进行,同样设置 CATALINA_HOME 变量:

UNIX 上:

CATALINA_HOME=/opt/OpenSource/Tomcat-5.5.25
export CATALINA_HOME

Windows 上:

set CATALINA_HOME=C:\OpenSource\Tomcat-5.5.25

如果以上环境变量您没有并没有直接设置到系统的变量中,可以将之另存为一个文件,保存起来,比如存为:%CXF_HOME%/env.sh 或者 %CXF_HOME%/env.bat,这样在运行示例前,先运行它来设置环境变量即可。

通过 Ant 来构建和运行示例

构建与启动 Server

首先,进入到 %CXF_HOME%/java_first_pojo/ 目录下。在 UNIX 或 Windows 下的命令都是一样的,如下:

ant server

最后可以看到如下信息:

build:

server:
 [java] Server ready...

如果看不到这些信息,请检查环境变量设置是否正确。

运行 Client

再打开一个命令窗口,运行:

ant client

最后可以看到如下信息:

client:
 [java] Invoke sayHi()....
 [java] Hello user

BUILD SUCCESSFUL

如果看不到这些信息,问题应当是出现在环境变量的设置上,需要再次检查一下您的环境变量设置是否正确。

体验改变

通过上面的构建,运行 Server ,再运行 Client ,我们可以体会到利用 CXF 发布与使用 Web Services 是如此简单。下面我们将开始进行简单地代码修改。

修改 Client 端

打开 %CXF_HOME%/samples/java_first_pojo/src/demo/hw/client 目录下的 Client.java 文件,在最后面修改为:

System.out.println(client.sayHi("World , 利用 Apache CXF 实现 Web Services"));

修改并保存后,再运行:

ant client

现在可以看到您修改后的信息,如下:

client:
 [java] Invoke sayHi()....
 [java] Hello World , 利用 Apache CXF 实现 Web Services

BUILD SUCCESSFUL

修改 Server 端代码

Ctrl + C 直接停止刚才启动的 ant server 启动端,然后打开 %CXF_HOME%/samples/java_first_pojo/src/demo/hw/server 目录下的 HelloWorldImpl.java 文件,修改

return "Hello " + text;

return "Hello " + text + new java.util.Date();

我们在返回信息时增加了一个时间戳上去,然后再次分别运行 ant server 与 ant client ,可以看到返回的信息后面增加了时间,如下:

client:
 [java] Invoke sayHi()....
 [java] Hello World , 利用 Apache CXF 实现 Web ServicesThu Sep 27 21:40:49 CST 2007

BUILD SUCCESSFUL

以上只是一个简单的示例,体验一下利用 CXF 进行发布与使用 Web Services,并尝试修改了 Server 端与 Client 端的代码。下面让我们更进一步,通过查看 Server.java 及 Client.java 的代码,来了解一下 CXF 的运作过程。

代码简单分析

Server.java 中主要的代码片断如下,它利用 ServerFactoryBean 来进行 Web Services 的发布,实例化一个实现类 HelloWorldImpl,设置将要进行发布的地址 address,最后通过 ServerFactoryBean 的 create() 方法就成功地发布了 Web Services,如此简单而已,只有六行代码:

 HelloWorldImpl helloworldImpl = new HelloWorldImpl();
 ServerFactoryBean svrFactory = new ServerFactoryBean();
 svrFactory.setServiceClass(HelloWorld.class);
 svrFactory.setAddress("http://localhost:9000/Hello");
 svrFactory.setServiceBean(helloworldImpl);
 svrFactory.create();

Client.java 中的主要代码片断如下,通过 ClientProxyFactoryBean 代理工厂类来创建一个服务,绑定到 endPointAddress 地址,就可以 create 并得到服务,并进行服务消费了:

 ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
 factory.setServiceClass(HelloWorld.class);
 factory.setAddress("http://localhost:9000/Hello");
 HelloWorld client = (HelloWorld)factory.create();
 System.out.println("Invoke sayHi()....");
 System.out.println(client.sayHi("user"));

最后,停止 Server,并清除构建过程中产生的一些文件,直接运行 ant clean 即可。

构建和运行在 Servlet 容器里的示例

接下来我们尝试编译打包一个示例,并部署到 Java EE 的容器里进行测试。

构建 Web 应用程序包

停止掉前面运行的 Server ,然后在命令行运行:

ant war 

将在 %CXF_HOME%/samples/java_first_pojo/build/war/ 目录下生成 helloworld.war 文件。

部署应用

先运行如下命令,将运行部署到 Tomcat 容器中:

ant deploy -Dtomcat=true

启动 Tomcat

然后在 Windows 下通过 startup.bat 或在 Unix 下通过 startup.sh 来启动 Tomcat,CXF 的应用也就随之启动。通过 Tomcat 管理控制台 http://localhost:8080/manager/html/ 可以看到已经成功部署了 helloworld.war 的应用程序,如下图所示:


图 2. 在 Tomcat 5.5.25 上面成功部署 CXF Web Service 的示意图
图 2. 在 Tomcat 5.5.25 上面成功部署 CXF Web Service 的示意图 

校验服务

假设您的 Tomcat 服务端口是 8080 ,那运行以下命令就可以调用部署到 Java EE 容器里的 CXF 所提供的 Web Services 的服务了。

http://localhost:8080/helloworld/services/hello_world?wsdl

查看 wsdl 文件的信息内容如下:


图 3. 在 Tomcat 5.5.25 上面成功部署 CXF Web Service 的示意图
图 3. 在 Tomcat 5.5.25 上面成功部署 CXF Web Service 的示意图 

运行 Client

接下来我们来运行 Client 来使用它,运行:

ant client-servlet

如果您的端口不是 8080,可以使用:

ant client-servlet -Dbase.url=http://localhost: 端口号

或者

ant client-servlet -Dhost=localhost -Dport= 端口号

来调用 Web Services ,返回结果如下:

client-servlet:
 [java] Invoke sayHi()....
 [java] Hello World , 利用 Apache CXF 实现 Web ServicesThu Sep 27 21:56:32 CST 2007

BUILD SUCCESSFUL

在 Tomcat 后台可以看到一些 Exception 的信息,这是正常的,是因为 public void pingMe() throws PingMeFault 特意抛出来的,不必理会,没有抛出异常信息才是不正常的,需要重新检查以上各个步骤是否正确执行了。

卸载应用

从 Tomcat 中卸载应用,运行:

ant undeploy -Dtomcat=true

最后,停止 Tomcat,然后清除构建过程中产生的一些文件,直接运行 ant clean 即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值