久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Restlet 學(xué)習(xí)筆記

 開(kāi)心豆豆2010 2015-01-07

摘要:網(wǎng)絡(luò)上對(duì) restlet 的評(píng)判褒貶不一,,有的說(shuō)框架封裝的很好,,很有彈性,,有的說(shuō) rest 架構(gòu)風(fēng)格本身是一種簡(jiǎn)單的風(fēng)格,,restlet 過(guò)設(shè)計(jì)以使編程過(guò)于復(fù)雜,,其實(shí)我倒不覺(jué)得 restlet 有什么復(fù)雜,,相反很簡(jiǎn)潔明了,,不論他的類(lèi)結(jié)構(gòu)還是整個(gè)體系結(jié)構(gòu),個(gè)人很喜歡,,昨天晚上匆匆看看他的文檔和實(shí)例,,很不錯(cuò)!文章例子代碼,!
正文:

1. Rest簡(jiǎn)介(摘抄自網(wǎng)絡(luò),,講的很到位)

Restlet是一個(gè)Java下的輕量級(jí)REST框架,。通過(guò)擁抱REST(REST是一種Web架構(gòu)風(fēng)格)它模糊了Web站點(diǎn)和Web服務(wù)之間的界限,從而幫助開(kāi)發(fā)人員構(gòu)建Web應(yīng)用,。每一個(gè)主要的REST概念(REST concept)都有一個(gè)對(duì)應(yīng)的Java類(lèi),。你的REST化的Web設(shè)計(jì)和你的代碼之間的映射是非常簡(jiǎn)單直接的。為什么有必要?jiǎng)?chuàng)建另一種框架,?難道Servlet API還不夠好用嗎,?Servlet AIP在1998年發(fā)布,從那個(gè)時(shí)候起它的核心設(shè)計(jì)一直沒(méi)有很大的變化,。它是Java EE的眾多API中最成功的一個(gè),,但是它的幾個(gè)設(shè)計(jì)缺陷和一些限制損害了它。舉個(gè)例子,,URI模式和它的處理者(handler)之間的映射是受限制的,,而且其配置都集中在一個(gè)配置文件中。還有,,它把socket流的控制直接交給了應(yīng)用系統(tǒng)開(kāi)發(fā)人員,,Servlet容器阻礙了我們充分使用NIO特性對(duì)IO操作進(jìn)行優(yōu)化。另一個(gè)主要問(wèn)題就是Servlet API鼓勵(lì)應(yīng)用開(kāi)發(fā)者在應(yīng)用或者用戶(hù)會(huì)話級(jí)別直接將session狀態(tài)保存于內(nèi)存中,,盡管這看上去不錯(cuò),,但它造成了Servlet容器擴(kuò)展性和高可用性的主要問(wèn)題。為了克服這些問(wèn)題,,就必須實(shí)現(xiàn)復(fù)雜的負(fù)載均衡,、session復(fù)制、持久化機(jī)制,。這導(dǎo)致了可擴(kuò)展性必然成為災(zāi)難,。

如何看待別的框架中對(duì)REST的支持(例如Axis2,或者CXF/XFire),?

這些支持非常有效,,但是作用非常有限。我的主要觀點(diǎn)是設(shè)計(jì)這些項(xiàng)目是為了符合WS-*/SOAP Stack,,它們與REST世界并不非常契合,。在REST世界里,,定義了一個(gè)全新的范例:面向資源的設(shè)計(jì),,而非通過(guò)遠(yuǎn)程方法調(diào)用這樣的范例。例如Axis2僅僅支持GET和POST兩種HTTP方法,,它需要遠(yuǎn)程方法的傳遞需要一個(gè)URI參數(shù),。這在REST中式不允許的,這種做法也不能被稱(chēng)之為REST化,。XFire1.2不支持REST,,但是它發(fā)布了一個(gè)項(xiàng)目用于將POJO映射到REST化的Web服務(wù),。這有點(diǎn)類(lèi)似最近發(fā)布的JSR-311,此JSR試圖基于一套annotation和助手類(lèi)標(biāo)準(zhǔn)化這種映射,。


REST與HTTP協(xié)議

REST軟件架構(gòu)是由Roy Thomas Fielding博士在2000年首次提出的,。他為我們描繪了開(kāi)發(fā)基于互聯(lián)網(wǎng)的網(wǎng)絡(luò)軟件的藍(lán)圖。REST軟件架構(gòu)是一個(gè)抽象的概念,,是一種為了實(shí)現(xiàn)這一互聯(lián)網(wǎng)的超媒體分布式系統(tǒng)的行動(dòng)指南,。利用任何的技術(shù)都可以實(shí)現(xiàn)這種理念。而實(shí)現(xiàn)這一軟件架構(gòu)最著名的就是HTTP協(xié)議,。通常我們把REST也寫(xiě)作為REST/HTTP,,在實(shí)際中往往把REST理解為基于HTTP的REST軟件架構(gòu),或者更進(jìn)一步把REST和HTTP看作為等同的概念,。今天,,HTTP是互聯(lián)網(wǎng)上應(yīng)用最廣泛的計(jì)算機(jī)協(xié)議。HTTP不是一個(gè)簡(jiǎn)單的運(yùn)載數(shù)據(jù)的協(xié)議,,而是一個(gè)具有豐富內(nèi)涵的網(wǎng)絡(luò)軟件的協(xié)議,。它不僅僅能夠?qū)τ诨ヂ?lián)網(wǎng)資源進(jìn)行唯一定位,而且還能告訴我們對(duì)于該資源進(jìn)行怎樣運(yùn)作,。這也是REST軟件架構(gòu)當(dāng)中最重要的兩個(gè)理念,。而REST軟件架構(gòu)理念是真正理解HTTP協(xié)議而形成的。有了REST軟件架構(gòu)理念出現(xiàn),,才使得軟件業(yè)避免了對(duì)HTTP協(xié)議的片面理解,。只有正確的理論指導(dǎo),才能避免在軟件開(kāi)發(fā)的實(shí)際工作過(guò)程中少走彎路,。

REST與URI(資源定位)
REST軟件架構(gòu)之所以是一個(gè)超媒體系統(tǒng),,是因?yàn)樗梢园丫W(wǎng)絡(luò)上所有資源進(jìn)行唯一的定位,不管你的文件是圖片,、文件Word還是視頻文件,,也不管你的文件是txt文件格式、xml文件格式還是其它文本文件格式,。它利用支持HTTP的TCP/IP協(xié)議來(lái)確定互聯(lián)網(wǎng)上的資源,。

REST與CRUD原則
REST軟件架構(gòu)遵循了CRUD原則,該原則告訴我們對(duì)于資源(包括網(wǎng)絡(luò)資源)只需要四種行為:創(chuàng)建(Create),、獲?。≧ead)、更新(Update)和銷(xiāo)毀(DELETE)就可以完成對(duì)其操作和處理了,。其實(shí)世界萬(wàn)物都是遵循這一規(guī)律:生,、變、見(jiàn)、滅,。所以計(jì)算機(jī)世界也不例外,。這個(gè)原則是源自于我們對(duì)于數(shù)據(jù)庫(kù)表的數(shù)據(jù)操作:insert(生)、select(見(jiàn)),、update(變)和delete(滅),,所以有時(shí)候CRUD也寫(xiě)作為RUDI,其中的I就是insert,。這四個(gè)操作是一種原子操作,,即一種無(wú)法再分的操作,通過(guò)它們可以構(gòu)造復(fù)雜的操作過(guò)程,,正如數(shù)學(xué)上四則運(yùn)算是數(shù)字的最基本的運(yùn)算一樣,。

REST與網(wǎng)絡(luò)服務(wù)
盡管在Java語(yǔ)言世界中網(wǎng)絡(luò)服務(wù)目前是以SOAP技術(shù)為主,但是REST將是是網(wǎng)絡(luò)服務(wù)的另一選擇,,并且是真正意義上的網(wǎng)絡(luò)服務(wù),。基于REST思想的網(wǎng)絡(luò)服務(wù)不久的將來(lái)也會(huì)成為是網(wǎng)絡(luò)服務(wù)的主流技術(shù),。REST不僅僅把HTTP作為自己的數(shù)據(jù)運(yùn)輸協(xié)議,,而且也作為直接進(jìn)行數(shù)據(jù)處理的工具。而當(dāng)前的網(wǎng)絡(luò)服務(wù)技術(shù)都需要使用其它手段來(lái)完成數(shù)據(jù)處理工作,,它們完全獨(dú)立于HTTP協(xié)議來(lái)進(jìn)行的,,這樣增加了大量的復(fù)雜軟件架構(gòu)設(shè)計(jì)工作。REST的思想充分利用了現(xiàn)有的HTTP技術(shù)的網(wǎng)絡(luò)能力,。在德國(guó)電視臺(tái)上曾經(jīng)出現(xiàn)過(guò)一個(gè)這樣的五十萬(wàn)歐元智力題:如何實(shí)現(xiàn)網(wǎng)絡(luò)服務(wù)才能充分利用現(xiàn)有的HTTP協(xié)議,?該問(wèn)題給出了四個(gè)答案:去問(wèn)微軟;WSDL2.0/SOAP1.2,;WS-Transfer,;根本沒(méi)有。這個(gè)問(wèn)題告訴我們HTTP并不是一個(gè)簡(jiǎn)單的數(shù)據(jù)傳來(lái)傳去的協(xié)議,,而是一個(gè)聰明的會(huì)表現(xiàn)自己的協(xié)議,,這也許是REST = Representational State Transfer的真正含義。實(shí)際上目前很多大公司已經(jīng)采用了REST技術(shù)作為網(wǎng)絡(luò)服務(wù),,如Google,、Amazon等。在Java語(yǔ)言中重要的兩個(gè)以SOAP技術(shù)開(kāi)始的網(wǎng)絡(luò)服務(wù)框架XFire和Axis也把REST作為自己的另一種選擇,。它們的新的項(xiàng)目分別是Apache CXF和Axis2,。Java語(yǔ)言也制定關(guān)于REST網(wǎng)絡(luò)服務(wù)規(guī)范:JAX-RS: Java API for RESTful Web Services (JSR 311)。相信還會(huì)出現(xiàn)更多與REST相關(guān)的激動(dòng)人心的信息,。

REST與AJAX技術(shù)
盡管AJAX技術(shù)的出現(xiàn)才不到兩年時(shí)間,,但是AJAX技術(shù)遵循了REST的一些重要原則。AJAX技術(shù)充分利用了HTTP來(lái)獲取網(wǎng)絡(luò)資源并且實(shí)現(xiàn)了HTTP沒(méi)有的對(duì)于異步數(shù)據(jù)進(jìn)行傳輸?shù)墓δ?。AJAX技術(shù)還使得軟件更好地實(shí)現(xiàn)分布性功能,,在一個(gè)企業(yè)內(nèi)只要一個(gè)人下載了AJAX引擎,其它企業(yè)內(nèi)部的人員,,就可以共享該資源了,。AJAX技術(shù)遵守REST準(zhǔn)則的應(yīng)用程序中簡(jiǎn)單和可伸縮的架構(gòu),凡是采用AJAX技術(shù)的頁(yè)面簡(jiǎn)潔而又豐富,,一個(gè)頁(yè)面表現(xiàn)了豐富多彩的形態(tài),。AJAX技術(shù)還使用了一種不同于XML格式的JSON文件格式,這個(gè)意義在哪里呢,?在REST軟件架構(gòu)下我們不能對(duì)于XML文件進(jìn)行序列化處理,,這樣程序員必須要使用自己的XML綁定框架。而以序列化的JavaScript對(duì)象為基礎(chǔ)的JSON已經(jīng)獲得了廣泛認(rèn)可,,它被認(rèn)為能以遠(yuǎn)比XML更好的方式來(lái)序列化和傳輸簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu),,而且它更簡(jiǎn)潔。這對(duì)REST是一個(gè)極大貢獻(xiàn)和補(bǔ)充,。當(dāng)前的網(wǎng)絡(luò)應(yīng)用軟件還違背了REST的"無(wú)狀態(tài)服務(wù)器"約束,。REST服務(wù)器只知道自己的狀態(tài),。REST不關(guān)心客戶(hù)端的狀態(tài),,客戶(hù)端的狀態(tài)自己來(lái)管理,這是AJAX技術(shù)的應(yīng)用之地,。通過(guò)AJAX技術(shù),,可以發(fā)揮有狀態(tài)網(wǎng)絡(luò)客戶(hù)機(jī)的優(yōu)勢(shì),。而REST的服務(wù)器關(guān)心的是從所有網(wǎng)絡(luò)客戶(hù)端發(fā)送到服務(wù)器操作的順序。這樣使得互聯(lián)網(wǎng)這樣一個(gè)巨大的網(wǎng)絡(luò)得到有序的管理,。

REST與Rails框架
Ruby on Rails框架(簡(jiǎn)稱(chēng)Rails或者Rails框架)是一個(gè)基于Ruby語(yǔ)言的越來(lái)越流行的網(wǎng)絡(luò)應(yīng)用軟件開(kāi)發(fā)框架,。它提供了關(guān)于REST最好的支持,也是當(dāng)今應(yīng)用REST最成功的一個(gè)軟件開(kāi)發(fā)框架,。Rails框架(從版本1.2.x起)成為了第一個(gè)引入REST作為核心思想的主流網(wǎng)絡(luò)軟件開(kāi)發(fā)框架,。在Rails框架的充分利用了REST軟件架構(gòu)之后,人們更加堅(jiān)信REST的重要性和必要性,。Rails利用REST軟件架構(gòu)思想對(duì)網(wǎng)絡(luò)服務(wù)也提供了一流的支持,。從最直觀的角度看待REST,它是網(wǎng)絡(luò)服務(wù)最理想的手段,,但是Rails框架把REST帶到了網(wǎng)絡(luò)應(yīng)用軟件開(kāi)發(fā)框架,。這是一次飛躍,讓REST的思想從網(wǎng)絡(luò)服務(wù)的應(yīng)用提升到了網(wǎng)絡(luò)應(yīng)用軟件開(kāi)發(fā),。利用REST思想的simply_restful插件已經(jīng)成為了Rails框架的核心內(nèi)容,。

REST安全性
我們把現(xiàn)有基于SOAP的網(wǎng)絡(luò)服務(wù)和基于REST/HTTP網(wǎng)絡(luò)服務(wù)作個(gè)比喻,前者是一種傳統(tǒng)的寄信方式,而后者是現(xiàn)代網(wǎng)絡(luò)的電子郵件方式,。要是是寄信和電子郵件都有病毒存在的話,,傳統(tǒng)的寄信被送到對(duì)方就很危險(xiǎn),而電子郵件是開(kāi)發(fā)的,,電子郵件供應(yīng)商比如Google為我們檢查了電子郵件是否有病毒,。這里并不是說(shuō)明SOAP網(wǎng)絡(luò)服務(wù)消息包含義病毒,而是說(shuō)明HTTP是無(wú)法處理SOAP信息包究竟好不好,,需要額外的軟件工具解決這一問(wèn)題,,包括防火墻也用不上和管不了。
REST/HTTP網(wǎng)絡(luò)服務(wù)的信息包可以被防火墻理解和控制,。你可以按照操作和鏈接進(jìn)行過(guò)濾信息包,,如你可以規(guī)定從外部來(lái)的只能讀取(GET操作)自己服務(wù)器的資源,。這樣對(duì)于系統(tǒng)管理員而言使得軟件管理更為簡(jiǎn)單,。REST的安全性還可以利用傳輸安全協(xié)議SSL/TLS、基本和摘要式認(rèn)證(Basic und Digest Authentication),。除了這些REST自身的安全性功能外,,還可以利用像基于信息的Web Services Security(JSR 155)作為REST不錯(cuò)的補(bǔ)充。

2. Restlet 類(lèi)結(jié)構(gòu)

Restlet hierarchy

Uniform 是一個(gè) Abstract 類(lèi),,定義了和 HTTPMethod 對(duì)應(yīng)的方法如 get,post,delete,put 等等,。子類(lèi) Restlet 應(yīng)該是這個(gè)框架的核心類(lèi)了,restlet 有些像 servlet API,,可以得到 application和 context 兩個(gè)對(duì)象,,其子類(lèi)分別為鏈接器,應(yīng)用,,路由器,,查找器,組件和過(guò)濾器,。在看他的表述類(lèi)結(jié)構(gòu)

3. 脫離 web server 的 restlet

其實(shí)說(shuō)脫離,,只是 restlet 自己做了端口監(jiān)聽(tīng)和 http 協(xié)議解析和封裝的功能,restlet 設(shè)計(jì)是以資源設(shè)計(jì)為中心的,,有些像 struts,,webwork之 MVC 風(fēng)格但又不同,他完全符合 rest 體系架構(gòu)風(fēng)格,,可以很好的和現(xiàn)有的領(lǐng)域模型結(jié)合,,一個(gè)簡(jiǎn)單的分層結(jié)構(gòu)如圖 資源層是對(duì)需要顯示的領(lǐng)域模型做了顯示封裝,對(duì)表示層提供資源,,而對(duì)領(lǐng)域?qū)又行枰志没哪P徒柚?orm 映射器持久化,。個(gè)人覺(jué)得 restlet 的應(yīng)用核心在于服務(wù),,像 Axis2和XFire 等都有支持 rest 風(fēng)格,restlet結(jié)合 json 應(yīng)該是個(gè)比較好的實(shí)踐,。

且看下面簡(jiǎn)單的代碼(代碼為官方文檔里的例子):

對(duì) Resource 封裝一下 BaseResource 以方便應(yīng)用程序使用:

 1package org.blogjava.restlet;
 2

 3import
 java.util.Map;
 4

 5import
 org.restlet.Context; 
 6import
 org.restlet.data.Request; 
 7import
 org.restlet.data.Response; 
 8import
 org.restlet.resource.Resource; 
 9import
 org.restlet.Application;
10

11
/** 
12
* Base resource class that supports common behaviours or attributes shared by 
13
* all resources. 
14

15*/
 
16public abstract class BaseResource extends Resource 
{
17

18public BaseResource(Context context, Request request, Response response) 

19super
(context, request, response); 
20}

21
22
/** 
23
* Returns the map of items managed by this application. 
24

25@return
 the map of items managed by this application. 
26*/
 
27protected Map<String, Item> getItems() 

28return
 ((FirstResourceApplication) getContext().getAttributes().get( 
29
Application.KEY)).getItems(); 
30}
 
31}

32
33


實(shí)現(xiàn) Application 類(lèi),,定義路由(URI ->Resource 的映射)

 

 1package org.blogjava.restlet;
 2

 3import
 java.util.Map; 
 4import
 java.util.concurrent.ConcurrentHashMap;
 5

 6import
 org.restlet.Application; 
 7import
 org.restlet.Context; 
 8import
 org.restlet.Restlet; 
 9import
 org.restlet.Router;
10

11public class FirstResourceApplication extends Application 
{
12

13/** The list of items is persisted in memory. */
 
14private final Map<String, Item>
 items;
15

16public FirstResourceApplication(Context parentContext) 

17super
(parentContext); 
18// We make sure that this attribute will support concurrent access. 

19items = new ConcurrentHashMap<String, Item>(); 
20}

21
22
/** 
23
* Creates a root Restlet that will receive all incoming calls. 
24*/
 
25
@Override 
26public synchronized Restlet createRoot() 

27// Create a router Restlet that defines routes. 

28Router router = new Router(getContext());
29

30// Defines a route for the resource "list of items" 

31router.attach("/items", ItemsResource.class); 
32// Defines a route for the resource "item" 

33router.attach("/items/{itemName}", ItemResource.class);
34

35return
 router; 
36}

37
38
/** 
39
* Returns the list of registered items. 
40

41@return
 the list of registered items. 
42*/
 
43public Map<String, Item> getItems() 

44return
 items; 
45}
 
46}
 
47


資源類(lèi)實(shí)現(xiàn):

 

  1public class ItemResource extends BaseResource {
  2

  3/** The underlying Item object. */
 
  4
Item item;
  5

  6/** The sequence of characters that identifies the resource. */
 
  7
String itemName;
  8

  9public ItemResource(Context context, Request request, Response response) 

 10super
(context, request, response);
 11

 12//
 Get the "itemName" attribute value taken from the URI template 
 13// /items/{itemName}. 

 14this.itemName = (String) getRequest().getAttributes().get("itemName");
 15

 16// Get the item directly from the "persistence layer". 

 17this.item = getItems().get(itemName);
 18

 19if (this.item != null

 20// Define the supported variant. 

 21getVariants().add(new Variant(MediaType.TEXT_XML)); 
 22}
 
 23}

 24
 25
/** 
 26
* This resource supports DELETE requests. 
 27*/
 
 28
@Override 
 29public boolean allowDelete() 

 30return true

 31}

 32
 33
/** 
 34
* This resource supports PUT requests. 
 35*/
 
 36
@Override 
 37public boolean allowPut() 

 38return true

 39}

 40
 41
/** 
 42
* Handle DELETE requests. 
 43*/
 
 44
@Override 
 45public void delete() 

 46if (item != null

 47// Remove the item from the list. 

 48getItems().remove(item.getName()); 
 49}

 50
 51// Tells the client that the request has been successfully fulfilled. 

 52getResponse().setStatus(Status.SUCCESS_NO_CONTENT); 
 53}

 54
 55
@Override 
 56public Representation getRepresentation(Variant variant) 
{
 57

 58if (MediaType.TEXT_XML.equals(variant.getMediaType())) 

 59// Generate the XML representation of this resource. 

 60try 
 61// Generate a DOM document representing the item. 

 62DomRepresentation representation = new DomRepresentation( 
 63
MediaType.TEXT_XML); 
 64Document d =
 representation.getDocument();
 65

 66Element eltItem = d.createElement("item"
); 
 67
d.appendChild(eltItem); 
 68Element eltName = d.createElement("name"
); 
 69
eltName.appendChild(d.createTextNode(item.getName())); 
 70
eltItem.appendChild(eltName);
 71

 72Element eltDescription = d.createElement("description"
); 
 73
eltDescription.appendChild(d.createTextNode(item 
 74
.getDescription())); 
 75
eltItem.appendChild(eltDescription);
 76

 77
d.normalizeDocument();
 78

 79// Returns the XML representation of this document. 

 80return representation; 
 81}
 catch (IOException e) 
 82
e.printStackTrace(); 
 83}
 
 84}

 85
 86return null

 87}

 88
 89
/** 
 90
* Handle PUT requests. 
 91*/
 
 92
@Override 
 93public void put(Representation entity) 

 94// Tells if the item is to be created of not. 

 95boolean creation = (item == null);
 96

 97// The PUT request updates or creates the resource. 

 98if (item == null
 99item = new
 Item(itemName); 
100}

101
102// Update the description. 

103Form form = new Form(entity); 
104item.setDescription(form.getFirstValue("description"
));
105

106// Update the item in the list. 

107getItems().put(item.getName(), item);
108

109if (creation) 

110
getResponse().setStatus(Status.SUCCESS_CREATED); 
111}
 else 
112
getResponse().setStatus(Status.SUCCESS_OK); 
113}
 
114}

115
116}
 
117

118

客戶(hù)端和服務(wù)器類(lèi),服務(wù)器類(lèi)代替 web server 做監(jiān)聽(tīng)和 Http 協(xié)議處理,。

 

  1package org.blogjava.restlet;
  2

  3import
 java.io.IOException;
  4

  5import
 org.restlet.Client; 
  6import
 org.restlet.data.Form; 
  7import
 org.restlet.data.Protocol; 
  8import
 org.restlet.data.Reference; 
  9import
 org.restlet.data.Response; 
 10import
 org.restlet.resource.Representation;
 11

 12public class FirstResourceClientMain 
{
 13

 14public static void main(String[] args) throws IOException 

 15// Define our Restlet HTTP client. 

 16Client client = new Client(Protocol.HTTP);
 17

 18// The URI of the resource "list of items". 

 19Reference itemsUri = new Reference( 
 20"http://localhost:8182/firstResource/items"
);
 21

 22// Create a new item 

 23Item item = new Item("item1""this is an item."); 
 24Reference itemUri =
 createItem(item, client, itemsUri); 
 25if (itemUri != null

 26// Prints the representation of the newly created resource. 

 27get(client, itemUri); 
 28}

 29
 30// Prints the list of registered items. 

 31get(client, itemsUri);
 32

 33// Update the item 

 34item.setDescription("This is an other description"); 
 35
updateItem(item, client, itemUri);
 36

 37// Prints the list of registered items. 

 38get(client, itemsUri);
 39

 40// delete the item 

 41deleteItem(client, itemUri);
 42

 43// Print the list of registered items. 

 44get(client, itemsUri); 
 45}

 46
 47
/** 
 48
* Try to create a new item. 
 49

 50@param
 item 
 51
* the new item. 
 52@param
 client 
 53
* the Restlet HTTP client. 
 54@param
 itemsUri 
 55
* where to POST the data. 
 56@return
 the Reference of the new resource if the creation succeeds, null 
 57
* otherwise. 
 58*/
 
 59public static
 Reference createItem(Item item, Client client, 
 60Reference itemsUri) 

 61// Gathering informations into a Web form. 

 62Form form = new Form(); 
 63form.add("name"
, item.getName()); 
 64form.add("description"
, item.getDescription()); 
 65Representation rep =
 form.getWebRepresentation();
 66

 67// Launch the request 

 68Response response = client.post(itemsUri, rep); 
 69if (response.getStatus().isSuccess()) 

 70if (response.isEntityAvailable()) 

 71try 

 72// Always consume the response's entity, if available. 

 73response.getEntity().write(System.out); 
 74}
 catch (IOException e) 
 75
e.printStackTrace(); 
 76}
 
 77}

 78
 79return
 response.getEntity().getIdentifier(); 
 80}

 81
 82return null

 83}

 84
 85
/** 
 86
* Prints the resource's representation. 
 87

 88@param
 client 
 89
* client Restlet. 
 90@param
 reference 
 91
* the resource's URI 
 92@throws
 IOException 
 93*/
 
 94public static void
 get(Client client, Reference reference) 
 95throws IOException 

 96Response response =
 client.get(reference); 
 97if (response.getStatus().isSuccess()) 

 98if (response.isEntityAvailable()) 

 99
response.getEntity().write(System.out); 
100}
 
101}
 
102}

103
104
/** 
105
* Try to update an item. 
106

107@param
 item 
108
* the item. 
109@param
 client 
110
* the Restlet HTTP client. 
111@param
 itemUri 
112
* the resource's URI. 
113*/
 
114public static boolean updateItem(Item item, Client client, Reference itemUri) 

115// Gathering informations into a Web form. 

116Form form = new Form(); 
117form.add("name"
, item.getName()); 
118form.add("description"
, item.getDescription()); 
119Representation rep =
 form.getWebRepresentation();
120

121// Launch the request 

122Response response = client.put(itemUri, rep); 
123if (response.isEntityAvailable()) 

124try 

125// Always consume the response's entity, if available. 

126response.getEntity().write(System.out); 
127}
 catch (IOException e) 
128
e.printStackTrace(); 
129}
 
130}
 
131return
 response.getStatus().isSuccess(); 
132}

133
134
/** 
135
* Try to delete an item. 
136

137@param
 client 
138
* the Restlet HTTP client. 
139@param
 itemUri 
140
* the resource's URI. 
141*/
 
142public static boolean deleteItem(Client client, Reference itemUri) 

143// Launch the request 

144Response response = client.delete(itemUri); 
145if (response.isEntityAvailable()) 

146try 

147// Always consume the response's entity, if available. 

148response.getEntity().write(System.out); 
149}
 catch (IOException e) 
150
e.printStackTrace(); 
151}
 
152}

153
154return
 response.getStatus().isSuccess(); 
155}

156
157}
 
158package
 org.blogjava.restlet; 
159import
 org.restlet.Component; 
160import
 org.restlet.data.Protocol;
161

162public class FirstResourceServerMain 
{
163

164public static void main(String[] args) throws Exception 

165// Create a new Component. 

166Component component = new Component();
167

168// Add a new HTTP server listening on port 8182. 

169component.getServers().add(Protocol.HTTP, 8182);
170

171// Attach the sample application. 

172component.getDefaultHost().attach("/firstResource"
173new
 FirstResourceApplication(component.getContext()));
174

175// Start the component. 

176component.start(); 
177}

178
179}
 
180

181

 

4.和現(xiàn)有 servlet 容器結(jié)合的例子

配置 web.xml

 1<context-param> 
 2<param-name>org.restlet.application</param-name>
 
 3<param-value>
 
 4
org.blogjava.helloworld.FirstStepsApplication 
 5</param-value>
 
 6</context-param>
 
 7<!-- Restlet adapter -->
 
 8<servlet>
 
 9<servlet-name>RestletServlet</servlet-name>
 
10<servlet-class>
 
11
com.noelios.restlet.ext.servlet.ServerServlet 
12</servlet-class>
 
13</servlet>
 
14<!-- Catch all requests -->
 
15<servlet-mapping>
 
16<servlet-name>RestletServlet</servlet-name>
 
17<url-pattern>/*</url-pattern>
 
18</servlet-mapping>

19
20

實(shí)現(xiàn) Application 和 Resource 資源類(lèi)

 

 1
 2public class FirstStepsApplication extends Application {
 3

 4public FirstStepsApplication(Context parentContext) 

 5super
(parentContext); 
 6}

 7
 8
/** 
 9
* Creates a root Restlet that will receive all incoming calls. 
10*/
 
11
@Override 
12public synchronized Restlet createRoot() 

13//
 Create a router Restlet that routes each call to a 
14// new instance of HelloWorldResource. 

15Router router = new Router(getContext());
16

17// Defines only one route 

18router.attachDefault(HelloWorldResource.class);
19

20return
 router; 
21}
 
22}
 
23

24

25package
 org.blogjava.helloworld;
26

27import
 org.restlet.Context; 
28import
 org.restlet.data.MediaType; 
29import
 org.restlet.data.Request; 
30import
 org.restlet.data.Response; 
31import
 org.restlet.resource.Representation; 
32import
 org.restlet.resource.Resource; 
33import
 org.restlet.resource.StringRepresentation; 
34import
 org.restlet.resource.Variant;
35

36
/** 
37
* Resource which has only one representation. 
38

39*/
 
40public class HelloWorldResource extends Resource 
{
41

42public
 HelloWorldResource(Context context, Request request, 
43Response response) 

44super
(context, request, response);
45

46// This representation has only one type of representation. 

47getVariants().add(new Variant(MediaType.TEXT_PLAIN)); 
48}

49
50
/** 
51
* Returns a full representation for a given variant. 
52*/
 
53
@Override 
54public Representation getRepresentation(Variant variant) 

55Representation representation = new
 StringRepresentation( 
56"hello, world,just a simple example!"
, MediaType.TEXT_PLAIN); 
57return
 representation; 
58}
 
59}

60
61

參考資料

http://www./documentation/1.0/tutorial(官方手冊(cè))





本博客為學(xué)習(xí)交流用,,凡未注明引用的均為本人作品,,轉(zhuǎn)載請(qǐng)注明出處,,如有版權(quán)問(wèn)題請(qǐng)及時(shí)通知。由于博客時(shí)間倉(cāng)促,,錯(cuò)誤之處敬請(qǐng)諒解,,有任何意見(jiàn)可給我留言,愿共同學(xué)習(xí)進(jìn)步,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多