cxf 學習總結

   前段時間在學習cxf Webservice的東西,寫了不少的筆記。廢話不多說,整理還沒有完全,排版有點亂。我儘量按着學習時的步驟寫。

   

   

1. 目的


本文主要簡單介紹Apache CXF,以及介紹如何使用Apache CXF JAX-RS進行RESTful Web Services開發部署,以及客戶端開發。

2. Apache CXF簡介

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 的一個孵化項目。

Apache CXF 是一個開源的 Services 框架,CXF 幫助您利用 Frontend 編程 API 來構建和開發 Services ,像 JAX-WS 。這些 Services 可以支持多種協議,比如:SOAPXML/HTTPRESTful HTTP 或者 CORBA ,並且可以在多種傳輸協議上運行,比如:HTTPJMS 或者 JBICXF 大大簡化了 Services 的創建,同時它繼承了 XFire 傳統,一樣可以天然地和 Spring 進行無縫集成。

功能特性

CXF 包含了大量的功能特性,但是主要集中在以下幾個方面:

1. 支持 Web Services 標準:CXF 支持多種 Web Services 標準,包含 SOAPBasic ProfileWS-AddressingWS-PolicyWS-ReliableMessaging WS-Security

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 配置方式,等等。

4. 支持二進制和遺留協議:CXF 的設計是一種可插撥的架構,既可以支持 XML ,也可以支持非 XML 的類型綁定,比如:JSON CORBA

詳細介紹請參考 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. EclipseRESTful 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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章