天天看點

Java EE 6引入的三大新技術之JAX-RSJava EE 6引入的三大新技術之JAX-RS

Java EE 6引入的三大新技術之JAX-RS

Java EE 6引入的新技術使其成為一個更強大的平台,其中包括三個重要技術:RESTful Web Services(JSR 311)、上下文和依賴性注入(JSR 299),以及Bean驗證(JSR 303)。本文介紹JSR 311,簡稱JAX-RS。

AD:51CTO學院:IT精品課程線上看!

【51CTO精選譯文】上周我們介紹了Java EE 6平台的主要目标,本篇介紹這個版本中引入的新技術。這些新技術使這個平台變得更加強大,其中三個重要的新技術包括:51CTO編輯推薦您閱讀《Java EE 6平台指南》專題了解更多。

◆RESTful Web Services Java API (JAX-RS)

◆面向Java EE平台的上下文和依賴性注入(CDI)

◆Bean驗證

本文将介紹RESTful Web Services Java API (JAX-RS)。

RESTful Web Services Java API (JAX-RS)

RESTful Web Services Java API (JAX-RS),JSR 311讓你可以迅速建構遵循REST(Representational State Transfer,表象化狀态轉變。參考閱讀:《什麼是REST》)風格軟體架構的輕量級Web服務。REST中的一個重要概念是資源的存在性,每個資源都一個全局引用辨別符,即URI。特别是資料和函數都被認為是可通過URI識别和通路的資源。為了操縱這些資源,網絡元件,用戶端和伺服器通過一個标準的接口通信,如HTTP和一個組固定的動詞 — GET,PUT,POST和DELETE — 交換這些資源。

RESTful Web服務是按照REST架構風格建構的Web服務,利用RESTful方法使用基于SOAP的技術建構Web服務已經成為一個受歡迎的選擇,這都得感謝REST的輕量級特性和直接通過HTTP傳輸資料的能力。

JAX-RS為在Java中建構RESTful Web服務提供了标準化API,API提供了一組注解,以及相關的類和接口。對POJO應用注解允許你暴露Web資源,這個方法使得在Java中建立RESTful Web服務變得簡單。

JAX-RS 1.0技術規範定稿于2008年10月,包括了一個參考實作Jersey,Java EE 6包括了這個技術規範的最新版本JAX-RS 1.1,這個版本與Java EE 6中的新特性保持一緻。

下面我們一起來看一個使用JAX-RS建構的RESTful Web服務:

  1. import javax.ws.rs.Path;  
  2.    import javax.ws.rs.Produces;  
  3.    import javax.ws.rs.Get;  
  4.    import javax.ws.rs.Post;  
  5.    import javax.ws.rs.Consumes;  
  6.    import javax.ws.rs.core.Response;  
  7.    import javax.ws.rs.core.MediaType;  
  8.    import javax.ws.rs.core UriInfo;  
  9.    import javax.ws.rs.core.UriBuilder;  
  10.    import java.net.URI;  
  11.    @Path ("items")  
  12.    @Produces (MediaType.APPLICATION_XML)  
  13.    Public class ItemsResource {  
  14.        @Context UriInfo uriInfo;  
  15.        @GET 
  16.        Items listItems() {  
  17.            Return Allitems();  
  18.        }  
  19.        @POST 
  20.        @Consumes (MediaType.APPLICATION_XML)  
  21.        Public Response create(Item item) throws ItemCreationException {  
  22.            Item newItem = createItem(item);  
  23.            URI newItemURI = uriInfo.getRequestUriBuilder().path(newItem.getId()).build();  
  24.            return Response.created(newItemURI).build();  
  25.        }  
  26.        ...  
  27.    }  

在這個例子中,ItemsResource類是管理一組項目的Web服務,類中導入了JAX-RS 1.1注解,類和接口。

@Path注解指定了資源的相對路徑,在這裡是“items”,類資源URI是基于應用程式上下文的,是以,如果應用程式上下文在這個例子中是http://example.com,那麼類資源的URI就是http://example.com/items,這意味着如果一個用戶端直接請求URI http://example.com/items,ItemsResource類将會執行。

@GET注解指定了注解的方法,這裡是listItems()方法,它處理HTTP GET請求,當某個用戶端直接發起對ItemsResource資源的HTTP GET請求時,JAX-RS運作時調用listItems()方法處理這個GET請求。

注意@Produces注解,它指定了傳回給用戶端的MIME媒體類型,在ItemsResource這個例子中,@Produces注解指定了MediaType.APPLICATION_XML,MediaType類是一個抽象的MIME媒體類型,MediaType.APPLICATION_XML是XML内容MIME媒體類型的抽象 — application/xml。

注解如@Produces建議JAX-RS自動轉換某些内容類型,例如,listItems()方法傳回一個Items類型的Java對象,JAX-RS自動将這個Java類型轉換成application/xml MIME類型,使用這個MIME類型響應用戶端的HTTP請求。注意僅當傳回的類型預設是支援的才會自動轉換,例如,如果Items是一個JAXB注解Bean,那麼将會自動轉換,但如果Items是一個POJO,你需要執行MessageBodyReader處理序列化。

你也可以在一個方法上指定@Produces注解,在上面的例子中,你在方法上指定的MIME類型覆寫了在類的@Produces注解中指定的MIME類型,例如,你可以象下面這樣為listItems()方法指定@Produces注解:

  1. @GET 
  2.        @Produces (MediaType.TEXT_PLAIN)  
  3.        Items listItems() {  
  4.            Return Allitems();  
  5.        } 

JAX-RS然後會将Items Java類型轉換為text/plain MIME類型,傳回這種類型的内容給HTTP請求用戶端。

@POST注解指定了注解的方法,這裡是create()方法,它負責響應HTTP POST請求。在這個例子中,這個方法建立了一個新項目,然後傳回一個表示它已建立了一個新項目的響應,當用戶端直接向ItemsResource資源發起HTTP POST請求時,JAX-RS運作時調用create()方法處理POST請求。

注意@Consumes注解是在create()方法上指定的,注解指定了方法能夠接受的來自用戶端的MIME媒體類型。如果你在類上指定@Consumes,它适用于類中的所有方法,如果你在方法上指定@Consumes,它會覆寫你在類上指定的@Consumes注解包含的MIME類型。在這個例子中,@Consumes注解指定create()方法可接受XML内容,即MIME類型application/xml,這是從MIME類型轉換到Java類型。當某個用戶端在POST請求中送出XML内容時,JAX-RS調用create()方法自動将傳入的XML内容轉換成方法需要的Item Java類型。

JAX-RS也包括大量的進一步簡化有關建構行為的實用類和接口,前面看到的MediaType就是這樣的類,它抽象了MIME媒體類型。其它的一些類和接口是:

UriInfo:通路URI資訊的接口,在這個例子中,@Context注解注入UriInfo接口到ItemsResource類中的uriInfo字段。

UriBuilder:從它們的元件建構URI的類。

Response:代表HTTP響應的類。

Response.ResponseBuilder:根據著名的Builder模式建構Response對象的類。

這些類和接口在下面這些語句中非常有用:

  1. URI newItemURI = uriInfo.getRequestUriBuilder().path(newItem.getId()).build();  
  2.    return Response.created(newItemURI).build(); 

第一個語句為新項目建構一個URI,getRequestUriBuilder()方法是建立UriBuilder對象的UriInfo方法,path() 和 build()方法是為新項目一起構造URI的UriBuilder方法。

  • Java EE 6新特性嘗鮮:EJB 3.1重要變化總
  • 什麼是REST?以及RESTful的實作
  • 使用 JAX-RS 簡化 REST 應用開發
  • RESTFul已釋出 連接配接Java和.NET的橋梁
  • Java EE 6總覽:平台的主要目标

第二個語句為新項目建立一個傳回給用戶端的Response對象,created方法是一個建立Response.ResponseBuilder 對象的Response方法,build()方法是一個為新項目建立Response 對象的Response.ResponseBuilder方法,這個對象送出中繼資料給JAX-RS運作時構造HTTP響應。

這些實用類和接口隐藏了HTTP程式設計的許多複雜性,使用JAX-RS的另一個原因是它簡化了建構RESTful Web服務,JAX-RS可以簡化許多類型的Web應用程式,例如,如果你需要建構一個檢查HTTP頭的應用程式,JAX-RS比采用其它技術就更簡單。

JAX-RS還有其它便捷功能,例如,JAX-RS包括大量基于參數的注解,從請求中提取資訊,@QueryParam就是這樣的注解,通過它你可以從請求URL中的Query元件提取查詢參數,其它基于參數的注解還有@MatrixParam,它從URL路徑提取資訊,@HeaderParam注解從HTTP頭提取資訊,@CookieParam從Cookies提取資訊。

上一篇: JAX-RS介紹
下一篇: JAX-RS簡介