前段時間在學習cxf Webservice的東西,寫了很多的筆記。廢話很少說,整理尚未徹底,排版有點亂。我儘可能按着學習時的步驟寫。java
1. 目的
本文主要簡單介紹Apache CXF,以及介紹如何使用Apache CXF JAX-RS進行RESTful Web Services開發部署,以及客戶端開發。web
2. Apache C X F簡介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 的一個孵化項目。spring
Apache CXF 是一個開源的 Services 框架,CXF 幫助您利用 Frontend 編程 API 來構建和開發 Services ,像 JAX-WS 。這些 Services 能夠支持多種協議,好比:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,而且能夠在多種傳輸協議上運行,好比:HTTP、JMS 或者 JBI,CXF 大大簡化了 Services 的建立,同時它繼承了 XFire 傳統,同樣能夠自然地和 Spring 進行無縫集成。apache
CXF 包含了大量的功能特性,可是主要集中在如下幾個方面:架構
1. 支持 Web Services 標準:CXF 支持多種 Web Services 標準,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。 app
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 配置方式,等等。 frontend
4. 支持二進制和遺留協議:CXF 的設計是一種可插撥的架構,既能夠支持 XML ,也能夠支持非 XML 的類型綁定,好比:JSON 和 CORBA。 webapp
詳細介紹請參考 Apache CXF 官方網站:http://cxf.apache.org
3. JAVA 開發環境下面這些組件都須要事先下載安裝。
組件 |
描述 |
備註 |
JDK |
Java環境,安裝 |
通常1.6或以上 |
TOMCAT |
DataNode&Task JobTracker |
通常6.0以上 |
APACHE CXF |
RESTful Web Services開發jar以及工具 |
2.7.8版本,免安裝 下載:http://cxf.apache.org |
JDK和TOMCAT的安裝不介紹。APACHE CXF下載後直接解壓縮便可,目錄結構以下:
apche-cxf-2.7.8:
RESTful Web Services開發的時候須要用到lib目錄下的jar包。
4. Eclipse中 RESTful Web Serives開發建立一個Students的CXF RESTful Web Services,並部署到Tomcat,而後用戶能夠在客戶端經過HTTP協議向服務端發送web請求來讀取,建立,修改,刪除Student資源。
主要包括:
l RESTful服務端開發
l RESTful服務部署
l RESTful客戶端開發
Apache CXF很容易與其餘框架集成,可是也能夠單獨使用,這裏介紹非集成的開發過程。
新建一個Dynamic Web Project,項目名稱:CXFRestWithoutSpring。
第一步:File->New->Dynamic Web Project
第二步:填寫Web項目名稱CXFRestWithoutSpring,其餘保持默認。
第三步:點擊Next,而後確認完成便可。Web項目目錄結構以下:
從下載的Apache CXF目錄apche-cxf-2.7.8中添加RESTful WebServices項目所須要的jar包到WebContent/WEB-INF/lib目錄,並添加到Build Path:
添加到WebContent/WEB-INF/lib目錄下的jar包:
Build Path配置:
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; } }
接口很簡單,主要是爲了提供統一訪問接口方式,方便不一樣的功能實現。能夠將JAX-RS的標註添加到接口文件中,如:@PATH,@GET,@POST,@PUT,@DELETE等
package com.study; publicinterface ChangeStudentDetails { Student changeName(Student student); Student getName(); }
注意下面綠色的標註代碼,這些標註是爲了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標準。
在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>
右鍵點擊項目名稱CXFRestWithoutSpring,選擇Run As->Run on Server
在IE中打開http://localhost:8080/CXFRestWithoutSpring/
點擊http://localhost:8080/CXFRestWithoutSpring/rest?_wadl可查看RESTful Web Services定義。
在IE中打開http://localhost:8080/CXFRestWithoutSpring/rest/Students/getName,即調用RESTful WebServices的getName方法。
返回結果:
CXF集成Spring服務端開發與非集成服務端開發的過程基本一致,只是須要添加幾個與Spring相關的jar包,以及添加Spring的配置,和修改web.xml配置。
新建一個Dynamic Web Project,項目名稱:CXFRestWithoutSpring。其餘參考4.1.1章節。
從下載的Apache CXF目錄apche-cxf-2.7.8中添加RESTful WebServices項目所須要的jar包到WebContent/WEB-INF/lib目錄,並添加到Build Path:
添加到WebContent/WEB-INF/lib目錄下的jar包:
注意紅色圈圈裏面的與Spring相關的jar:
參考4.1.3章節。
參考4.1.4章節。
參考4.1.5章節。
建立WebContent/WEB-INF/cxf.xml文件,用於配置CXF與Spring的集成。內容以下:
注意紅色部分必須添加
<?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>
<?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.1.7章節。
在IE中打開http://localhost:8080/CXFRestWithSpring/
參考4.1.9章節。
在IE中打開http://localhost:8080/CXFRestWithSpring/rest/Students/getName
參考4.1.9章節。
將兩個項目都導出,生成兩個war文件:CXFRestWithoutSpring.war和CXFRestWithSpring.war。
將上步導出的兩個war文件都copy到Tomcat的webapps目錄,重啓Tomcat服務便可。
能夠使用IE進行測試,參考4.1.9和4.2.10。
客戶端開發的通常步驟:
第一步:創建與RESTful的鏈接,通常經過HttpURLConnection或HttpClient。
第二步:設置HTTP請求屬性,如:HTTP請求方法,資源類型,HTTP頭部信息等。
第三步:提交HTTP 修改請求信息,GET方法不須要。
第四步:獲取HTTP返回信息,錯誤或者正常返回。
第五步:處理返回信息。
第六步:關閉鏈接請求。
建立一個普通Java項目,項目名稱:CXFRestClient。固然也能夠是動態Web項目,這裏只是爲了方便才建立Java項目
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(); } } }
PostStudentClient.java內容以下:
直接在GetStudentClient.java或PostStudentClient.java文件上右鍵點擊,Run As->Java Application。