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 包含了大量的功能特性,但是主要集中在以下幾個方面:
- 支援 Web Services 標準:CXF 支援多種 Web Services 標準,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。
- Frontends:CXF 支援多種“Frontend”程式設計模型,CXF 實現了 JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一個“simple frontend”允許客戶端和 EndPoint 的建立,而不需要 Annotation 註解。CXF 既支援 WSDL 優先開發,也支援從 Java 的程式碼優先開發模式。
- 容易使用: CXF 設計得更加直觀與容易使用。有大量簡單的 API 用來快速地構建程式碼優先的 Services,各種 Maven 的外掛也使整合更加容易,支援 JAX-WS API ,支援 Spring 2.0 更加簡化的 XML 配置方式,等等。
- 支援二進位制和遺留協議: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 發行包的目錄結構示意圖
檔案目錄結構及相關檔案的詳細說明:
-
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包)
(4)CXF是面向介面的程式設計,建立介面WeatherServerInterface
(5)建立類WeatherServer實現以上的介面
(6)建立QueryWebxmlClient呼叫網路天氣預報的服務
(7)Result的javabean物件,返回封裝的結果集
(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)
使用CXF的wsdl2java工具,它的功能就如同wsimport一樣,可以生成一堆客戶端呼叫的程式碼。
在命令列執行:
這裡注意:
生成後WeatherService報錯:
原因是cxf需要JAX-WS API 2.2,而jdk6的jax-ws是2.1 版本,需要
wsdl2java 使用“-frontend jaxws21“,或者如果使用jdk1.7就不用加frontend
即如下:
(1)建立java工程
(2)使用wsdl2java生成客戶端程式碼,並拷貝到專案中
(3)客戶端測試程式碼:
2.2.4 客戶端程式(使用物件Service、URL,QName等)
(1)客戶端測試程式碼
2.2.5 客戶端程式(使用JaxWsProxyFactoryBean)
(1)匯入CXF的jar包
(2)測試程式碼:
這裡:大家把服務端的介面和實現類上的@bindingType改成SOAP12HTTP_BINDING看看會有什麼變化
可以通過攔截器看到Soap1.1和Soap1.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開發WebService(gsoap)
最開始以為需要使用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的原