1. 程式人生 > >CXF框架的使用,利用cxf開發webservice(六)

CXF框架的使用,利用cxf開發webservice(六)

1.CXF介紹

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 發行包的目錄結構示意圖

圖 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的安裝和配置:

直接解壓到某個盤下就可以使用:

 

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)將第一天查詢天氣資訊的程式碼拷貝到這個專案中,例如程式碼:

 

3)匯入jar包(目錄下全部的jar包)

 

4CXF是面向介面的程式設計,建立介面WeatherServerInterface

 

5)建立類WeatherServer實現以上的介面

 

6)建立QueryWebxmlClient呼叫網路天氣預報的服務

 

7Resultjavabean物件,返回封裝的結果集

 

8)使用JaxWsServerFactoryBean釋出CXF的服務端

 

附錄:

伺服器端釋出的類

lServerFactoryBean

lJaxWsServerFactoryBean(建議使用)

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: <?xml version="1.0" ?>

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:queryWeather xmlns:ns2="http://server.jaxws.ws.itcast.cn/">

<arg0>北京</arg0></ns2:queryWeather></S:Body>

</S: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:

<?xml version="1.0" ?>

<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"><S:Body><ns2:queryWeather xmlns:ns2="http://server.jaxws.ws.itcast.cn/">

<arg0>北京</arg0></ns2:queryWeather></S:Body></S:Envelope>

 

2.3 客戶端程式(使用jdk提供的jaxws

1)建立一個java工程

2)使用wsimport生成客戶端程式碼:

 

3)客戶端程式碼測試:

 

2.4 客戶端程式(使用CXF

使用CXFwsdl2java工具,它的功能就如同wsimport一樣,可以生成一堆客戶端呼叫的程式碼。

在命令列執行:

這裡注意

生成後WeatherService報錯

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

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

即如下

1建立java工程

2使用wsdl2java生成客戶端程式碼,並拷貝到專案中

 

3)客戶端測試程式碼:

 

2.2.4 客戶端程式(使用物件ServiceURLQName等)

1)客戶端測試程式碼

 

2.2.5 客戶端程式(使用JaxWsProxyFactoryBean

1)匯入CXFjar

2)測試程式碼:

 

這裡:大家把服務端的介面和實現類上的@bindingType改成SOAP12HTTP_BINDING看看會有什麼變化

可以通過攔截器看到Soap1.1Soap1.2之前的區別。

相關推薦

CXF框架的使用利用cxf開發webservice

1.CXF介紹 CXF 簡介 關於 Apache CXF Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,現在已經正式更名為 Apache CXF 了,以下簡稱為 CXF。CXF 繼承了 Cel

WEB開發者之混合開發APP 下拉重新整理

下拉重新整理,本文只介紹下拉重新整理重置頁面的情況。同上一篇博文一樣,筆者介紹兩種形式的下拉重新整理方法。 1. mui下拉重新整理 1.1 相對固定的頁面結構 <div id="pullrefresh" class="mui-conte

使用VC++ 6.0開發WebServicegsoap

最開始以為需要使用C#,或是VC++.net才能方便的開發WebService,後面在網上找到了gsoap,的確是一個好工具,使用VC++6.0也可以開發WebService了。 開發的過程非常的簡單,首先定義好WebService所需要提供的介面(或是服務),其實就是一

使用GatewayWorker框架多個workerman程序businessworker負載不均衡的問題解決過程

公司搭建一套智慧社群、智慧對講管控雲平臺時,使用GatewayWorker框架搭建app端外推送的服務。發現效能比預期的低。也就是GatewayWorker(https://github.com/walkor/GatewayWorker/)中的workerman元件往goog

Django框架電商網站開發流程Python

一、配置 1 建立專案和應用 配置專案setting.py(應用,templates路徑,資料庫,STATICFILES_DIRS) 配置專案urls.py,namespace起名最好和應用名一樣,不容易混淆 2 配置應用 在每個

框架基礎:ajax設計方案--- 全局配置、請求格式拓展和優化、請求二進制類型、瀏覽器錯誤搜集以及npm打包發布

rri seve win 最大 regexp isempty lee 出現問題 hub 距離上一次博客大概好多好多時間了,感覺再不搞點東西出來,感覺就廢了的感覺。這段時間回老家學習駕照,修養,然後7月底來上海求職(面了4家,拿了3家office),然後入職同程旅遊,項目趕進

vue 開發系列 企業微信整合

狀態 choose tin getent reset .post hal imp random 概述 手機端程序可以和企業微信進行整合,我們也可以使用企業微信JSSDK功能,實現一些原生的功能。 整合步驟 在整合之前需要閱讀 整合步驟。 http://work

JEESITE快速開發平臺代碼生成模塊介紹及使用

http 對象 不可 sdn copyto 卡號 tails 設置 sele 一、簡介 jeesite提供了配套的代碼生成功能,內置了三種生成方案: 樹結構: 單表: 主子表: 三種方案對應的測試表: 其實還有兩種方式如下: 僅持久

Java開發筆記特殊數字的表達

world 表達 int 數據 decimal stat java語言 細節 進制數 之前的文章提到,Java語言不但支持大眾熟知的十進制數,也支持計算機特有的二進制數、八進制數和十六進制數。可是在給數值變量賦值的時候,等號右邊的數字明顯屬於十進制,那究竟要如何書寫其它進制

Android 開發Activity生命週期以及函式意義

簡述:   1.在日常應用中Activity是與使用者互動的介面,它提供了一個使用者完成相關操作的視窗。當我們在開發中建立Activity後,通過呼叫setContentView(View)方法來給該Activity指定一個佈局介面,而這個介面就是提供給使用者互動的介面。Androi

NeuChar 平臺使用及開發教程:成為開發者

  在上一篇《NeuChar 平臺使用及開發教程(五):使用 NeuChar 的關鍵字回覆服務》中,我們已經學習瞭如何命中關鍵字來反饋特定格式內容的資訊,這是由微信開發者/運營者自己來維護的資訊,那麼如果我們自己有微信開發的經驗,並且想要把這個能力釋放出來,為其他的公眾號,甚至小程式、釘釘等平臺提供服務,我們

3dContactPointAnnotationTool開發日誌

  一種可行的思路就是列舉一個模型的三角面片,然後判斷三角形是否與另一個物體相交即可。為了讓效果更好我想只渲染模型的線框。   在網上查了半天好像Unity裡都沒有自帶的方便的渲染線框的方式,我又自己玩了玩發現可以將材質換成unity自帶的VR/SpatialMapping/Wireframe。不過看上去模型

PHP-CPP開發擴充套件

PHP-CPP是一個用於開發PHP擴充套件的C++庫。本節講解在C++中PHP異常、變數、常量的實現相關知識。 異常 PHP和C++都支援異常,而PHP-CPP庫這兩種語言之間的異常處理是完全透明的。你在C++中丟擲的異常會自動傳遞給PHP指令碼,並且你的C++程式碼可以捕獲PHP指令碼丟擲的異常,就像它是普

C語言開發筆記實參和形參

#include <stdio.h> int func(int n) { n = 1; return n; } int main(void) { int n = 0; printf("%d\n", func(n));

DX11 遊戲開發筆記 體積雲 水面

 對DX11來說,紋理佔了它的半邊天空,除了其賦予的色彩外,更由於其易於為資料的載體。 如上圖,我們僅僅使用了一個球、一個矩形,一個立方體紋理,一個3D紋理、一個無關緊要的水面顏色紋理。 立方體紋理和3d紋理使用方式跟2D紋理很像。 建立c++紋理資源:

床頭筆記之Android開發學習

初識Acitivity 目錄: 認識acitivity 建立一個acitivity專案 新增控制元件,實現想要的功能及介面 認識acitivity: Activity 是一個應用元件。 每個 Activity 都會獲得一個用於繪製其使用者介面的視窗。 使用者

Python自動化運維開發----基礎列表的應用

1.列表的應用 (1)佇列  特點: 先進先出  使用場景: 銀行排隊,庫存,秒殺,排隊取餐,callcenter  append() + pop(0) (2)堆疊  特點: 先進後出  使用場景: 出電梯  append() +

可配置語法分析器開發紀事——構造一個真正能用的狀態機

上一篇文章對大部分文法都構造出了一個使用的狀態機了,這次主要來講右遞迴的情況。右遞迴不像左遞迴那麼麻煩,因為大部分右遞迴寫成迴圈也不會過分的讓語法樹變得難以操作,不過仍然有少數情況是我們仍然希望保留遞迴的語法樹形狀,譬如C++的連等操作,因此這裡就來講一下這個問題。 右遞迴是怎麼形成的呢?在這裡我

如何為Apache JMeter開發外掛——監聽器之Vizualizer監視器

如何對Apache Tomcat的效能計數進行監視 上一章節我們對JMeter的監聽器元件進行了一個概況介紹,並通過實現開發一個Report(報告)元件為大家展示了監聽器元件的內部工作邏輯,本篇將為大家簡單介紹一下Vizualizer(監視器)元件的開發流程和

Java開發雜談final關鍵字

final可以修飾非抽象類、非抽象方法、變數或常量。 final類不能被繼承,final類的方法預設都是final的。 final方法不能被子方法覆蓋,但可以被繼承。這有兩個作用,一是防止被修改實現,二是編譯器處理呼叫final方法時轉入內聯機制(inline),執行效率高。inline的原