- 浏览: 253679 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
fjdingsd:
目前基于REST的Java框架不包括Jersey吗
Hello REST!!! -
qq690388648:
不错,说的很好!
Restlet实战(十四)如何在Restlet得到Servlet request和Session -
zhuanbiandejijie:
唉... 你09年就接触Restlet了.15年我才开始看Re ...
Hello REST!!! -
zmjiao:
client.options( 这个是那个包下面的? rest ...
Restlet实战(十八)Restlet如何产生WADL -
shihezichen:
对于最近很多人都在讨论的, 使用REST时就不应该掺杂事务的看 ...
Restlet实战(二十六)事务 (Transaction)
在Restlet实战(二)我给出的例子中,把Order和Customer两个资源attach到Order Application上,看如下代码:
public class OrderApplication extends Application { @Override public synchronized Restlet createRoot() { Router router = new Router(getContext()); router.attach("/order/{orderId}/{subOrderId}", OrderResource.class); router.attach("/customer/{custId}", CustomerResource.class); return router; } }
这显而易见不是一个好的应用,从关注点来看,Order Resource应该attach到Order Application,那么对应Customer Resource应该有一个Customer Application与之对应。
ok,基于这样的思路,我们从OrderApplication删除如下代码:
router.attach("/customer/{custId}", CustomerResource.class);
另外我们创建一个CustomerApplication,并包含上述代码:
public class CustomerApplication extends Application{ @Override public synchronized Restlet createRoot() { Router router = new Router(getContext()); router.attach("/customers/{custId}", CustomerResource.class); return router; } }
有了CustomerApplication,那么如何设置才能生效呢?根据之前的配制,很容易想到的是在web.xml中把CustomerApplication配制进去,事实上是不行的,看看ServerServlet类里面这段代码:
private static final String APPLICATION_KEY = "org.restlet.application"; protected Application createApplication(Context parentContext) { Application application = null; final String applicationClassName = getInitParameter(APPLICATION_KEY, null);
这段代码是根据参数名org.restlet.application来获得配制在web.xml中application,而之前我们已经配制了OrderApplication,所以,我们不能再把CustomerApplication配制的参数名设置为org.restlet.application。那么在ServerServlet加载application的时候,就加载不到。
那么怎么作能让这两个Application生效呢?答案是Component,实际上,从上一篇文章中的图可以看出,一个Component可以设置多个Virtual Host,而一个Virtual Host能attach多个Application。
至于使用Component的做法有两种,一种是在web.xml中配制一个名字为“org.restlet.component”的context参数,例如:
<context-param> <param-name>org.restlet.component</param-name> <param-value>com.mycompany.MyComponent</param-value> </context-param>
另外一种是,WEB-INF/下存在restlet.xml,可以在这个xml文件里定义包含application和connector的Commponent。
下面就第二种方式来解决上面出现的问题,首先在WEB-INF/下建立一个名为restlet.xml,这个名字不能改变成别的名字,为啥呢?仍然看一下ServerServlet里面的一段代码:
protected Component createComponent() { Component component = null; // Look for the Component XML configuration file. Client client = createWarClient(new Context(), getServletConfig()); Response response = client.get("war:///WEB-INF/restlet.xml");
既然不让改,不改好了,在restlet.xml里面放入配制Component的代码:
<?xml version="1.0"?> <component xmlns="http://www.restlet.org/schemas/1.1/Component" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.restlet.org/schemas/1.1/Component"> <!-- <client protocol="CLAP" /> <client protocol="FILE" /> <client protocols="HTTP HTTPS" /> <server protocols="HTTP HTTPS" port="8080"/> --> <defaultHost> <attach uriPattern="/customers/{custId}" targetClass="com.mycompany.restlet.application.CustomerApplication" /> <attach uriPattern="/orders/{orderId}/{subOrderId}" targetClass="com.mycompany.restlet.application.OrderApplication" /> <!-- <attach uriPattern="/efgh/{xyz}" targetDescriptor="clap://class/org/restlet/test/MyApplication.wadl" /> --> </defaultHost> </component>
看上面的配制文件,很清楚的我们能知道,如果在浏览器输入http://localhost:8080/restlet/customers/1,那么CustomerApplication这个类应该被访问到。
咦,好象有点不对,好像CustomerApplication里面在attach资源的时候,也指定了同样的URL(/customers/{custId}),那么是当前这两个URL定义的URL重复了?还是有别的含义?
我们可以这样理解,在restlet.xml中定义的URL附加到Context上,而在application里面定义的URL会附加到restlet.xml中定义的URL上。
例如,如果想通过http://localhost:8080/restlet/customers/1 来使用CustomerResource,则需要在CustomerApplication中有如下代码:
router.attach("", CustomerResource.class);
而如果想通过http://localhost:8080/restlet/customers/1/orders/2 来使用CustomerResource,则需要在CustomerApplication中定义如下代码:
router.attach("/orders/{orderId}", CustomerResource.class);
Ok,让我们测试一下,首先修改
CustomerApplication.java
public class CustomerApplication extends Application{ @Override public synchronized Restlet createRoot() { Router router = new Router(getContext()); //router.attach("", CustomerResource.class); router.attach("/orders/{orderId}", CustomerResource.class); return router; } }
CustomerResource.java
public class CustomerResource extends Resource { String customerId; String orderId; public CustomerResource(Context context, Request request, Response response) { super(context, request, response); customerId = (String) request.getAttributes().get("custId"); orderId = (String) request.getAttributes().get("orderId"); // This representation has only one type of representation. getVariants().add(new Variant(MediaType.TEXT_PLAIN)); } @Override public Representation getRepresentation(Variant variant) { Representation representation = new StringRepresentation( "The customer which id is " + customerId + " has the order which id : " + orderId, MediaType.TEXT_PLAIN); return representation; } }
输入http://localhost:8080/restlet/customers/1/orders/2,结果如下:
The customer which id is 1 has the order which id : 2
请注意,上面CustomerApplicaiton被注释的一行代码
router.attach("", CustomerResource.class);
如果反注释这行代码,则所有基于http://localhost:8080/restlet/customers/1/****(除了/customers/{custId}/orders/{orderId} )的访问都会路由到同一个资源(CustomerResource),换句话说,如果我访问一个我没有定义的URL,如/customers/{customerId}/orders,则也会被路由到CustomerResource,这是不对的。。所以,应慎用之。
总结,现在我们可以分别用不同的Application来管理不同的资源了,并采用restlet.xml这种方式来定义包含applicaiton和connector的component.
评论
查了一下,原因是版本不对,偶的版本太低,到官网下了1.1.9,就没问题了。
但是,别用2.0以上的,偶知道2.0改变挺多,许多类都不见了。
我现在用的是restlet.2.0.3版本
老是无法加载restlet.xml配置的component!
web.xml内容:
<!-- Restlet adapter -->
<servlet>
<servlet-name>RestletServlet</servlet-name>
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.autoWire</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<!-- Catch all requests -->
<servlet-mapping>
<servlet-name>RestletServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
web-inf/restlet.xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<component xmlns="http://www.restlet.org/schemas/2.0/Component"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.restlet.org/schemas/2.0/Component">
<defaultHost>
<attach uriPattern="/hello/" targetClass="com.odmenus.web.core.HelloWorldApplication" />
<attach uriPattern="/menu/" targetClass="com.odmenus.web.core.MenuManageApplication" />
</defaultHost>
</component>
我访问:http://localhost:9000/odmenu/ws/hello 老是报404错误! 正常应该返回hello world!
帮忙分析下~~ 多谢!
找到错误了,web.xml应该改一下:
<servlet> <servlet-name>RestletServlet</servlet-name> <servlet-class>com.noelios.restlet.ext.servlet.ServerServlet </servlet-class> <init-param> <param-name>org.restlet.component</param-name> <param-value>component</param-value> </init-param> </servlet>
但是我访问http://localhost:8080/restlet/orders/1/2 怎么会出现404错误呢?还有http://localhost:8080/restlet/customers/1
发表评论
-
Restlet实战(三十)(完结篇)运行流程之源代码分析(续)
2009-08-24 14:25 4163前面一篇文章分析了servlet里init方法,包括init方 ... -
Restlet实战(二十九)(完结篇)运行流程之源代码分析
2009-08-20 17:32 5313终于到了完结篇,也体 ... -
Restlet实战(二十八)源代码分析之压缩 (Compression)
2009-08-10 15:36 3267上篇文章我给出了如何 ... -
Restlet实战(二十七)压缩 (Compression)
2009-08-05 12:09 7206在进入代码部分之前,还是贴出<<RESTful W ... -
Restlet实战(二十六)事务 (Transaction)
2009-08-02 23:29 5397<<Restful Web Service> ... -
Restlet实战(二十五)缓存 (Cache)
2009-07-31 22:18 3994说明:以下部分文字说明摘自<<Restful We ... -
Restlet实战(二十四)获取参数值(续)
2009-07-31 14:44 10427这个系列之前已经有一篇文章写如何获取参数值,看Restlet实 ... -
欢迎加入Restlet圈子
2009-07-28 22:28 2822如果你进来是因为想看Restlet相关的文章,那么欢迎你加入r ... -
Restlet实战(二十三)实现条件GET (Conditional Get)
2009-07-28 17:47 5048先普及一下什么是条件GET,以下摘自<<Restf ... -
Restlet实战(二十二)仿造PUT和DELETE
2009-07-28 13:17 7192在Restlet实战(七)-提交和处理Web Form 中提到 ... -
Restlet实战(二十一)如何保护确定的资源(续)
2009-07-16 16:18 4001在Restlet实战(十七)如何保护确定的资源 中我给出一个如 ... -
Restlet实战(二十)使用Restlet之SSL
2009-07-15 21:37 3341待写 -
Restlet实战(十九)使用Restlet实现Web Service
2009-07-15 21:34 4363先说明本篇文章要实现的功能,仍然做一些假设,当前系统是基于Re ... -
Restlet实战(十八)Restlet如何产生WADL
2009-07-11 21:57 9840现在究竟REST是否需要WADL这种东西,有很多争论,有人说不 ... -
Restlet实战(十七)如何保护确定的资源
2009-07-11 21:55 3434在面向资源的架构中, ... -
Restlet实战(十六)结合源代码分析及使用Filter
2009-07-11 21:13 5740其实在Web应用中Filter对大家来说一点都不陌生,比如说在 ... -
Restlet实战(十五)如何与表示层交互
2009-07-10 13:51 5376首先还是设定一个应用场景,看看用restlet如何实现。 ... -
Restlet实战(十四)如何在Restlet得到Servlet request和Session
2009-07-09 16:39 11525如果你现在已经有一个web系统,而为了一些需求,你集成了res ... -
Restlet实战(十三)如何在Servlet中呼叫Restlet
2009-07-09 14:47 4525看到这个题目,或许你会问,你之前的很多文章不都是与servle ... -
Restlet实战(十二)获取参数值
2009-07-07 15:06 6952本篇文章将讲解三种不 ...
相关推荐
本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...
本系列的开发实例将带你深入理解并掌握Restlet框架的使用,从基础的JAX-RS实现到高级的Component和Application结构,再到与Spring框架的整合。 首先,我们来看看"RESTLET开发实例(一)基于JAX-RS的REST服务.doc"。...
在本篇博文中,我们将深入探讨如何利用jQuery和Ajax技术与Restlet 2.0框架进行交互,实现对Restful资源的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,即CRUD操作。Restlet是一个开源的Java ...
3. **定义路由**:在Restlet应用中,你需要创建一个路由(Route)来映射URL到对应的资源。这可以通过创建一个Application类来完成。 ```java import org.restlet.Application; import org.restlet.Restlet; ...
### RESTLET开发(三):基于Spring的REST服务 #### 一、基于Spring配置的Rest简单服务 在本文档中,我们将深入探讨如何利用RESTlet框架与Spring框架结合,构建高效的RESTful服务。Spring框架因其强大的功能和灵活...
4. **路由(Route)**:Restlet使用`org.restlet.routing.Router`来映射不同的URI路径到相应的资源。这允许我们创建灵活的URL结构,每个路径都可以指向不同的处理逻辑。 5. **过滤器(Filter)**:过滤器允许在请求...
本示例将带你入门Restlet,帮助你理解如何使用它来创建简单的Web服务。 首先,让我们了解REST的基本概念。REST架构基于HTTP协议,通过HTTP方法(GET、POST、PUT、DELETE等)来操作资源。资源通常由URI(Uniform ...
此外,理解RESTful设计原则,如资源的URI定位、状态码的使用、无状态通信等,对于有效利用Restlet构建高质量的Web服务也是十分必要的。 总之,"Restlet所需要的所有jar包"的压缩包提供了开发RESTful服务的基础环境...
在Restlet框架中,"RestApplication"可能是一个实现了Restlet Application接口的类,负责初始化和管理REST服务的路由和行为。 总的来说,"restlet restful"项目是一个基于RESTlet框架的RESTful Web服务实现,提供了...
定义一个名为`StudentApplication`的应用类,该类继承自`javax.ws.rs.core.Application`,用于管理和注册资源。 5. **定义资源类** 实现一个具体的资源类`StudentResource`,该类需要继承自`javax.ws.rs.core....
在本示例中,我们将深入探讨如何使用Restlet框架来创建和使用RESTful服务。 首先,理解REST的基本原则至关重要。RESTful服务基于HTTP协议,使用HTTP方法(GET、POST、PUT、DELETE等)来操作资源。资源通过URI...
RESTlet是一款开源框架,专为构建基于REST(Representational ...通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业技能。
在《Restlet in Action》的第一章“Introducing the Restlet Framework”中,作者们详细解释了Restlet框架的核心概念,包括组件模型、资源模型以及如何使用这些模型来构建Web服务。此外,还介绍了一些高级特性,如...
`BaseApplication`类是自定义的Restlet应用程序,它使用`component.context`和`restRoute`。`restRoute`是一个Spring路由器,通过`attachments`映射将URL路径与处理资源的Spring Bean关联。 - **userContext.xml**...
1. **使用Maven进行配置**:如果您使用的是Maven作为构建工具,可以通过添加依赖项来轻松集成Restlet。 2. **使用Eclipse进行配置**:如果您使用的是Eclipse IDE,则可以通过导入项目模板或手动添加库文件来进行配置...
标题"基于Spring的Restlet实例"意味着我们将探讨如何在Spring环境中集成和使用Restlet库来开发REST服务。这通常涉及以下几个关键知识点: 1. **RESTful服务基础**:REST是一种软件架构风格,强调通过HTTP协议暴露...
在**第三部分 Further usage possibilities**中,作者探讨了Restlet在不同环境中的应用,如云部署、浏览器端和移动端的使用,以及如何与语义网结合。这一部分展示了Restlet的灵活性和广泛适用性,无论是在传统的Web...
Restlet是一个轻量级的Java Web服务开发框架,它提供了构建RESTful(Representational State Transfer)应用程序的工具和API。REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性...