`
ajax
  • 浏览: 253679 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Restlet实战(三)使用Component让不同的Application对应不同的资源

    博客分类:
  • REST
阅读更多

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.

16
0
分享到:
评论
6 楼 nalanjia 2011-02-06  
偶测试到这里也遇到问题了,因为要用到restlet.xml。

查了一下,原因是版本不对,偶的版本太低,到官网下了1.1.9,就没问题了。

但是,别用2.0以上的,偶知道2.0改变挺多,许多类都不见了。
5 楼 fengzhiyu_sh 2010-12-22  
请教问题:
我现在用的是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!
帮忙分析下~~  多谢!
4 楼 liyf155 2010-03-11  
liyf155 写道
为什么会出现404错误呢? web.xml里面的application我已经去掉了啊,restlet.xml里面设置端口号那段代码我去掉了注释,把端口号改成了8888,其它的不变,但是却出现了404错误


找到错误了,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
3 楼 liyf155 2010-03-11  
为什么会出现404错误呢? web.xml里面的application我已经去掉了啊,restlet.xml里面设置端口号那段代码我去掉了注释,把端口号改成了8888,其它的不变,但是却出现了404错误
2 楼 ajax 2009-07-03  
web.xml中去掉阿application 和Component的定义就可以了,其它的跟之前一样就行。因为Component和application的定义在xml中完成。
1 楼 liuxujim 2009-07-03  
这个情况下, web.xml应该怎么写?

相关推荐

    Restlet实战(二十六)事务 (Transaction)

    本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...

    Restlet开发实例

    本系列的开发实例将带你深入理解并掌握Restlet框架的使用,从基础的JAX-RS实现到高级的Component和Application结构,再到与Spring框架的整合。 首先,我们来看看"RESTLET开发实例(一)基于JAX-RS的REST服务.doc"。...

    Restlet 2.0 边学边写(八)使用jQuery和ajax实现对Restlet资源的CRUD操作

    在本篇博文中,我们将深入探讨如何利用jQuery和Ajax技术与Restlet 2.0框架进行交互,实现对Restful资源的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,即CRUD操作。Restlet是一个开源的Java ...

    restlet实现最简单的restful webservice

    3. **定义路由**:在Restlet应用中,你需要创建一个路由(Route)来映射URL到对应的资源。这可以通过创建一个Application类来完成。 ```java import org.restlet.Application; import org.restlet.Restlet; ...

    RESTLET开发(三)

    ### RESTLET开发(三):基于Spring的REST服务 #### 一、基于Spring配置的Rest简单服务 在本文档中,我们将深入探讨如何利用RESTlet框架与Spring框架结合,构建高效的RESTful服务。Spring框架因其强大的功能和灵活...

    restlet2.1学习笔记项目代码

    4. **路由(Route)**:Restlet使用`org.restlet.routing.Router`来映射不同的URI路径到相应的资源。这允许我们创建灵活的URL结构,每个路径都可以指向不同的处理逻辑。 5. **过滤器(Filter)**:过滤器允许在请求...

    restlet入门示例

    本示例将带你入门Restlet,帮助你理解如何使用它来创建简单的Web服务。 首先,让我们了解REST的基本概念。REST架构基于HTTP协议,通过HTTP方法(GET、POST、PUT、DELETE等)来操作资源。资源通常由URI(Uniform ...

    Restlet所需要的所有jar包

    此外,理解RESTful设计原则,如资源的URI定位、状态码的使用、无状态通信等,对于有效利用Restlet构建高质量的Web服务也是十分必要的。 总之,"Restlet所需要的所有jar包"的压缩包提供了开发RESTful服务的基础环境...

    restlet restful

    在Restlet框架中,"RestApplication"可能是一个实现了Restlet Application接口的类,负责初始化和管理REST服务的路由和行为。 总的来说,"restlet restful"项目是一个基于RESTlet框架的RESTful Web服务实现,提供了...

    RESTLET开发

    定义一个名为`StudentApplication`的应用类,该类继承自`javax.ws.rs.core.Application`,用于管理和注册资源。 5. **定义资源类** 实现一个具体的资源类`StudentResource`,该类需要继承自`javax.ws.rs.core....

    restlet工程示例

    在本示例中,我们将深入探讨如何使用Restlet框架来创建和使用RESTful服务。 首先,理解REST的基本原则至关重要。RESTful服务基于HTTP协议,使用HTTP方法(GET、POST、PUT、DELETE等)来操作资源。资源通过URI...

    restlet

    RESTlet是一款开源框架,专为构建基于REST(Representational ...通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业技能。

    Restlet in action 英文 完整版

    在《Restlet in Action》的第一章“Introducing the Restlet Framework”中,作者们详细解释了Restlet框架的核心概念,包括组件模型、资源模型以及如何使用这些模型来构建Web服务。此外,还介绍了一些高级特性,如...

    Restlet与Spring 集成

    `BaseApplication`类是自定义的Restlet应用程序,它使用`component.context`和`restRoute`。`restRoute`是一个Spring路由器,通过`attachments`映射将URL路径与处理资源的Spring Bean关联。 - **userContext.xml**...

    restlet1.1文档

    1. **使用Maven进行配置**:如果您使用的是Maven作为构建工具,可以通过添加依赖项来轻松集成Restlet。 2. **使用Eclipse进行配置**:如果您使用的是Eclipse IDE,则可以通过导入项目模板或手动添加库文件来进行配置...

    基于Spring的Restlet实例

    标题"基于Spring的Restlet实例"意味着我们将探讨如何在Spring环境中集成和使用Restlet库来开发REST服务。这通常涉及以下几个关键知识点: 1. **RESTful服务基础**:REST是一种软件架构风格,强调通过HTTP协议暴露...

    Restlet in action 中文

    在**第三部分 Further usage possibilities**中,作者探讨了Restlet在不同环境中的应用,如云部署、浏览器端和移动端的使用,以及如何与语义网结合。这一部分展示了Restlet的灵活性和广泛适用性,无论是在传统的Web...

    Restlet开发的Basic认证

    Restlet是一个轻量级的Java Web服务开发框架,它提供了构建RESTful(Representational State Transfer)应用程序的工具和API。REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性...

Global site tag (gtag.js) - Google Analytics