JAX-RS 2.0:REST 式 Web 服務(wù) API 中新增的和值得關(guān)注的功能_第1頁(yè)
JAX-RS 2.0:REST 式 Web 服務(wù) API 中新增的和值得關(guān)注的功能_第2頁(yè)
JAX-RS 2.0:REST 式 Web 服務(wù) API 中新增的和值得關(guān)注的功能_第3頁(yè)
JAX-RS 2.0:REST 式 Web 服務(wù) API 中新增的和值得關(guān)注的功能_第4頁(yè)
JAX-RS 2.0:REST 式 Web 服務(wù) API 中新增的和值得關(guān)注的功能_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、版權(quán)所有 2012,Oracle 和/或其分支機(jī)構(gòu)。保留所有權(quán)利。插入幻燈片 13 中的保護(hù)政策分類等級(jí)1版權(quán)所有 2012,Oracle 和/或其分支機(jī)構(gòu)。保留所有權(quán)利。插入幻燈片 13 中的保護(hù)政策分類等級(jí)2JAX-RS 2.0:REST 式式 Web 服務(wù)服務(wù) API 中新增的和值得關(guān)中新增的和值得關(guān)注的功能注的功能John ClinganJava EE 和 GlassFish 產(chǎn)品經(jīng)理版權(quán)所有 2012,Oracle 和/或其分支機(jī)構(gòu)。保留所有權(quán)利。插入幻燈片 13 中的保護(hù)政策分類等級(jí)3版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。JAX-RS 2.0 中的新中的

2、新增功能增功能JAX-RS 回顧客戶端 API通用配置異步處理過濾器/攔截器超媒體支持服務(wù)器端內(nèi)容協(xié)商版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。4JAX-RS 用于用于 REST 式服務(wù)的式服務(wù)的 Java API基于 POJO 的資源類以 HTTP 為中心的編程模型實(shí)體格式獨(dú)立性容器獨(dú)立性包括在 Java EE 中注解驅(qū)動(dòng)的標(biāo)準(zhǔn)API,用于幫助開發(fā)人員使用 Java 構(gòu)建 REST 式 Web 服務(wù)和客戶端版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。5JAX-RS 示例示例 .POST Path(/withdrawal)Consumes(text

3、/plain) Produces(application/json)public Money withdraw(PathParam(card) String card,QueryParam(pin) String pin, String amount) return getMoney(card, pin, amount); 版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。6JAX-RS 注解注解方法方法注解注解目的目的GETGET讀取,可能緩存POSTPOST在沒有已知 ID 的情況下更新或創(chuàng)建PUTPUT在有已知 ID 的情況下更新或創(chuàng)建DELETEDELETE刪除HEAD

4、HEAD沒有響應(yīng)的 GETOPTIONSOptions支持的方法版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。7JAX-RS 注解(續(xù))注解(續(xù))注解注解目的目的PathParam綁定來自 URI 的值,例如PathParam(“id”)QueryParam綁定查詢名稱的值/查詢值,例如QueryParam(“name”)CookieParam綁定 cookie 的值,例如CookieParam(“JSESSIONID”)HeaderParam綁定 HTTP 標(biāo)頭的值,例如HeaderParam(“Accept”)FormParam綁定 HTML 表單的值,例如FormPa

5、ram(“name”)MatrixParam綁定矩陣參數(shù)的值,例如MatrixParam(“name”)版權(quán)所有 2012,Oracle 和/或其分支機(jī)構(gòu)。保留所有權(quán)利。插入幻燈片 13 中的保護(hù)政策分類等級(jí)8JAX RS 2.0 客戶端客戶端 API版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。9客戶端客戶端 APIHTTP 客戶端庫(kù)太低級(jí)利用 JAX-RS 1.x API 中的提供商/概念主要實(shí)現(xiàn)引入的專用 API動(dòng)機(jī)版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。10客戶端客戶端 API/ Get instance of ClientClient c

6、lient = ClientBuilder.newClient();/ Get account balanceString bal = client.target(http:/./atm/cardId/balance) .resolveTemplate(cardId, 111122223333) .queryParam(pin, 9876) .request(text/plain).get(String.class);版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。11客戶端客戶端 API/ Withdraw some moneyMoneymoney =client.targ

7、et(http:/./atm/cardId/withdrawal) .resolveTemplate(cardId, 111122223333) .queryParam(pin, 9876) .request(application/json) .post(text(50.0), Money.class);版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。12客戶端客戶端 APIInvocationinvocation1 = client.target(http:/./atm/cardId/balance).request(“text/plain”).buildGet();In

8、vocationinvocation2 = client.target(http:/./atm/cardId/withdraw) .request(application/json) .buildPost(text(50.0);版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。13客戶端客戶端 APICollection invocations =Arrays.asList(inv1, inv2);Collection responses = Collections.transform(invocations, new F() public Responseapply(Invo

9、cationinvocation) return invocation.invoke(); );版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。14客戶端客戶端 API/ Create client and register MyProvider1Client client = ClientBuilder.newClient();client.register(MyProvider1.class);/ Create atm target; inherits MyProvider1WebTargetatm = client.target(http:/./atm);/ Regis

10、ter MyProvider2atm.register(MyProvider2.class);/ Create balance target; inherits MyProvider1, MyProvider2WebTarget balance = atm.path(”cardId/balance);/ Register MyProvider3balance.register(MyProvider3.class);版權(quán)所有 2012,Oracle 和/或其分支機(jī)構(gòu)。保留所有權(quán)利。插入幻燈片 13 中的保護(hù)政策分類等級(jí)15JAX RS 2.0通用配置通用配置版權(quán)所有 2012,Oracle 和/

11、或其關(guān)聯(lián)公司。保留所有權(quán)利。16通用配置通用配置 動(dòng)機(jī)動(dòng)機(jī)客戶端客戶端客戶端 .register(JsonMessageBodyReader.class) .register(JsonMessageBodyWriter.class) .register(JsonpInterceptor.class) .property(“”, “callback”) .property(“jsonp.callback.queryParam”, “true”) .版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。17通用配置通用配置 動(dòng)機(jī)動(dòng)機(jī)服務(wù)器端publ

12、ic class MyApp extends javax.ws.rs.core.Application public SetClass getClasses() SetClass classes = new HashSet(); . classes.add(JsonMessageBodyReader.class); classes.add(JsonMessageBodyWriter.class); classes.add(JsonpInterceptor.class); . return classes; 版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。18通用配置通用配置

13、解決方案解決方案客戶端客戶端客戶端 .register(JsonMessageBodyReader.class) .register(JsonMessageBodyWriter.class) .register(JsonpInterceptor.class) .property(“”, “callback”) .property(“jsonp.callback.queryParam”, “true”) .JsonFeaturejf= new JsonFeature().enableCallbackQueryParam();client.register(j

14、f);版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。19通用配置通用配置 解決方案解決方案服務(wù)器端public SetClassgetClasses() .classes.add(JsonMessageBodyReader.class);classes.add(JsonMessageBodyWriter.class);classes.add(JsonpInterceptor.class); .public SetClassgetClasses() .classes.add(JsonFeature.class); .版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有

15、權(quán)利。20通用配置通用配置public interface Configurable Configuration getConfiguration(); Configurable property(String name, Object value); Configurable register(.);public interface Configuration Set getClasses(); Map getContracts(Class componentClass); Set getInstances(); Map getProperties(); Object getProperty

16、(String name); Collection getPropertyNames(); boolean isEnabled(Feature feature); boolean isRegistered(Object component); .版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。21通用配置通用配置public interface Feature boolean configure(FeatureContext context);版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。22Feature 示例示例public void JsonFeat

17、ure implements Feature public boolean configure(FeatureContext context) context.register(JsonMessageBodyReader.class) .register(JsonMessageBodyWriter.class) .register(JsonpInterceptor.class) .property(CALLBACK_NAME, calbackName) .property(USE_QUERY_PARAM, useQueryParam); return true; 版權(quán)所有 2012,Oracl

18、e 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。23動(dòng)態(tài)動(dòng)態(tài) Feature僅服務(wù)器端public interface DynamicFeature void configure(ResourceInfo ri, FeatureContext context);public interface ResourceInfo Method getResourceMethod(); Class getResourceClass();版權(quán)所有 2012,Oracle 和/或其分支機(jī)構(gòu)。保留所有權(quán)利。插入幻燈片 13 中的保護(hù)政策分類等級(jí)24JAX RS 2.0異步處理異步處理版權(quán)所有 2012,Oracle 和/或

19、其關(guān)聯(lián)公司。保留所有權(quán)利。25異步處理異步處理服務(wù)器 API分流 I/O 容器線程高效的異步事件處理利用 Servlet 3.x 異步支持(如果可用)客戶端 API異步的請(qǐng)求調(diào)用 API版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。26異步處理異步處理StatelessPath(/async/longRunning)public class MyResource GET Asynchronous public void longRunningOp(SuspendedAsyncResponse ar) ar.setTimeoutHandler(new MyTimoutHand

20、ler(); ar.setTimeout(15, SECONDS); final String result = executeLongRunningOperation(); ar.resume(result); 版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。27異步處理:服務(wù)器端異步處理:服務(wù)器端public interface AsyncResponse public void resume(Object/Throwable response); public void cancel(); public void cancel(int/Date retryAfter);

21、 public boolean isSuspended(); public boolean isCancelled(); public boolean isDone(); public void setTimeout(long time, TimeUnit unit); public void setTimeoutHandler(TimeoutHandler handler); public CollectionClass register(Class callback); public MapClass,CollectionClass register(Class callback, Cla

22、ss. callbacks); public CollectionClass register(Object callback); public MapClass,CollectionClass register(Object callback, Object. callbacks);版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。28異步處理:服務(wù)器端異步處理:服務(wù)器端Target(ElementType.PARAMETER)Retention(RetentionPolicy.RUNTIME)Documentedpublic interface Suspended publ

23、ic interface TimeoutHandler void handleTimeout(AsyncResponse asyncResponse);版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。29異步處理:服務(wù)器端異步處理:服務(wù)器端public interface CompletionCallback public void onComplete(Throwable throwable);public interface ConnectionCallback public void onDisconnect(AsyncResponse disconnected);版權(quán)

24、所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。30異步處理:客戶端異步處理:客戶端WebTarget target = client.target(http:/./balance”)/ Start async call and register callbackFuture handle = target.request().async().get( new InvocationCallback() void complete(String balance) void failed(InvocationException e) );/ After waiting for too

25、 longif (!handle.isDone() handle.cancel(true);版權(quán)所有 2012,Oracle 和/或其分支機(jī)構(gòu)。保留所有權(quán)利。插入幻燈片 13 中的保護(hù)政策分類等級(jí)31JAX RS 2.0過濾器過濾器/攔截器攔截器版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。32過濾器和攔截器過濾器和攔截器定制 JAX-RS 請(qǐng)求/響應(yīng)處理用例:日志記錄、壓縮、安全性,等等針對(duì)客戶端和服務(wù)器 API 而引入替換現(xiàn)有的專用支持動(dòng)機(jī)版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。33過濾器過濾器和攔截器和攔截器非包裝過濾器鏈過濾器不直接調(diào)用鏈中

26、的下一個(gè)過濾器由 JAX-RS 運(yùn)行時(shí)管理每個(gè)過濾器決定是繼續(xù)還是中斷鏈過濾每個(gè)傳入/傳出消息請(qǐng)求 請(qǐng)求ContainerRequestFilter, ClientRequestFilter響應(yīng) 響應(yīng)ContainerResponseFilter, ClientResponseFilter服務(wù)器端特性PreMatching、DynamicFeature版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。34過濾器過濾器和攔截器和攔截器日志記錄過濾器示例public class RequestLoggingFilter implements ContainerRequestFilt

27、er Override public void filter(ContainerRequestContext requestContext) log(requestContext); / non-wrapping = returns without invoking the next filter .版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。35過濾器和過濾器和攔截器攔截器只有當(dāng)發(fā)生實(shí)體處理時(shí)才會(huì)調(diào)用性能提升包裝攔截器鏈每個(gè)攔截器都通過 ceed() 調(diào)用鏈中的下一個(gè)攔截器攔截實(shí)體提供者M(jìn)essageBodyReader 攔截器ReaderInte

28、rceptor接口MessageBodyWriter 攔截器WriterInterceptor接口版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。36過濾器和過濾器和攔截器攔截器Gzip 讀取器攔截器示例public class GzipInterceptor implements ReaderInterceptor Override Object aroundReadFrom(ReaderInterceptorContext ctx) InputStream old = ctx.getInputStream(); ctx.setInputStream(new GZIPInp

29、utStream(old);/ wrapping = invokes the next interceptorObject entity = ceed(); ctx.setInputStream(old); return entity; 版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。37過濾器過濾器和和攔截器攔截器應(yīng)用程序請(qǐng)求過濾過濾器器過濾過濾器器網(wǎng)絡(luò)傳輸響應(yīng)過濾過濾器器過濾過濾器器寫入器寫入器攔截器攔截器MBWMBR寫入器寫入器攔截器攔截器讀取器讀取器攔截器攔截器讀取器讀取器攔截器攔截器版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。38

30、過濾器過濾器和和攔截器攔截器響應(yīng)應(yīng)用程序過濾過濾器器過濾過濾器器網(wǎng)絡(luò)響應(yīng)過濾過濾器器過濾過濾器器MBW寫入器寫入器攔截器攔截器寫入器寫入器攔截器攔截器過濾過濾器器過濾過濾器器請(qǐng)求請(qǐng)求讀取器讀取器攔截器攔截器MBR讀取器讀取器攔截器攔截器過濾過濾器器過濾過濾器器資源匹配PreMatching版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。39綁定和優(yōu)先級(jí)綁定和優(yōu)先級(jí)綁定將過濾器和攔截器與資源方法相關(guān)聯(lián)服務(wù)器端概念優(yōu)先級(jí)聲明在執(zhí)行鏈中的相對(duì)位置Priority(int priority)過濾器和攔截器共有的概念有作用域的綁定全局綁定靜態(tài)NameBinding默認(rèn)PreMatchi

31、ng動(dòng)態(tài)DynamicFeature無版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。40綁定綁定NameBindingTarget(ElementType.TYPE, ElementType.METHOD)Retention(value = RetentionPolicy.RUNTIME)public interface Logged ProviderLoggedPriority(USER)public class LoggingFilter implements ContainerRequestFilter, ContainerResponseFilter 版權(quán)所有 20

32、12,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。41綁定綁定Path(/greet/name)Produces(text/plain)public class MyResourceClass Logged GET public String hello(PathParam(name) String name) return Hello + name; 版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。42DynamicFeature 示例示例僅服務(wù)器端public void SecurityFeature implements DynamicFeature public b

33、oolean configure(ResourceInfo ri, FeatureContext context) String roles = getRolesAllowed(ri); if (roles != null) context.register(new RolesAllowedFilter(roles); .版權(quán)所有 2012,Oracle 和/或其分支機(jī)構(gòu)。保留所有權(quán)利。插入幻燈片 13 中的保護(hù)政策分類等級(jí)43JAX RS 2.0超媒體支持超媒體支持版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。44超媒體支持超媒體支持REST 原則標(biāo)識(shí)符和鏈接HATEOA

34、S(超媒體作為應(yīng)用程序狀態(tài)的引擎)鏈接類型:結(jié)構(gòu)性鏈接過渡性鏈接版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。45超媒體支持超媒體支持Link:; rel=ship,; rel=cancel .http:/./customers/11http:/./customers/11/address/1http:/./products/1112 . 版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。46超媒體超媒體Link 和 LinkBuilder 類RFC 5988:Web 鏈接支持 ResponseBuilder 和過濾器中的鏈接過渡性鏈接(標(biāo)頭)支持手動(dòng)結(jié)構(gòu)性

35、鏈接通過 Link.JaxbAdapter 和 Link.JaxbLink從客戶端 API 中的鏈接創(chuàng)建資源目標(biāo)版權(quán)所有 2012,Oracle 和/或其關(guān)聯(lián)公司。保留所有權(quán)利。47超媒體超媒體/ Producer API (server-side)Link self= Link.fromMethod(MyResource.class, ”handleGet”).build();Link update= Link.fromMethod(MyResource.class, “handlePost”).rel(”update”).build();.Response res = Response.ok(order).link(http:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論