cxf 学习总结

   前段时间在学习cxf Webservice的东西,写了很多的笔记。废话很少说,整理尚未彻底,排版有点乱。我尽可能按着学习时的步骤写。java

   

   

1. 目的


本文主要简单介绍Apache CXF,以及介绍如何使用Apache CXF JAX-RS进行RESTful Web Services开发部署,以及客户端开发。web

2. Apache C X F简介

Apache CXF = Celtix + XFireApache CXF 的前身叫 Apache CeltiXfire,如今已经正式改名为 Apache CXF 了,如下简称为 CXFCXF 继承了 Celtix XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,而且提供了多种 Binding DataBindingTransport 以及各类 Format 的支持,而且能够根据实际项目的须要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。目前它仍只是 Apache 的一个孵化项目。spring

Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 能够支持多种协议,好比:SOAPXML/HTTPRESTful HTTP 或者 CORBA ,而且能够在多种传输协议上运行,好比:HTTPJMS 或者 JBICXF 大大简化了 Services 的建立,同时它继承了 XFire 传统,同样能够自然地和 Spring 进行无缝集成。apache

功能特性编程

CXF 包含了大量的功能特性,可是主要集中在如下几个方面:架构

1. 支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAPBasic ProfileWS-AddressingWS-PolicyWS-ReliableMessaging WS-Securityapp

2. FrontendsCXF 支持多种“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 配置方式,等等。 frontend

4. 支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既能够支持 XML ,也能够支持非 XML 的类型绑定,好比:JSON CORBAwebapp

详细介绍请参考 Apache CXF 官方网站http://cxf.apache.org

3. JAVA 开发环境

3.1 组件列表

下面这些组件都须要事先下载安装。

组件

描述

备注

JDK

Java环境,安装

通常1.6或以上

TOMCAT

DataNode&Task JobTracker

通常6.0以上

APACHE CXF

RESTful Web Services开发jar以及工具

2.7.8版本,免安装

下载:http://cxf.apache.org

3.2 组件安装

JDKTOMCAT的安装不介绍。APACHE CXF下载后直接解压缩便可,目录结构以下:

apche-cxf-2.7.8


RESTful Web Services开发的时候须要用到lib目录下的jar包。

4. Eclipse RESTful Web Serives开发

4.1 场景介绍

建立一个StudentsCXF RESTful Web Services,并部署到Tomcat,而后用户能够在客户端经过HTTP协议向服务端发送web请求来读取,建立,修改,删除Student资源。

主要包括:

l RESTful服务端开发

l RESTful服务部署

l RESTful客户端开发

4.2 CXF非集成服务端开发

Apache CXF很容易与其余框架集成,可是也能够单独使用,这里介绍非集成的开发过程。

新建Dynamic Web Project

新建一个Dynamic Web Project,项目名称:CXFRestWithoutSpring

第一步:File->New->Dynamic Web Project


第二步:填写Web项目名称CXFRestWithoutSpring,其余保持默认。


第三步:点击Next,而后确认完成便可。Web项目目录结构以下:


4.2.1 添加jarBuild Path

从下载的Apache CXF目录apche-cxf-2.7.8中添加RESTful WebServices项目所须要的jar包到WebContent/WEB-INF/lib目录,并添加到Build Path

添加到WebContent/WEB-INF/lib目录下的jar包:


Build Path配置:


4.2.2 新建POJO

POJO(Plain Old Java Object)类就是通常的java类,主要是建立一些Web Services中须要用到的基础类。固然也能够不须要这些基础类,直接建立Web Services

这里建立一个Student POJO类:

注意下面标记红色的代码是必须的,由于CXF在客户端与服务端通信时候须要在java对象与XML之间转换,CXF经过HTTP协议传输的是XML格式。

package com.study;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Student")
publicclass Student {
private String name;
public String getName()
{
returnname;
}
publicvoid setName(String name)
{
this.name = name;
}
}

4.2.3 新建RESTful Web Services接口

接口很简单,主要是为了提供统一访问接口方式,方便不一样的功能实现。能够将JAX-RS的标注添加到接口文件中,如:@PATH,@GET,@POST,@PUT,@DELETE

package com.study;
publicinterface ChangeStudentDetails {
Student changeName(Student student);
Student getName();
}


4.2.4 新建RESTful Web Services实现类

注意下面绿色的标注代码,这些标注是为了Java类标注成Web Services资源。


package com.study;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/Students")
@Consumes("application/xml")
@Produces("application/xml")
public class ChangeStudentDetailsImpl implements ChangeStudentDetails {
@POST
@Path("/changeName")
public Student changeName(Student student) {
student.setName("HELLO " + student.getName());
return student;
}
@GET
@Path("/getName")
public Student getName() {
Student student = new Student();
student.setName("Rockey");
return student;
}
}


JAX-RS标注介绍

@Path,标注资源类或者方法的相对路径

@GET@PUT@POST@DELETE,标注方法是HTTP请求的类型。

@Produces,标注返回的MIME媒体类型

@Consumes,标注可接受请求的MIME媒体类型

@PathParam@QueryParam@HeaderParam@CookieParam@MatrixParam@FormParam,分别标注方法的参数来自于HTTP请求的不一样位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie


详细介绍请参考JSR-339标准。

4.2.5 配置web.xml

WebContent/WEB-INF/web.xml配置文件的web-app节点里面添加以下类容:

注意红色部分。

<servlet>
<description></description>
<display-name>CXFNonSpringJaxrsServlet</display-name>
<servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>jaxrs.serviceClasses</param-name>
<param-value>com.study.ChangeStudentDetailsImpl</param-value>
</init-param>
<init-param>
<param-name>jaxrs.address</param-name>
<param-value>/rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

4.2.6 运行REST Web Services

右键点击项目名称CXFRestWithoutSpring,选择Run As->Run on Server


4.2.7 查看运行结果

IE中打开http://localhost:8080/CXFRestWithoutSpring/


点击http://localhost:8080/CXFRestWithoutSpring/rest?_wadl可查看RESTful Web Services定义。


4.2.8 IE测试RESTful WebServices

IE中打开http://localhost:8080/CXFRestWithoutSpring/rest/Students/getName,即调用RESTful WebServicesgetName方法。

返回结果:


4.3 CXF集成Spring服务端开发

CXF集成Spring服务端开发与非集成服务端开发的过程基本一致,只是须要添加几个与Spring相关的jar包,以及添加Spring的配置,和修改web.xml配置。

4.3.1 新建Dynamic Web Project

新建一个Dynamic Web Project,项目名称:CXFRestWithoutSpring。其余参考4.1.1章节。

4.3.2 添加jarBuild Path

从下载的Apache CXF目录apche-cxf-2.7.8中添加RESTful WebServices项目所须要的jar包到WebContent/WEB-INF/lib目录,并添加到Build Path

添加到WebContent/WEB-INF/lib目录下的jar包:

注意红色圈圈里面的与Spring相关的jar


4.3.3 新建POJO

参考4.1.3章节。

4.3.4 新建RESTful Web Services接口

参考4.1.4章节。

4.3.5 新建RESTful Web Services实现类

参考4.1.5章节。

4.3.6 Spring集成配置

建立WebContent/WEB-INF/cxf.xml文件,用于配置CXFSpring的集成。内容以下:

注意红色部分必须添加

<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd">
<importresource="classpath:META-INF/cxf/cxf.xml"/>
<jaxrs:serverid="base"address="/rest">
<jaxrs:serviceBeans>
<refbean="StudentService"/>
</jaxrs:serviceBeans>
</jaxrs:server>
<beanid="StudentService"class="com.study.ChangeStudentDetailsImpl"/>
</beans>

4.3.7 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/cxf.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <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>

4.3.8 运行REST Web Services

参考4.1.7章节。

4.3.9 查看运行结果

IE中打开http://localhost:8080/CXFRestWithSpring/

参考4.1.9章节。

4.3.10 IE测试RESTful WebServices

IE中打开http://localhost:8080/CXFRestWithSpring/rest/Students/getName

参考4.1.9章节。

4.4 CXF Web Services部署

4.4.1 导出RESTful Web Services项目

将两个项目都导出,生成两个war文件:CXFRestWithoutSpring.warCXFRestWithSpring.war


4.4.2 部署RESTful Web Services

将上步导出的两个war文件都copyTomcatwebapps目录,重启Tomcat服务便可。

4.4.3 测试RESTful Web Services

能够使用IE进行测试,参考4.1.94.2.10

4.5 CXF客户端开发

客户端开发的通常步骤:

第一步:创建与RESTful的链接,通常经过HttpURLConnectionHttpClient

第二步:设置HTTP请求属性,如:HTTP请求方法,资源类型,HTTP头部信息等。

第三步:提交HTTP 修改请求信息,GET方法不须要。

第四步:获取HTTP返回信息,错误或者正常返回。

第五步:处理返回信息。

第六步:关闭链接请求。

4.5.1 新建Java Project

建立一个普通Java项目,项目名称:CXFRestClient。固然也能够是动态Web项目,这里只是为了方便才建立Java项目

4.5.2 GET方法调用RESTful服务

GetStudentClient.java内容以下:

package com.study;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
// CXF JAX-RS client Invoking GET Method
public class GetStudentClient {
  public static void main(String[] args) {
    try {
      URL url = new URL("http://localhost:8080/CXFRestWithoutSpring/rest/Students/getName");
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setDoOutput(true);
      conn.setRequestMethod("GET");
      conn.setRequestProperty("Content-Type", "application/xml");
      Scanner scanner;
      String response;
      if (conn.getResponseCode() != 200) {
        scanner = new Scanner(conn.getErrorStream());
        response = "Error From Server \n\n";
      } else {
        scanner = new Scanner(conn.getInputStream());
        response = "Response From Server \n\n";
      }
      scanner.useDelimiter("\\Z");
      System.out.println(response + scanner.next());
      scanner.close();
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

4.5.3 POST方法调用RESTful服务

PostStudentClient.java内容以下:



4.5.4 客户端测试

直接在GetStudentClient.javaPostStudentClient.java文件上右键点击,Run As->Java Application

相关文章
相关标签/搜索