http://news.misuland.com/20080926/1222396399411.html JavaSE/EE執行委員批准了JSR 311 JAX-RS作為支持RESTful web服務的java 應用程序接口。JAX-RS (Java平台上的REST支持規范 - aka JSR-311) 成為第一個到達提議為最終草案階段的JavaEE 6的規范。查看Java規范需求點擊: http://jcp.org/en/jsr/detail?id=311
http://www.blogjava.net/xmatthew/archive/2008/10/21/235777.html 與其它規范發布一樣,伴隨此次發布,Sun同步發布該規范的參考實現項目jersey。最新版本為1.0。 為了讓大家能快速體驗Rest帶給我們全新的架構風格,可以直接從本地下載程序。bookstore-1.0.war 源代碼 bookmark-1.0-project.zip. 下面展示了一個代碼片斷,讓大家直觀感受一下。
1 @Path("/bank")
2 public class Bank {
4 @POST
5 @Path("/account/{name}")
6 public Account createAccount(@PathParam("name") String name,
7 @QueryParam("balance")BigDecimal balance) {
8 //
9 return new Account(name, balance);
10 }
12 @GET
13 @Path("/account/{name}")
14 public Account getAccount(@PathParam("name") String name) {
15 //
16 return Account.getByName(name);
17 }
19 }
上面的代碼,就會發布兩個資源服務:
POST /bank/account/newAccount
GET /bank/account/newAccount
大家看到,用Rest發布資源服務非常方便。當然上面例子只是一個非常簡單的示例,用於展示Rest的應用,也希望大家提出好的建議和意見。
http://www.infoq.com/cn/news/2008/10/jaxrs-comparison 比較各JAX-RS實現
正如某人在別處說的,關於公交車,有一個奇怪的現象:你等了很久一輛不來,最后卻一下來了三輛!JAX-RS實現貌似也碰到了類似的問題。目前我們有:
- CXF——XFire和Celtix的合並(一個由IONA贊助的開源ESB,最初寄存在ObjectWeb上)。
- Jersey——Sun公司的JAX-RS參考實現。
- RESTEasy——JBoss的JAX-RS項目。
- Restlet——也許是最早的REST框架了,它JAX-RS之前就有了。
盡管圍繞着REST存在各種各樣的爭論,但JAX-RS提供了Java語言所需的REST支持這一點是無可爭議的。如果你是REST新手,你會選擇哪種實現呢?嗯,Solomon Duskis試圖解答這一問題。他還在dzone上指出:
我想就以下幾個“純”JAX-RS以外的方面對各JAX-RS實現進行比較。
這些方面包括:
- 產品成熟度
- 服務端集成策略
- Java客戶端API
- 可配置能力
- 安全性
- 性能
Solomon Duskis說“Jersey的用途是作為一個參考實現。RESTEasy是新思想的游樂場。CXF是在IONA支持下的‘企業版’。Restlet項目誕生的目的是增加一種RESTful API選擇。”
然而,Bill Burke在博客評論中反擊道:
RESTEasy不僅僅是新思想的游樂場。其實,我們將很快在JBoss里支持它(一拿到TCK就可以),而且我們很多大客戶都在催促我們提供RESTEasy支持。
在易用性方面,Solomon Duskis說:
你所面臨的問題是選擇一種實現。 我覺得Jersey的確很容易上手,不過Bill Burke會說RESTEasy同樣很簡單。它們都可以與EJB一起使用。不過,使用Jersey的話,搭建與運行測試服務很容易,如果你下載NetBeans的話更是如此。我第一次用Jersey和NetBeans時,不到半個小時就測試並運行起來了,包括下載、安裝及代碼瀏覽等。
Sun公司的人很想把Jersey與人們關於“參考實現”的傳統看法區分開:
你在談到“產品用途”時,應當將Jersey看作一種立馬可投入使用的產品(事實上下個月它就要隨GlassFish v3 Prelude版捆綁發布了)。Jersey團隊花費了相當多的時間來測試並改善代碼,以免去其作為“參考實現”的印象!:)
Solomon Duskis打算對這幾個方面進行研究,然后將結果發布在博客里。一篇名為《JAX-RS Spring集成》的文章已經發布出來了。
現在的四種JAX-RS實現均提供Spring集成,連JBoss的RESTEasy都是。
接着,他對集成作了相當簡短的介紹。不過正如Paul所指出的,Solomon Duskis在講述Jersey時引用的是過時的資料。這比較遺憾,因為我們需要的是一個深入徹底的比較。Solomon Duskis最后說:
四種實現均具有相當出色的Spring/JAX-RS能力,但我認為CXF是“JAX-RS產品里Spring集成做得最好的”。
不過顯然這只是他的個人看法,其他人肯定會有不同意見。比如Bill Burke就問道:
我沒看出CXF在Spring集成方面比其他產品優越在哪里。我不明白 為什么所有額外的CXF專用XML都被放在一個Spring XML文檔里。RESTEasy和Jersey提供的Spring集成要比CXF的侵入性更小。如果我沒搞錯的話。
對此,Solomon Duskis回復說:
如果各個類有一個簡單的配置,能夠滿足超過90%的需要,那么標注驅動的方法是可行的。剩下那不到10%的部分,需要在不同場合下對同一資源作不同配置。 我知道,根據我所更新的功能的需求與當前部署,我將會需要這種方案。為了通過同樣的Spring XML文檔來部署具有不同配置(如不同的JDBC數據源、不同的服務實現等等)的同一個資源,CXF提供了額外的功能。基本上,大多數情況下,標注的辦法是 很好的,但有時,你必須采用外部配置的辦法來實現解耦(decoupling)。XML方案並不如標注一樣受歡迎,但它們可以用於更復雜的配置情況。 【虎.無名:靜態配置用標注,動態配置用xml或者properties文件】
或許更深入的比較能夠揭示出更多的東西來?查看英文原文:A Comparison of JAX-RS Implementations
http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/index.html 使用 JAX-RS 簡化 REST 應用開發
級別: 初級
殷 鋼, 軟件工程師, IBM
張 昊, 軟件工程師, IBM
2009 年 9 月 07 日
本文將詳細介紹 Java EE 6 中所引入的對 JSR-311 (JAX-RS : Java API for RESTful Web Services) 的支持,並通過一個完整的示例應用程序展示 JAX-RS 關鍵的設計細節以及與 JPA 的結合使用。
REST 簡介
REST 是英文 Representational State Transfer 的縮寫,有中文翻譯為“具象狀態傳輸”。REST 這個術語是由 Roy Fielding 在他的博士論文 《 Architectural Styles and the Design of Network-based Software Architectures 》中提出的。REST 並非標准,而是一種開發 Web 應用的架構風格,可以將其理解為一種設計模式。REST 基於 HTTP,URI,以及 XML 這些現有的廣泛流行的協議和標准,伴隨着 REST,HTTP 協議得到了更加正確的使用。
相較於基於 SOAP 和 WSDL 的 Web 服務,REST 模式提供了更為簡潔的實現方案。目前,越來越多的 Web 服務開始采用 REST 風格設計和實現,真實世界中比較著名的 REST 服務包括:Google AJAX 搜索 API、Amazon Simple Storage Service (Amazon S3) 等。
基於 REST 的 Web 服務遵循一些基本的設計原則:
系統中的每一個對象或是資源都可以通過一個唯一的 URI 來進行尋址,URI 的結構應該簡單、可預測且易於理解,比如定義目錄結構式的 URI。
以遵循 RFC-2616 所定義的協議的方式顯式地使用 HTTP 方法,建立創建、檢索、更新和刪除(CRUD:Create, Retrieve, Update and Delete)操作與 HTTP 方法之間的一對一映射:
若要在服務器上創建資源,應該使用 POST 方法;
若要檢索某個資源,應該使用 GET 方法;
若要更改資源狀態或對其進行更新,應該使用 PUT 方法;
若要刪除某個資源,應該使用 DELETE 方法。
URI 所訪問的每個資源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具體的表現形式取決於訪問資源的客戶端,客戶端與服務提供者使用一種內容協商的機制(請求頭與 MIME 類型)來選擇合適的數據格式,最小化彼此之間的數據耦合。
JAX-RS -- Java API for RESTful Web Services
Java EE 6 引入了對 JSR-311 的支持。JSR-311(JAX-RS:Java API for RESTful Web Services)旨在定義一個統一的規范,使得 Java 程序員可以使用一套固定的接口來開發 REST 應用,避免了依賴於第三方框架。同時,JAX-RS 使用 POJO 編程模型和基於標注的配置,並集成了 JAXB,從而可以有效縮短 REST 應用的開發周期。
JAX-RS 定義的 API 位於 javax.ws.rs 包中,其中一些主要的接口、標注和抽象類如 圖 1 所示。
結束語
REST 作為一種輕量級的 Web 服務架構被越來越多的開發者所采用,JAX-RS 的發布則規范了 REST 應用開發的接口。本文首先闡述了 REST 架構的基本設計原則,然后通過一個示例應用展示了 JAX-RS 是如何通過各種標注來實現以上的設計原則的,最后還介紹了 JAX-RS 與 JPA、Gson 的結合使用。本文的示例應用使用了 Jersey 和 OpenJPA,部署在 Tomcat 容器上,替換成其它的實現只需要修改 web.xml 和 persistence.xml 配置文件。
參考資料
“編寫 REST 服務”(developerWorks,2007 年 11 月):本教程討論了 REST 和 Atom 發布協議(Atom Publishing Protocol,APP)的概念,並展示如何在服務中進行應用。
作者簡介
殷鋼,畢業於同濟大學計算機系,獲得碩士學位。目前就職於 IBM 中國開發中心 Solution Lab 部門。
- “構建 RESTful Web 服務”(developerWorks,2008 年 8 月):本教程從 REST 的基本概念開始,逐步指導您使用 Restlet 框架構建應用程序。
- “基於 REST 的 Web 服務:基礎”(developerWorks,2008 年 12 月): 在本文中,Alex Rodriguez 將向您介紹 REST 的基本原理。
- “JSR 311”,JSR 311 的規范文檔。
- “JAX-RS API”,JAX-RS 的 API 文檔。
- “Jersey”,JAX-RS 的參考實現。
- “Apache CXF”,一個 Apache 軟件基金會下的頂級項目,提供了 JAX-WS、JAX-RS 等的開源實現。
- “Google Gson”,一個用於將 Java 對象與 JSON 格式的數據進行雙向轉換的開源類庫,基於 Apache License 2.0。
- “Apache OpenJPA”,一個 Apache 軟件基金會下的頂級項目,提供了 JPA 規范的開源實現。
- Java 技術專區:尋找 Java 編程各方面的技術文章。
