CXF+Spring 實現WebService

1.概述

CXF 繼承了 Celtix 和 XFire 兩大開源項目的精華,提供了對 JAX-WS 全面的支持,並且提供了多種 Binding 、DataBinding、Transport 以及各種 Format 的支持,並且可以根據實際項目的需要,採用代碼優先(Code First)或者 WSDL 優先(WSDL First)來輕鬆地實現 Web Services 的發佈和使用。
Apache CXF 是一個開源的 Services 框架,CXF 幫助您利用 Frontend 編程 API 來構建和開發 Services ,像 JAX-WS 。這些 Services 可以支持多種協議,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,並且可以在多種傳輸協議上運行,比如:HTTP、JMS 或者 JBI,CXF 大大簡化了 Services 的創建,同時它繼承了 XFire 傳統,一樣可以天然地和 Spring 進行無縫集成。
 
2.功能特性
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。
5.支持多種標準:
 a.支持 JAX-WS、 JAX-WSA、JSR-181 和 SAAJ; 
 b.支持 SOAP 1.1、1.2、WS-I BasicProfile、WS-Security、WS-Addressing、WS-RM 和 WS-Policy; 
 c.支持 WSDL 1.1 、2.0; 
 d.支持 MTOM; 
6.多種傳輸方式、Bindings、Data Bindings 和 Format: 
 a.Bindings:SOAP、REST/HTTP; 
 b.Data Bndings:目前支持 JAXB 2.0、Aegis 兩種,默認是 JAXB 2.0。XMLBeans、Castor和 JiBX 數據綁定方式將在 CXF 2.1 版本中得到支持; 
 c.格式(Format):XML、JSON; 
 d.傳輸方式:HTTP、Servlet、JMS 和 Jabber; 
 e.可擴展的 API 允許爲 CXF 增加其它的 Bindings,以能夠支持其它的消息格式,比如:CSV 和固定記錄長度。 
7.靈活部署
 a.輕量級容器:可在 Tomcat 或基於 Spring 的容器中部署 Services; 
 b.集成 JBI:可以在如 ServiceMix, OpenESB or Petals 等等的 JBI 容器中將它部署爲一個服務引擎; 
 c.集成 SCA:可以部署在如 Tuscany 之類的 SCA 容器中; 
 d.集成 J2EE:可以在 J2EE 應用服務器中部署 Services,比如:Geronimo、JOnAS、JBoss、WebSphere Application Server 和 WebLogic Application Server,以及 Jetty 和 Tomcat; 
 e.獨立的 Java 客戶端/服務器。 
8.支持多種編程語言
 a.全面支持 JAX-WS 2.0 客戶端/服務器編程模型; 
 b.支持 JAX-WS 2.0 synchronous、asynchronous 和 one-way API's; 
 c.支持 JAX-WS 2.0 Dynamic Invocation Interface (DII) API; 
 d.支持 wrapped and non-wrapped 風格; 
 e.支持 XML messaging API; 
 f.支持 JavaScript 和 ECMAScript 4 XML (E4X) ,客戶端與服務端均支持; 
 g通過 Yoko 支持 CORBA; 
 h.通過 Tuscany 支持 SCA; 
 i.通過 ServiceMix 支持 JBI ; 
9.代碼生成
 a.Java to WSDL; 
 b.WSDL to Java; 
 c.XSD to WSDL; 
 d.WSDL to XML; 
 e.WSDL to SOAP; 
 f.WSDL to Service; 

3.輕鬆與Spring集成

3.1服務端
1.定義WebService所需暴露的接口:接口中只有一個方法public String vote,只需在接口定義處添加@WebService註明此接口將要提供服務.
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package ws.cxf;  
  2.   
  3. import javax.jws.WebService;  
  4.   
  5. @WebService  
  6. public interface ISurveyService {  
  7.     /** 
  8.      * @param username 名字 
  9.      * @param point 分數 
  10.      * @return 
  11.      */  
  12.     public String vote(String username,int point);  
  13.       
  14. }  

2.編寫接口實現類:vote方法中判斷username入參是否爲Michael,如果是將返回重複投票
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package ws.cxf.impl;  
  2.   
  3. import ws.cxf.ISurveyService;  
  4.   
  5. public class SurveyService implements ISurveyService {  
  6.     private String excludeName = "Michael";  
  7.     private int leastPonit = 5;  
  8.   
  9.     public String vote(String username, int point) {  
  10.         String result = "";  
  11.         if(excludeName.equals(username)){  
  12.             result = " 您不能重複進行投票!";  
  13.         }  
  14.         else{  
  15.             result = " 謝謝您的投票!";  
  16.             if(point < leastPonit){  
  17.                 result += " 您的投票分數太低!";  
  18.             }  
  19.             else{  
  20.                 result += " 您的投票分數通過審覈!";  
  21.             }  
  22.         }  
  23.         return result;  
  24.     }  
  25.   
  26. }  

3.服務器端配置文件:需要注意兩個地方,將CXF所需的配置文件import到Spring容器中,但所需的3個配置文件並不在工程裏,而是在Spring容器初始化時自動創建,這裏需要顯示的將其import進來;
 定義了一個Webservice的端點,其中id是其存放在Spring容器中的標識, implementor用於標註實現類, address提供服務的地址.



4.web.xml配置:在web.xml中只需定義Spring容器的監聽器,CXFServlet和CXFServlet mapping


3.2客戶端
1.客戶端配置文件(僅供客戶端使用Spring框架):
和服務器端得配置一樣,也需要import相關CXF配置文件到Spring容器;同時還要使用定義客戶端的bean,其中id爲其存在Spring容器中的標識, serviceClass爲WebService暴露接口的完全限定名, address爲提供服務的地址.



2.客戶端調用(使用Spring容器):只需創建Sping容器根據ID獲取ISurveyService並調用所需方法
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public static void main(String[] args){  
  2.         System.out.println(SurveyServiceClient.doSpringClient("Funny",88));  
  3.     //  System.out.println(SurveyServiceClient.doNormalClient("Michael",90));  
  4.     }  
  5.     private static String doSpringClient(String username,int point){  
  6.         // 加載客戶端的配置定義  
  7.         ApplicationContext context =   
  8.             new FileSystemXmlApplicationContext("src/test/ws/cxf/client/beanRefClient.xml");  
  9.         // 獲取定義的 Web Service Bean  
  10.         ISurveyService surveyService = (ISurveyService)context.getBean("surveyServiceClient");  
  11.         // 調用方法進行服務消費  
  12.         return surveyService.vote(username,point);  
  13.     }  

3. 客戶端調用(java語言客戶端):初始化代理工廠並將接口類型和服務地址設置近工廠類,就可獲得所需服務
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. private static String doNormalClient(String username,int point){  
  2.         //初始化代理工廠  
  3.         JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();  
  4.         //定義服務接口類型  
  5.         factory.setServiceClass(ISurveyService.class);  
  6.         //設置服務地址  
  7.         factory.setAddress  
  8.             ("http://localhost:8080/CXF_Spring_Survey/SurveyWebService");  
  9.         ISurveyService client = (ISurveyService) factory.create();  
  10.         return client.vote(username,point);  
  11.     }  

3.3WSDL




4.源碼下載








轉載請標明出處:http://blog.csdn.net/shimiso
歡迎有識之士加入我們的技術交流羣:173711587
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章