Restlet 学习笔记

1. Rest简介

Restlet是一个Java下的轻量级REST框架。通过拥抱REST(REST是一种Web架构风格)它模糊了Web站点和Web服务之间的界限,从而帮助开发人员构建Web应用。每一个主要的REST概念(REST concept)都有一个对应的Java类。你的REST化的Web设计和你的代码之间的映射是非常简单直接的。为什么有必要创建另一种框架?难道Servlet API还不够好用吗?Servlet AIP在1998年发布,从那个时候起它的核心设计一直没有很大的变化。它是Java EE的众多API中最成功的一个,但是它的几个设计缺陷和一些限制损害了它。举个例子,URI模式和它的处理者(handler)之间的映射是受限制的,而且其配置都集中在一个配置文件中。还有,它把socket流的控制直接交给了应用系统开发人员,Servlet容器阻碍了我们充分使用NIO特性对IO操作进行优化。另一个主要问题就是Servlet API鼓励应用开发者在应用或者用户会话级别直接将session状态保存于内存中,尽管这看上去不错,但它造成了Servlet容器扩展性和高可用性的主要问题。为了克服这些问题,就必须实现复杂的负载均衡、session复制、持久化机制。这导致了可扩展性必然成为灾难。

如何看待别的框架中对REST的支持(例如Axis2,或者CXF/XFire)?

这些支持非常有效,但是作用非常有限。我的主要观点是设计这些项目是为了符合WS-*/SOAP Stack,它们与REST世界并不非常契合。在REST世界里,定义了一个全新的范例:面向资源的设计,而非通过远程方法调用这样的范例。例如Axis2仅仅支持GET和POST两种HTTP方法,它需要远程方法的传递需要一个URI参数。这在REST中式不允许的,这种做法也不能被称之为REST化。XFire1.2不支持REST,但是它发布了一个项目用于将POJO映射到REST化的Web服务。这有点类似最近发布的JSR-311,此JSR试图基于一套annotation和助手类标准化这种映射。

REST与HTTP协议

REST软件架构是由Roy Thomas Fielding博士在2000年首次提出的。他为我们描绘了开发基于互联网的网络软件的蓝图。REST软件架构是一个抽象的概念,是一种为了实现这一互联网的超媒体分布式系统的行动指南。利用任何的技术都可以实现这种理念。而实现这一软件架构最著名的就是HTTP协议。通常我们把REST也写作为REST/HTTP,在实际中往往把REST理解为基于HTTP的REST软件架构,或者更进一步把REST和HTTP看作为等同的概念。今天,HTTP是互联网上应用最广泛的计算机协议。HTTP不是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软件的协议。它不仅仅能够对于互联网资源进行唯一定位,而且还能告诉我们对于该资源进行怎样运作。这也是REST软件架构当中最重要的两个理念。而REST软件架构理念是真正理解HTTP协议而形成的。有了REST软件架构理念出现,才使得软件业避免了对HTTP协议的片面理解。只有正确的理论指导,才能避免在软件开发的实际工作过程中少走弯路。

REST与URI(资源定位) 
REST软件架构之所以是一个超媒体系统,是因为它可以把网络上所有资源进行唯一的定位,不管你的文件是图片、文件Word还是视频文件,也不管你的文件是txt文件格式、xml文件格式还是其它文本文件格式。它利用支持HTTP的TCP/IP协议来确定互联网上的资源。

REST与CRUD原则 
REST软件架构遵循了CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建(Create)、获取(Read)、更新(Update)和销毁(DELETE)就可以完成对其操作和处理了。其实世界万物都是遵循这一规律:生、变、见、灭。所以计算机世界也不例外。这个原则是源自于我们对于数据库表的数据操作:insert(生)、select(见)、update(变)和delete(灭),所以有时候CRUD也写作为RUDI,其中的I就是insert。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。 
REST与网络服务 
尽管在Java语言世界中网络服务目前是以SOAP技术为主,但是REST将是是网络服务的另一选择,并且是真正意义上的网络服务。基于REST思想的网络服务不久的将来也会成为是网络服务的主流技术。REST不仅仅把HTTP作为自己的数据运输协议,而且也作为直接进行数据处理的工具。而当前的网络服务技术都需要使用其它手段来完成数据处理工作,它们完全独立于HTTP协议来进行的,这样增加了大量的复杂软件架构设计工作。REST的思想充分利用了现有的HTTP技术的网络能力。在德国电视台上曾经出现过一个这样的五十万欧元智力题:如何实现网络服务才能充分利用现有的HTTP协议?该问题给出了四个答案:去问微软;WSDL2.0/SOAP1.2;WS-Transfer;根本没有。这个问题告诉我们HTTP并不是一个简单的数据传来传去的协议,而是一个聪明的会表现自己的协议,这也许是REST = Representational State Transfer的真正含义。实际上目前很多大公司已经采用了REST技术作为网络服务,如Google、Amazon等。在Java语言中重要的两个以SOAP技术开始的网络服务框架XFire和Axis也把REST作为自己的另一种选择。它们的新的项目分别是Apache CXF和Axis2。Java语言也制定关于REST网络服务规范:JAX-RS: Java API for RESTful Web Services (JSR 311)。相信还会出现更多与REST相关的激动人心的信息。

REST与AJAX技术 
尽管AJAX技术的出现才不到两年时间,但是AJAX技术遵循了REST的一些重要原则。AJAX技术充分利用了HTTP来获取网络资源并且实现了HTTP没有的对于异步数据进行传输的功能。AJAX技术还使得软件更好地实现分布性功能,在一个企业内只要一个人下载了AJAX引擎,其它企业内部的人员,就可以共享该资源了。AJAX技术遵守REST准则的应用程序中简单和可伸缩的架构,凡是采用AJAX技术的页面简洁而又丰富,一个页面表现了丰富多彩的形态。AJAX技术还使用了一种不同于XML格式的JSON文件格式,这个意义在哪里呢?在REST软件架构下我们不能对于XML文件进行序列化处理,这样程序员必须要使用自己的XML绑定框架。而以序列化的JavaScript对象为基础的JSON已经获得了广泛认可,它被认为能以远比XML更好的方式来序列化和传输简单数据结构,而且它更简洁。这对REST是一个极大贡献和补充。当前的网络应用软件还违背了REST的"无状态服务器"约束。REST服务器只知道自己的状态。REST不关心客户端的状态,客户端的状态自己来管理,这是AJAX技术的应用之地。通过AJAX技术,可以发挥有状态网络客户机的优势。而REST的服务器关心的是从所有网络客户端发送到服务器操作的顺序。这样使得互联网这样一个巨大的网络得到有序的管理。

REST与Rails框架 
Ruby on Rails框架(简称Rails或者Rails框架)是一个基于Ruby语言的越来越流行的网络应用软件开发框架。它提供了关于REST最好的支持,也是当今应用REST最成功的一个软件开发框架。Rails框架(从版本1.2.x起)成为了第一个引入REST作为核心思想的主流网络软件开发框架。在Rails框架的充分利用了REST软件架构之后,人们更加坚信REST的重要性和必要性。Rails利用REST软件架构思想对网络服务也提供了一流的支持。从最直观的角度看待REST,它是网络服务最理想的手段,但是Rails框架把REST带到了网络应用软件开发框架。这是一次飞跃,让REST的思想从网络服务的应用提升到了网络应用软件开发。利用REST思想的simply_restful插件已经成为了Rails框架的核心内容。

REST安全性 
我们把现有基于SOAP的网络服务和基于REST/HTTP网络服务作个比喻,前者是一种传统的寄信方式,而后者是现代网络的电子邮件方式。要是是寄信和电子邮件都有病毒存在的话,传统的寄信被送到对方就很危险,而电子邮件是开发的,电子邮件供应商比如Google为我们检查了电子邮件是否有病毒。这里并不是说明SOAP网络服务消息包含义病毒,而是说明HTTP是无法处理SOAP信息包究竟好不好,需要额外的软件工具解决这一问题,包括防火墙也用不上和管不了。 
REST/HTTP网络服务的信息包可以被防火墙理解和控制。你可以按照操作和链接进行过滤信息包,如你可以规定从外部来的只能读取(GET操作)自己服务器的资源。这样对于系统管理员而言使得软件管理更为简单。REST的安全性还可以利用传输安全协议SSL/TLS、基本和摘要式认证(Basic und Digest Authentication)。除了这些REST自身的安全性功能外,还可以利用像基于信息的Web Services Security(JSR 155)作为REST不错的补充。

2. Restlet 类结构

Restlet 学习笔记

Uniform 是一个 Abstract 类,定义了和 HTTPMethod 对应的方法如 get,post,delete,put 等等。子类 Restlet 应该是这个框架的核心类了,restlet 有些像 servlet API,可以得到 application和 context 两个对象,其子类分别为链接器,应用,路由器,查找器,组件和过滤器。在看他的表述类结构

3. 脱离 web server 的 restlet

其实说脱离,只是 restlet 自己做了端口监听和 http 协议解析和封装的功能,restlet 设计是以资源设计为中心的,有些像 struts,webwork之 MVC 风格但又不同,他完全符合 rest 体系架构风格,可以很好的和现有的领域模型结合,一个简单的分层结构如图 资源层是对需要显示的领域模型做了显示封装,对表示层提供资源,而对领域层中需要持久化的模型借助 orm 映射器持久化。

Restlet 学习笔记

个人觉得 restlet 的应用核心在于服务,像 Axis2和XFire 等都有支持 rest 风格,restlet结合 json 应该是个比较好的实践。

且看下面简单的代码(代码为官方文档里的例子):

对 Resource 封装一下 BaseResource 以方便应用程序使用:

 1Restlet 学习笔记package org.blogjava.restlet;
 2
Restlet 学习笔记
 3Restlet 学习笔记import
 java.util.Map;
 4
Restlet 学习笔记
 5Restlet 学习笔记import
 org.restlet.Context; 
 6Restlet 学习笔记import
 org.restlet.data.Request; 
 7Restlet 学习笔记import
 org.restlet.data.Response; 
 8Restlet 学习笔记import
 org.restlet.resource.Resource; 
 9Restlet 学习笔记import
 org.restlet.Application;
10
Restlet 学习笔记
11Restlet 学习笔记
/** 
12
Restlet 学习笔记* Base resource class that supports common behaviours or attributes shared by 
13
Restlet 学习笔记* all resources. 
14
Restlet 学习笔记
15Restlet 学习笔记*/
 
16Restlet 学习笔记public abstract class BaseResource extends Resource 
{
17
Restlet 学习笔记
18Restlet 学习笔记public BaseResource(Context context, Request request, Response response) 

19Restlet 学习笔记super
(context, request, response); 
20Restlet 学习笔记}

21Restlet 学习笔记
22Restlet 学习笔记
/** 
23
Restlet 学习笔记* Returns the map of items managed by this application. 
24
Restlet 学习笔记
25Restlet 学习笔记@return
 the map of items managed by this application. 
26Restlet 学习笔记*/
 
27Restlet 学习笔记protected Map<String, Item> getItems() 

28Restlet 学习笔记return
 ((FirstResourceApplication) getContext().getAttributes().get( 
29
Restlet 学习笔记Application.KEY)).getItems(); 
30Restlet 学习笔记}
 
31Restlet 学习笔记}

32Restlet 学习笔记
33

实现 Application 类,定义路由(URI ->Resource 的映射)

 1Restlet 学习笔记package org.blogjava.restlet;
 2
Restlet 学习笔记
 3Restlet 学习笔记import
 java.util.Map; 
 4Restlet 学习笔记import
 java.util.concurrent.ConcurrentHashMap;
 5
Restlet 学习笔记
 6Restlet 学习笔记import
 org.restlet.Application; 
 7Restlet 学习笔记import
 org.restlet.Context; 
 8Restlet 学习笔记import
 org.restlet.Restlet; 
 9Restlet 学习笔记import
 org.restlet.Router;
10
Restlet 学习笔记
11Restlet 学习笔记public class FirstResourceApplication extends Application 
{
12
Restlet 学习笔记
13Restlet 学习笔记/** The list of items is persisted in memory. */
 
14Restlet 学习笔记private final Map<String, Item>
 items;
15
Restlet 学习笔记
16Restlet 学习笔记public FirstResourceApplication(Context parentContext) 

17Restlet 学习笔记super
(parentContext); 
18Restlet 学习笔记// We make sure that this attribute will support concurrent access. 

19Restlet 学习笔记items = new ConcurrentHashMap<String, Item>(); 
20Restlet 学习笔记}

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

27Restlet 学习笔记// Create a router Restlet that defines routes. 

28Restlet 学习笔记Router router = new Router(getContext());
29
Restlet 学习笔记
30Restlet 学习笔记// Defines a route for the resource "list of items" 

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

33Restlet 学习笔记router.attach("/items/{itemName}", ItemResource.class);
34
Restlet 学习笔记
35Restlet 学习笔记return
 router; 
36Restlet 学习笔记}

37Restlet 学习笔记
38Restlet 学习笔记
/** 
39
Restlet 学习笔记* Returns the list of registered items. 
40
Restlet 学习笔记
41Restlet 学习笔记@return
 the list of registered items. 
42Restlet 学习笔记*/
 
43Restlet 学习笔记public Map<String, Item> getItems() 

44Restlet 学习笔记return
 items; 
45Restlet 学习笔记}
 
46Restlet 学习笔记}
 
47Restlet 学习笔记

资源类实现:

  1Restlet 学习笔记public class ItemResource extends BaseResource {
  2
Restlet 学习笔记
  3Restlet 学习笔记/** The underlying Item object. */
 
  4
Restlet 学习笔记Item item;
  5
Restlet 学习笔记
  6Restlet 学习笔记/** The sequence of characters that identifies the resource. */
 
  7
Restlet 学习笔记String itemName;
  8
Restlet 学习笔记
  9Restlet 学习笔记public ItemResource(Context context, Request request, Response response) 

 10Restlet 学习笔记super
(context, request, response);
 11
Restlet 学习笔记
 12Restlet 学习笔记//
 Get the "itemName" attribute value taken from the URI template 
 13Restlet 学习笔记// /items/{itemName}. 

 14Restlet 学习笔记this.itemName = (String) getRequest().getAttributes().get("itemName");
 15
Restlet 学习笔记
 16Restlet 学习笔记// Get the item directly from the "persistence layer". 

 17Restlet 学习笔记this.item = getItems().get(itemName);
 18
Restlet 学习笔记
 19Restlet 学习笔记if (this.item != null

 20Restlet 学习笔记// Define the supported variant. 

 21Restlet 学习笔记getVariants().add(new Variant(MediaType.TEXT_XML)); 
 22Restlet 学习笔记}
 
 23Restlet 学习笔记}

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

 30Restlet 学习笔记return true

 31Restlet 学习笔记}

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

 38Restlet 学习笔记return true

 39Restlet 学习笔记}

 40Restlet 学习笔记
 41Restlet 学习笔记
/** 
 42
Restlet 学习笔记* Handle DELETE requests. 
 43Restlet 学习笔记*/
 
 44
Restlet 学习笔记@Override 
 45Restlet 学习笔记public void delete() 

 46Restlet 学习笔记if (item != null

 47Restlet 学习笔记// Remove the item from the list. 

 48Restlet 学习笔记getItems().remove(item.getName()); 
 49Restlet 学习笔记}

 50Restlet 学习笔记
 51Restlet 学习笔记// Tells the client that the request has been successfully fulfilled. 

 52Restlet 学习笔记getResponse().setStatus(Status.SUCCESS_NO_CONTENT); 
 53Restlet 学习笔记}

 54Restlet 学习笔记
 55
Restlet 学习笔记@Override 
 56Restlet 学习笔记public Representation getRepresentation(Variant variant) 
{
 57
Restlet 学习笔记
 58Restlet 学习笔记if (MediaType.TEXT_XML.equals(variant.getMediaType())) 

 59Restlet 学习笔记// Generate the XML representation of this resource. 

 60Restlet 学习笔记try 
 61Restlet 学习笔记// Generate a DOM document representing the item. 

 62Restlet 学习笔记DomRepresentation representation = new DomRepresentation( 
 63
Restlet 学习笔记MediaType.TEXT_XML); 
 64Restlet 学习笔记Document d =
 representation.getDocument();
 65
Restlet 学习笔记
 66Restlet 学习笔记Element eltItem = d.createElement("item"
); 
 67
Restlet 学习笔记d.appendChild(eltItem); 
 68Restlet 学习笔记Element eltName = d.createElement("name"
); 
 69
Restlet 学习笔记eltName.appendChild(d.createTextNode(item.getName())); 
 70
Restlet 学习笔记eltItem.appendChild(eltName);
 71
Restlet 学习笔记
 72Restlet 学习笔记Element eltDescription = d.createElement("description"
); 
 73
Restlet 学习笔记eltDescription.appendChild(d.createTextNode(item 
 74
Restlet 学习笔记.getDescription())); 
 75
Restlet 学习笔记eltItem.appendChild(eltDescription);
 76
Restlet 学习笔记
 77
Restlet 学习笔记d.normalizeDocument();
 78
Restlet 学习笔记
 79Restlet 学习笔记// Returns the XML representation of this document. 

 80Restlet 学习笔记return representation; 
 81Restlet 学习笔记}
 catch (IOException e) 
 82
Restlet 学习笔记e.printStackTrace(); 
 83Restlet 学习笔记}
 
 84Restlet 学习笔记}

 85Restlet 学习笔记
 86Restlet 学习笔记return null

 87Restlet 学习笔记}

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

 94Restlet 学习笔记// Tells if the item is to be created of not. 

 95Restlet 学习笔记boolean creation = (item == null);
 96
Restlet 学习笔记
 97Restlet 学习笔记// The PUT request updates or creates the resource. 

 98Restlet 学习笔记if (item == null
 99Restlet 学习笔记item = new
 Item(itemName); 
100Restlet 学习笔记}

101Restlet 学习笔记
102Restlet 学习笔记// Update the description. 

103Restlet 学习笔记Form form = new Form(entity); 
104Restlet 学习笔记item.setDescription(form.getFirstValue("description"
));
105
Restlet 学习笔记
106Restlet 学习笔记// Update the item in the list. 

107Restlet 学习笔记getItems().put(item.getName(), item);
108
Restlet 学习笔记
109Restlet 学习笔记if (creation) 

110
Restlet 学习笔记getResponse().setStatus(Status.SUCCESS_CREATED); 
111Restlet 学习笔记}
 else 
112
Restlet 学习笔记getResponse().setStatus(Status.SUCCESS_OK); 
113Restlet 学习笔记}
 
114Restlet 学习笔记}

115Restlet 学习笔记
116Restlet 学习笔记}
 
117
Restlet 学习笔记
118Restlet 学习笔记

客户端和服务器类,服务器类代替 web server 做监听和 Http 协议处理。

  1Restlet 学习笔记package org.blogjava.restlet;
  2
Restlet 学习笔记
  3Restlet 学习笔记import
 java.io.IOException;
  4
Restlet 学习笔记
  5Restlet 学习笔记import
 org.restlet.Client; 
  6Restlet 学习笔记import
 org.restlet.data.Form; 
  7Restlet 学习笔记import
 org.restlet.data.Protocol; 
  8Restlet 学习笔记import
 org.restlet.data.Reference; 
  9Restlet 学习笔记import
 org.restlet.data.Response; 
 10Restlet 学习笔记import
 org.restlet.resource.Representation;
 11
Restlet 学习笔记
 12Restlet 学习笔记public class FirstResourceClientMain 
{
 13
Restlet 学习笔记
 14Restlet 学习笔记public static void main(String[] args) throws IOException 

 15Restlet 学习笔记// Define our Restlet HTTP client. 

 16Restlet 学习笔记Client client = new Client(Protocol.HTTP);
 17
Restlet 学习笔记
 18Restlet 学习笔记// The URI of the resource "list of items". 

 19Restlet 学习笔记Reference itemsUri = new Reference( 
 20Restlet 学习笔记"http://localhost:8182/firstResource/items"
);
 21
Restlet 学习笔记
 22Restlet 学习笔记// Create a new item 

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

 26Restlet 学习笔记// Prints the representation of the newly created resource. 

 27Restlet 学习笔记get(client, itemUri); 
 28Restlet 学习笔记}

 29Restlet 学习笔记
 30Restlet 学习笔记// Prints the list of registered items. 

 31Restlet 学习笔记get(client, itemsUri);
 32
Restlet 学习笔记
 33Restlet 学习笔记// Update the item 

 34Restlet 学习笔记item.setDescription("This is an other description"); 
 35
Restlet 学习笔记updateItem(item, client, itemUri);
 36
Restlet 学习笔记
 37Restlet 学习笔记// Prints the list of registered items. 

 38Restlet 学习笔记get(client, itemsUri);
 39
Restlet 学习笔记
 40Restlet 学习笔记// delete the item 

 41Restlet 学习笔记deleteItem(client, itemUri);
 42
Restlet 学习笔记
 43Restlet 学习笔记// Print the list of registered items. 

 44Restlet 学习笔记get(client, itemsUri); 
 45Restlet 学习笔记}

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

 61Restlet 学习笔记// Gathering informations into a Web form. 

 62Restlet 学习笔记Form form = new Form(); 
 63Restlet 学习笔记form.add("name"
, item.getName()); 
 64Restlet 学习笔记form.add("description"
, item.getDescription()); 
 65Restlet 学习笔记Representation rep =
 form.getWebRepresentation();
 66
Restlet 学习笔记
 67Restlet 学习笔记// Launch the request 

 68Restlet 学习笔记Response response = client.post(itemsUri, rep); 
 69Restlet 学习笔记if (response.getStatus().isSuccess()) 

 70Restlet 学习笔记if (response.isEntityAvailable()) 

 71Restlet 学习笔记try 

 72Restlet 学习笔记// Always consume the response's entity, if available. 

 73Restlet 学习笔记response.getEntity().write(System.out); 
 74Restlet 学习笔记}
 catch (IOException e) 
 75
Restlet 学习笔记e.printStackTrace(); 
 76Restlet 学习笔记}
 
 77Restlet 学习笔记}

 78Restlet 学习笔记
 79Restlet 学习笔记return
 response.getEntity().getIdentifier(); 
 80Restlet 学习笔记}

 81Restlet 学习笔记
 82Restlet 学习笔记return null

 83Restlet 学习笔记}

 84Restlet 学习笔记
 85Restlet 学习笔记
/** 
 86
Restlet 学习笔记* Prints the resource's representation. 
 87
Restlet 学习笔记
 88Restlet 学习笔记@param
 client 
 89
Restlet 学习笔记* client Restlet. 
 90Restlet 学习笔记@param
 reference 
 91
Restlet 学习笔记* the resource's URI 
 92Restlet 学习笔记@throws
 IOException 
 93Restlet 学习笔记*/
 
 94Restlet 学习笔记public static void
 get(Client client, Reference reference) 
 95Restlet 学习笔记throws IOException 

 96Restlet 学习笔记Response response =
 client.get(reference); 
 97Restlet 学习笔记if (response.getStatus().isSuccess()) 

 98Restlet 学习笔记if (response.isEntityAvailable()) 

 99
Restlet 学习笔记response.getEntity().write(System.out); 
100Restlet 学习笔记}
 
101Restlet 学习笔记}
 
102Restlet 学习笔记}

103Restlet 学习笔记
104Restlet 学习笔记
/** 
105
Restlet 学习笔记* Try to update an item. 
106
Restlet 学习笔记
107Restlet 学习笔记@param
 item 
108
Restlet 学习笔记* the item. 
109Restlet 学习笔记@param
 client 
110
Restlet 学习笔记* the Restlet HTTP client. 
111Restlet 学习笔记@param
 itemUri 
112
Restlet 学习笔记* the resource's URI. 
113Restlet 学习笔记*/
 
114Restlet 学习笔记public static boolean updateItem(Item item, Client client, Reference itemUri) 

115Restlet 学习笔记// Gathering informations into a Web form. 

116Restlet 学习笔记Form form = new Form(); 
117Restlet 学习笔记form.add("name"
, item.getName()); 
118Restlet 学习笔记form.add("description"
, item.getDescription()); 
119Restlet 学习笔记Representation rep =
 form.getWebRepresentation();
120
Restlet 学习笔记
121Restlet 学习笔记// Launch the request 

122Restlet 学习笔记Response response = client.put(itemUri, rep); 
123Restlet 学习笔记if (response.isEntityAvailable()) 

124Restlet 学习笔记try 

125Restlet 学习笔记// Always consume the response's entity, if available. 

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

133Restlet 学习笔记
134Restlet 学习笔记
/** 
135
Restlet 学习笔记* Try to delete an item. 
136
Restlet 学习笔记
137Restlet 学习笔记@param
 client 
138
Restlet 学习笔记* the Restlet HTTP client. 
139Restlet 学习笔记@param
 itemUri 
140
Restlet 学习笔记* the resource's URI. 
141Restlet 学习笔记*/
 
142Restlet 学习笔记public static boolean deleteItem(Client client, Reference itemUri) 

143Restlet 学习笔记// Launch the request 

144Restlet 学习笔记Response response = client.delete(itemUri); 
145Restlet 学习笔记if (response.isEntityAvailable()) 

146Restlet 学习笔记try 

147Restlet 学习笔记// Always consume the response's entity, if available. 

148Restlet 学习笔记response.getEntity().write(System.out); 
149Restlet 学习笔记}
 catch (IOException e) 
150
Restlet 学习笔记e.printStackTrace(); 
151Restlet 学习笔记}
 
152Restlet 学习笔记}

153Restlet 学习笔记
154Restlet 学习笔记return
 response.getStatus().isSuccess(); 
155Restlet 学习笔记}

156Restlet 学习笔记
157Restlet 学习笔记}
 
158Restlet 学习笔记package
 org.blogjava.restlet; 
159Restlet 学习笔记import
 org.restlet.Component; 
160Restlet 学习笔记import
 org.restlet.data.Protocol;
161
Restlet 学习笔记
162Restlet 学习笔记public class FirstResourceServerMain 
{
163
Restlet 学习笔记
164Restlet 学习笔记public static void main(String[] args) throws Exception 

165Restlet 学习笔记// Create a new Component. 

166Restlet 学习笔记Component component = new Component();
167
Restlet 学习笔记
168Restlet 学习笔记// Add a new HTTP server listening on port 8182. 

169Restlet 学习笔记component.getServers().add(Protocol.HTTP, 8182);
170
Restlet 学习笔记
171Restlet 学习笔记// Attach the sample application. 

172Restlet 学习笔记component.getDefaultHost().attach("/firstResource"
173Restlet 学习笔记new
 FirstResourceApplication(component.getContext()));
174
Restlet 学习笔记
175Restlet 学习笔记// Start the component. 

176Restlet 学习笔记component.start(); 
177Restlet 学习笔记}

178Restlet 学习笔记
179Restlet 学习笔记}
 
180
Restlet 学习笔记
181Restlet 学习笔记

4.和现有 servlet 容器结合的例子

配置 web.xml

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

19Restlet 学习笔记
20Restlet 学习笔记

实现 Application 和 Resource 资源类

 

 1Restlet 学习笔记
 2Restlet 学习笔记public class FirstStepsApplication extends Application {
 3
Restlet 学习笔记
 4Restlet 学习笔记public FirstStepsApplication(Context parentContext) 

 5Restlet 学习笔记super
(parentContext); 
 6Restlet 学习笔记}

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

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

15Restlet 学习笔记Router router = new Router(getContext());
16
Restlet 学习笔记
17Restlet 学习笔记// Defines only one route 

18Restlet 学习笔记router.attachDefault(HelloWorldResource.class);
19
Restlet 学习笔记
20Restlet 学习笔记return
 router; 
21Restlet 学习笔记}
 
22Restlet 学习笔记}
 
23
Restlet 学习笔记
24
Restlet 学习笔记
25Restlet 学习笔记package
 org.blogjava.helloworld;
26
Restlet 学习笔记
27Restlet 学习笔记import
 org.restlet.Context; 
28Restlet 学习笔记import
 org.restlet.data.MediaType; 
29Restlet 学习笔记import
 org.restlet.data.Request; 
30Restlet 学习笔记import
 org.restlet.data.Response; 
31Restlet 学习笔记import
 org.restlet.resource.Representation; 
32Restlet 学习笔记import
 org.restlet.resource.Resource; 
33Restlet 学习笔记import
 org.restlet.resource.StringRepresentation; 
34Restlet 学习笔记import
 org.restlet.resource.Variant;
35
Restlet 学习笔记
36Restlet 学习笔记
/** 
37
Restlet 学习笔记* Resource which has only one representation. 
38
Restlet 学习笔记
39Restlet 学习笔记*/
 
40Restlet 学习笔记public class HelloWorldResource extends Resource 
{
41
Restlet 学习笔记
42Restlet 学习笔记public
 HelloWorldResource(Context context, Request request, 
43Restlet 学习笔记Response response) 

44Restlet 学习笔记super
(context, request, response);
45
Restlet 学习笔记
46Restlet 学习笔记// This representation has only one type of representation. 

47Restlet 学习笔记getVariants().add(new Variant(MediaType.TEXT_PLAIN)); 
48Restlet 学习笔记}

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

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

60Restlet 学习笔记
61Restlet 学习笔记


本文转自BlogJava 新浪blog的博客,原文链接:Restlet 学习笔记,如需转载请自行联系原博主。