Java EE 6引入的三大新技術(shù)之JAX-RS
原創(chuàng)【51CTO精選譯文】上周我們介紹了Java EE 6平臺(tái)的主要目標(biāo),本篇介紹這個(gè)版本中引入的新技術(shù)。這些新技術(shù)使這個(gè)平臺(tái)變得更加強(qiáng)大,其中三個(gè)重要的新技術(shù)包括:51CTO編輯推薦您閱讀《Java EE 6平臺(tái)指南》專題了解更多。
◆RESTful Web Services Java API (JAX-RS)
◆面向Java EE平臺(tái)的上下文和依賴性注入(CDI)
◆Bean驗(yàn)證
本文將介紹RESTful Web Services Java API (JAX-RS)。
RESTful Web Services Java API (JAX-RS)
RESTful Web Services Java API (JAX-RS),JSR 311讓你可以迅速構(gòu)建遵循REST(Representational State Transfer,表象化狀態(tài)轉(zhuǎn)變。參考閱讀:《什么是REST》)風(fēng)格軟件架構(gòu)的輕量級(jí)Web服務(wù)。REST中的一個(gè)重要概念是資源的存在性,每個(gè)資源都一個(gè)全局引用標(biāo)識(shí)符,即URI。特別是數(shù)據(jù)和函數(shù)都被認(rèn)為是可通過(guò)URI識(shí)別和訪問(wèn)的資源。為了操縱這些資源,網(wǎng)絡(luò)組件,客戶端和服務(wù)器通過(guò)一個(gè)標(biāo)準(zhǔn)的接口通信,如HTTP和一個(gè)組固定的動(dòng)詞 — GET,PUT,POST和DELETE — 交換這些資源。
RESTful Web服務(wù)是按照REST架構(gòu)風(fēng)格構(gòu)建的Web服務(wù),利用RESTful方法使用基于SOAP的技術(shù)構(gòu)建Web服務(wù)已經(jīng)成為一個(gè)受歡迎的選擇,這都得感謝REST的輕量級(jí)特性和直接通過(guò)HTTP傳輸數(shù)據(jù)的能力。
JAX-RS為在Java中構(gòu)建RESTful Web服務(wù)提供了標(biāo)準(zhǔn)化API,API提供了一組注解,以及相關(guān)的類和接口。對(duì)POJO應(yīng)用注解允許你暴露Web資源,這個(gè)方法使得在Java中創(chuàng)建RESTful Web服務(wù)變得簡(jiǎn)單。
JAX-RS 1.0技術(shù)規(guī)范定稿于2008年10月,包括了一個(gè)參考實(shí)現(xiàn)Jersey,Java EE 6包括了這個(gè)技術(shù)規(guī)范的***版本JAX-RS 1.1,這個(gè)版本與Java EE 6中的新特性保持一致。
下面我們一起來(lái)看一個(gè)使用JAX-RS構(gòu)建的RESTful Web服務(wù):
- import javax.ws.rs.Path;
- import javax.ws.rs.Produces;
- import javax.ws.rs.Get;
- import javax.ws.rs.Post;
- import javax.ws.rs.Consumes;
- import javax.ws.rs.core.Response;
- import javax.ws.rs.core.MediaType;
- import javax.ws.rs.core UriInfo;
- import javax.ws.rs.core.UriBuilder;
- import java.net.URI;
- @Path ("items")
- @Produces (MediaType.APPLICATION_XML)
- Public class ItemsResource {
- @Context UriInfo uriInfo;
- @GET
- Items listItems() {
- Return Allitems();
- }
- @POST
- @Consumes (MediaType.APPLICATION_XML)
- Public Response create(Item item) throws ItemCreationException {
- Item newItem = createItem(item);
- URI newItemURI = uriInfo.getRequestUriBuilder().path(newItem.getId()).build();
- return Response.created(newItemURI).build();
- }
- ...
- }
在這個(gè)例子中,ItemsResource類是管理一組項(xiàng)目的Web服務(wù),類中導(dǎo)入了JAX-RS 1.1注解,類和接口。
@Path注解指定了資源的相對(duì)路徑,在這里是“items”,類資源URI是基于應(yīng)用程序上下文的,因此,如果應(yīng)用程序上下文在這個(gè)例子中是http://example.com,那么類資源的URI就是http://example.com/items,這意味著如果一個(gè)客戶端直接請(qǐng)求URI http://example.com/items,ItemsResource類將會(huì)執(zhí)行。
@GET注解指定了注解的方法,這里是listItems()方法,它處理HTTP GET請(qǐng)求,當(dāng)某個(gè)客戶端直接發(fā)起對(duì)ItemsResource資源的HTTP GET請(qǐng)求時(shí),JAX-RS運(yùn)行時(shí)調(diào)用listItems()方法處理這個(gè)GET請(qǐng)求。
注意@Produces注解,它指定了返回給客戶端的MIME媒體類型,在ItemsResource這個(gè)例子中,@Produces注解指定了MediaType.APPLICATION_XML,MediaType類是一個(gè)抽象的MIME媒體類型,MediaType.APPLICATION_XML是XML內(nèi)容MIME媒體類型的抽象 — application/xml。
注解如@Produces建議JAX-RS自動(dòng)轉(zhuǎn)換某些內(nèi)容類型,例如,listItems()方法返回一個(gè)Items類型的Java對(duì)象,JAX-RS自動(dòng)將這個(gè)Java類型轉(zhuǎn)換成application/xml MIME類型,使用這個(gè)MIME類型響應(yīng)客戶端的HTTP請(qǐng)求。注意僅當(dāng)返回的類型默認(rèn)是支持的才會(huì)自動(dòng)轉(zhuǎn)換,例如,如果Items是一個(gè)JAXB注解Bean,那么將會(huì)自動(dòng)轉(zhuǎn)換,但如果Items是一個(gè)POJO,你需要執(zhí)行MessageBodyReader處理序列化。
你也可以在一個(gè)方法上指定@Produces注解,在上面的例子中,你在方法上指定的MIME類型覆蓋了在類的@Produces注解中指定的MIME類型,例如,你可以象下面這樣為listItems()方法指定@Produces注解:
- @GET
- @Produces (MediaType.TEXT_PLAIN)
- Items listItems() {
- Return Allitems();
- }
JAX-RS然后會(huì)將Items Java類型轉(zhuǎn)換為text/plain MIME類型,返回這種類型的內(nèi)容給HTTP請(qǐng)求客戶端。
@POST注解指定了注解的方法,這里是create()方法,它負(fù)責(zé)響應(yīng)HTTP POST請(qǐng)求。在這個(gè)例子中,這個(gè)方法創(chuàng)建了一個(gè)新項(xiàng)目,然后返回一個(gè)表示它已創(chuàng)建了一個(gè)新項(xiàng)目的響應(yīng),當(dāng)客戶端直接向ItemsResource資源發(fā)起HTTP POST請(qǐng)求時(shí),JAX-RS運(yùn)行時(shí)調(diào)用create()方法處理POST請(qǐng)求。
注意@Consumes注解是在create()方法上指定的,注解指定了方法能夠接受的來(lái)自客戶端的MIME媒體類型。如果你在類上指定@Consumes,它適用于類中的所有方法,如果你在方法上指定@Consumes,它會(huì)覆蓋你在類上指定的@Consumes注解包含的MIME類型。在這個(gè)例子中,@Consumes注解指定create()方法可接受XML內(nèi)容,即MIME類型application/xml,這是從MIME類型轉(zhuǎn)換到Java類型。當(dāng)某個(gè)客戶端在POST請(qǐng)求中提交XML內(nèi)容時(shí),JAX-RS調(diào)用create()方法自動(dòng)將傳入的XML內(nèi)容轉(zhuǎn)換成方法需要的Item Java類型。
JAX-RS也包括大量的進(jìn)一步簡(jiǎn)化有關(guān)構(gòu)建行為的實(shí)用類和接口,前面看到的MediaType就是這樣的類,它抽象了MIME媒體類型。其它的一些類和接口是:
UriInfo:訪問(wèn)URI信息的接口,在這個(gè)例子中,@Context注解注入U(xiǎn)riInfo接口到ItemsResource類中的uriInfo字段。
UriBuilder:從它們的組件構(gòu)建URI的類。
Response:代表HTTP響應(yīng)的類。
Response.ResponseBuilder:根據(jù)著名的Builder模式構(gòu)建Response對(duì)象的類。
這些類和接口在下面這些語(yǔ)句中非常有用:
- URI newItemURI = uriInfo.getRequestUriBuilder().path(newItem.getId()).build();
- return Response.created(newItemURI).build();
***個(gè)語(yǔ)句為新項(xiàng)目構(gòu)建一個(gè)URI,getRequestUriBuilder()方法是創(chuàng)建UriBuilder對(duì)象的UriInfo方法,path() 和 build()方法是為新項(xiàng)目一起構(gòu)造URI的UriBuilder方法。
#T#第二個(gè)語(yǔ)句為新項(xiàng)目創(chuàng)建一個(gè)返回給客戶端的Response對(duì)象,created方法是一個(gè)創(chuàng)建Response.ResponseBuilder 對(duì)象的Response方法,build()方法是一個(gè)為新項(xiàng)目創(chuàng)建Response 對(duì)象的Response.ResponseBuilder方法,這個(gè)對(duì)象提交元數(shù)據(jù)給JAX-RS運(yùn)行時(shí)構(gòu)造HTTP響應(yīng)。
這些實(shí)用類和接口隱藏了HTTP編程的許多復(fù)雜性,使用JAX-RS的另一個(gè)原因是它簡(jiǎn)化了構(gòu)建RESTful Web服務(wù),JAX-RS可以簡(jiǎn)化許多類型的Web應(yīng)用程序,例如,如果你需要構(gòu)建一個(gè)檢查HTTP頭的應(yīng)用程序,JAX-RS比采用其它技術(shù)就更簡(jiǎn)單。
JAX-RS還有其它便捷功能,例如,JAX-RS包括大量基于參數(shù)的注解,從請(qǐng)求中提取信息,@QueryParam就是這樣的注解,通過(guò)它你可以從請(qǐng)求URL中的Query組件提取查詢參數(shù),其它基于參數(shù)的注解還有@MatrixParam,它從URL路徑提取信息,@HeaderParam注解從HTTP頭提取信息,@CookieParam從Cookies提取信息。
原文名:Powerful New Technologies 作者:Ed Ort