栏目导航
热点推荐
- 三十条有用的 Java 编程规则
- Java制作水印图片源码
- Java常见异常及可能的导致原因
- Java中的修饰词使用方法总结
- J2EE系统异常的处理准则
- Java中的异常、断言、日志解析(
- Java面试技巧:Java面试题集锦(
- 面向Java开发人员的Scala指南:
- Java程序员:一刻钟精通正则表达
- 网友经验分享:学好java开发的关
- 专家解答:创建表格与数据库进行
- Java远程访问Domino数据库
阅览排行
Java Web 服务: CXF 简介
www.jz123.cn 2010-04-02 来源: 中国建站 责任编辑(袁袁) 我要投递新闻
在用户界面方面,CXF 与 Axis2 和 Metro Web 服务堆栈有很多共同之处。三个堆栈都允许要么从已有 Java™ 代码开始构建 Web 服务,要么从 WSDL Web 服务描述开始,生成使用或实现服务的 Java 代码。而且与其他堆栈一样,CXF 将服务操作建模为方法调用,而将服务端口类型建模为接口。
与 Axis2 类似,但是不同于 Metro,CXF 允许选择不同的数据绑定技术。CXF 对 JAXB 2.x 的支持与 Metro 同等而高于 Axis2,因为它允许从 WSDL 生成代码时使用 JAXB 标准(而 Axis2 不允许)。CXF 还允许使用其他数据绑定方法,不过对这些方法的支持不像在 Axis2 中那样成熟 — 特别是,只有在使用 JAXB 或 XMLBeans 数据绑定时才能使用 CXF 从 WSDL 生成代码。
CXF 使用的首选服务配置技术(或在 CXF 术语中称为前端) 是 JAX-WS 2.x 注释,通常附有 XML 配置文件。CXF 中对 JAX-WS 注释的支持与 Metro 同等,因而与 Axis2(在 Axis2 中使用 JAX-WS 时存在一些限制,正如 “Axis2 中的 JAXB 和 JAX-WS” 所述)相比,CXF 更适合使用 JAX-WS。与其他 JAX-WS 实现一样,CXF 需要服务 WSDL 在运行时可用于客户机。
同其他堆栈一样,CXF 使用由可配置组件组成的请求和响应处理流。CXF 调用组件 intercepters,而非 handlers,不过除此以外的其他组件是等效组件。与 Metro 相同的是,CXF 完全支持 WS-Security 和其他扩展技术,将其作为基础下载的一部分。与 Metro 不同的是,CXF JARs 是模块化的 — 即您可以根据正在使用的技术选择 JARs 使其成为应用程序的一部分(CXF 安装目录中的 /lib/WHICH_JARS 文件会告诉您各种常见用例所需的特定 JARs)。该模块化的负面效应是最终会产生应用程序所需的一长列特定 JARs;从有利的一面来说,它允许控制部署的大小。
另一个与 Metro 的相同之处是,CXF 通常需要为 Web 服务构建一个 WAR 文件,而非潜在地部署多个服务到单个服务安装上(这正是 Axis2 所用的方法)。CXF 还以 Jetty 服务器的形式提供一个适合生产使用的集成 HTTP 服务器。与 Axis2 和 Metro 中集成的简单服务器支持相比,这可以提供一个更灵活、强大的替代选择。
示例应用程序
代码下载 部分提供了本系列之前文章中使用的简单的书库管理服务的一个版本,该版本经过了修改,以演示 CXF 的使用。和之前的版本一样,WSDL 服务定义一共定义 4 个操作:
getBook 用于获取 International Standard Book Number (ISBN) 标识的特定图书的详细信息。
getBooksByType 用于获取某种类型的所有图书的详细信息。
getTypes 用于发现现有的图书类型。
addBook 用于将新的图书添加到书库。
在 “Axis2 中的 JAXB 和 JAX-WS” 中,您看到了这个应用程序在 Axis2 中如何工作,然后在 “Metro 简介” 中,您看到了它如何在 Metro 中工作。 这几篇文章中的大部分内容也适用于使用 CXF 的情况。除了服务名称和端点地址不同外,WSDL 是相同的;生成的 JAXB 数据模型是相同的,甚至生成的服务类也是相同的,只是 Java 包和 JAX-WS 注释中使用的服务名称不同。
客户端的使用
与在 Axis2 或 Metro 中使用 JAX-WS 相比,在 CXF 中,示例应用程序的客户端代码是相同的,甚至构建步骤也是类似的:只需代替 JAX-WS 参考实现 wsimport 工具使用 CXF wsdl2java 工具即可。参阅 “Axis2 中的 JAXB 和 JAX-WS” 了解代码和处理的详细信息。
尽管客户端代码相同,不过 CXF 中的客户端行为仍然有一个显著差异。默认情况下,CXF 打印大量令人不悦的日志细节并输出到控制台。CXF 使用 Java 日志记录,因此为避免此输出,您需要设置一个系统属性使其指向一个日志属性文件,设置为仅在有 WARNING 或 SEVERE 信息时输出日志。示例应用程序所用的 Ant build.xml 使用 JVM 参数行
服务器端的使用
与在 Axis2 或 Metro 中使用 JAX-WS 相比,在 CXF 中,示例应用程序的客户端代码也是一样的,且构建步骤与 Metro 很相似。使用 Axis2 时,是通过创建一个包含服务和数据模型类的 JAR 文件来准备用于部署的服务,然后通过将该 JAR 拖放到 Axis2 服务器安装目录中的 WEB-INF/servicejars 目录中来部署服务。而当使用 Metro 和 CXF 时,则需要创建一个包含服务和数据模型类、Metro 或 CXF 库 JARs 以及一对配置文件(其中一个文件在这两个堆栈中名称不同)的 WAR 文件。WEB-INF/web.xml 文件配置真正的 servlet 处理。用于示例应用程序的版本如 清单 1 所示:
清单 1. 示例应用程序 web.xml
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"> <display-name>CXFLibrary</display-name> <description>CXF Library Service</description> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:META-INF/cxf/cxf.xml classpath:META-INF/cxf/cxf-extension-soap.xml classpath:META-INF/cxf/cxf-servlet.xml </param-value> </context-param> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> |
清单 1 WEB-INF/web.xml 文件正是一个标准 servlet 配置文件,它告诉 Web 应用程序服务器(比如 Tomcat)如何接口到 servlet 应用程序。详情与 Metro 示例中的那些细节一样,不过对于 CXF,
上一篇:Spring 事务管理高级应用难点剖析: 第 3 部分 下一篇:Java如何获得文件编码格式的方法