- 浏览: 253917 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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)
前面一篇文章分析了servlet里init方法,包括init方法本身以及调用的方法源代码,这篇文章继续,按照servlet的生命周期,接下去会调用servlet的service方法:
@Override public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final HttpServerHelper helper = getServer(request); if (helper != null) { helper.handle(createCall(helper.getHelped(), request, response)); } else { log("[Noelios Restlet Engine] - Unable to get the Restlet HTTP server connector. Status code 500 returned."); response.sendError(500); } }
让我们一步一步的分析下去,首先看getServer方法:
public HttpServerHelper getServer(HttpServletRequest request) { HttpServerHelper result = this.helper; if (result == null) { synchronized (ServerServlet.class) { if (result == null) { // Find the attribute name to use to store the server // reference final String serverAttributeName = getInitParameter( NAME_SERVER_ATTRIBUTE, NAME_SERVER_ATTRIBUTE_DEFAULT); // Look up the attribute for a target result = (HttpServerHelper) getServletContext() .getAttribute(serverAttributeName); if (result == null) { result = createServer(request); getServletContext().setAttribute(serverAttributeName, result); } this.helper = result; } } } return result; }
上面这段代码首先还是根据server属性名字,查找servlet context里是否已经有存放的server,如果有就直接取出来,如果没有,就创建一个server,然后把这个新的server放到servlet context里,以便下次的时候不需要重新创建,这个动作之前的component已经重复过。如果第一次请求,肯定是没有server存在,那么接下来,看看是怎么创建一个server的。由于这个方法的代码很长,所以,只贴出部分代码做一个解释:
在这个方法里,首先得到Component,调用的getComponent,之前文章的分析,我们知道,这个时候已经有component放到servlet context。
final Component component = getComponent();
既然有了component,那么接下去就会创建一个server以及一个server helper,需要说明的是restlet代码里有很多helper,如ComponentHelper,ApplicationHelper,HttpServerHelper等等。
final Server server = new Server(component.getContext() .createChildContext(), (List<Protocol>) null, request .getLocalAddr(), request.getLocalPort(), component); result = new HttpServerHelper(server);
然后,获取请求的path,如/restlet/resources/customers/1:
final String uriPattern = request.getContextPath() + request.getServletPath();
其中restlet是context path,而/resources是servlet path,而/customers/1则是我们定义的映射的URI。
接下来会判断当前的Component是否是default component(关于default component的判断,在上篇文章中解释过),如果是default compoent就将之前在init方法里创建的application attach到当前component的默认的Host上(虚拟主机)。否则,就会启动另外的一个流程:
1.首先会判断一个参数org.restlet.autoWire是否是true,那么这个参数代表什么呢?看看源码里面的注释:
org.restlet.autoWire是Servlet context的一个参数名字,并包含一个布尔型值,值为true表示所有的applications 将被用Servlet上下文的路径值attach到Component的虚拟主机(virtual hosts)上
代码如下:
final String autoWire = getInitParameter(AUTO_WIRE_KEY, AUTO_WIRE_KEY_DEFAULT); if (AUTO_WIRE_KEY_DEFAULT.equalsIgnoreCase(autoWire)) {
根据我在开始时候列出的环境,没有在web.xml中配置一个名为org.restlet.autoWire的参数,所以,这里autoWire会取默认值为true。而常量AUTO_WIRE_KEY_DEFAULT的值也为true。
2.分析映射的URL是否需要增加Context path或者Servlet path
源码里面定义了两个变量:
boolean addContextPath = false; boolean addFullServletPath = false;
顾名思义,第一个是判断是否需要增加context path,第二个是判断是否需要增加servlet path。下面的代码就是判断的具体逻辑:
for (final Route route : component.getDefaultHost() .getRoutes()) { if (route.getTemplate().getPattern() == null) { addFullServletPath = true; continue; } if (!route.getTemplate().getPattern().startsWith( uriPattern)) { if (!route.getTemplate().getPattern() .startsWith(request.getServletPath())) { addFullServletPath = true; } else { addContextPath = true; break; } } }
代码比较简单,不多做解释,接下来,如果对于默认主机的定义的所有路由的URL不需要增加Context path,则会继续检查attach到该component的所有的别的虚拟主机是否需要增加Context path和Servlet path:
if (!addContextPath) { for (final VirtualHost virtualHost : component.getHosts()) { if (virtualHost.getRoutes().isEmpty()) { // Case where the default host has a default // route (with an empty pattern). addFullServletPath = virtualHost .getDefaultRoute() != null; } else { for (final Route route : virtualHost.getRoutes()) { if (route.getTemplate().getPattern() == null) { addFullServletPath = true; continue; } if (!route.getTemplate().getPattern().startsWith(uriPattern)) { if (!route.getTemplate().getPattern().startsWith(request.getServletPath())) { addFullServletPath = true; } else { addContextPath = true; break; } } } } if (addContextPath) { break; } } }
3. 改变各种路由
经过上面两步,如果需要增加Context path或者Servlet path,则会判断是那种类型:
if (addContextPath) { offsetPath = request.getContextPath(); } else { offsetPath = uriPattern; }
接下来会对所有的路由进行转化,包括默认的虚拟主机的默认路由,默认虚拟主机的路由,组件的别的虚拟主机的默认路由以及组件的别的虚拟主机的路由。这里为了节省篇幅,仅给出一种情况的代码:
// Shift the routes of the default host for (final Route route : component.getDefaultHost() .getRoutes()) { log("[Noelios Restlet Engine] - Attaching restlet: " + route.getNext() + " to URI: " + offsetPath + route.getTemplate().getPattern()); route.getTemplate().setPattern( offsetPath + route.getTemplate().getPattern()); }
ok,分析完这几段代码后,结合我之前给出的环境,因为定义url映射时候,没有Context path和servlet path,只是单纯的映射部分,如/customers/1,而不是/restlet/resources/customers/1或者/resources/customers/1.所以,经过上述代码,我们的定义的url会变成/{Context path}/{Servlet path}/{Mapping url}.
至此,一个Server就创建完成,然后系统会根据一个属性名字将它放到一个Servlet Context里。然后返回基于Server的一个Helper。
发表评论
-
Restlet实战(二十九)(完结篇)运行流程之源代码分析
2009-08-20 17:32 5332终于到了完结篇,也体 ... -
Restlet实战(二十八)源代码分析之压缩 (Compression)
2009-08-10 15:36 3274上篇文章我给出了如何 ... -
Restlet实战(二十七)压缩 (Compression)
2009-08-05 12:09 7212在进入代码部分之前,还是贴出<<RESTful W ... -
Restlet实战(二十六)事务 (Transaction)
2009-08-02 23:29 5404<<Restful Web Service> ... -
Restlet实战(二十五)缓存 (Cache)
2009-07-31 22:18 3999说明:以下部分文字说明摘自<<Restful We ... -
Restlet实战(二十四)获取参数值(续)
2009-07-31 14:44 10434这个系列之前已经有一篇文章写如何获取参数值,看Restlet实 ... -
欢迎加入Restlet圈子
2009-07-28 22:28 2843如果你进来是因为想看Restlet相关的文章,那么欢迎你加入r ... -
Restlet实战(二十三)实现条件GET (Conditional Get)
2009-07-28 17:47 5052先普及一下什么是条件GET,以下摘自<<Restf ... -
Restlet实战(二十二)仿造PUT和DELETE
2009-07-28 13:17 7196在Restlet实战(七)-提交和处理Web Form 中提到 ... -
Restlet实战(二十一)如何保护确定的资源(续)
2009-07-16 16:18 4007在Restlet实战(十七)如何保护确定的资源 中我给出一个如 ... -
Restlet实战(二十)使用Restlet之SSL
2009-07-15 21:37 3352待写 -
Restlet实战(十九)使用Restlet实现Web Service
2009-07-15 21:34 4380先说明本篇文章要实现的功能,仍然做一些假设,当前系统是基于Re ... -
Restlet实战(十八)Restlet如何产生WADL
2009-07-11 21:57 9844现在究竟REST是否需要WADL这种东西,有很多争论,有人说不 ... -
Restlet实战(十七)如何保护确定的资源
2009-07-11 21:55 3441在面向资源的架构中, ... -
Restlet实战(十六)结合源代码分析及使用Filter
2009-07-11 21:13 5745其实在Web应用中Filter对大家来说一点都不陌生,比如说在 ... -
Restlet实战(十五)如何与表示层交互
2009-07-10 13:51 5385首先还是设定一个应用场景,看看用restlet如何实现。 ... -
Restlet实战(十四)如何在Restlet得到Servlet request和Session
2009-07-09 16:39 11532如果你现在已经有一个web系统,而为了一些需求,你集成了res ... -
Restlet实战(十三)如何在Servlet中呼叫Restlet
2009-07-09 14:47 4529看到这个题目,或许你会问,你之前的很多文章不都是与servle ... -
Restlet实战(十二)获取参数值
2009-07-07 15:06 6958本篇文章将讲解三种不 ... -
Restlet实战(十一)结合源代码修改Restlet-Spring配置文件
2009-07-04 23:56 6181上篇文章结合了Restlet的源码分析了Restlet-spr ...
相关推荐
了解了这些基本概念后,你可以通过解压"restlet-jee-2.0.14"压缩包,查看源代码、例子和API文档,更深入地学习Restlet 2.0如何在Java EE环境中实现REST服务。这将有助于你开发出高效、灵活且易于维护的Web应用程序。
在《Restlet实战(二十六)事务 (Transaction)》这篇博文中,作者可能会详细讲解如何在Restlet框架中实现上述事务处理策略。Restlet是一个开源的Java框架,专门用于构建RESTful应用程序。它提供了丰富的API和工具,...
restlet源代码,描述了restlet框架中每个类的具体实现
通过阅读和运行这些代码,你可以深入理解Restlet的工作原理,并将其应用到自己的项目中。同时,这个项目也是学习RESTful服务设计和实现的一个宝贵资源,能够帮助你提升在Web服务开发领域的技能。
文件列表中的"RESTlet"可能是RESTlet框架的源代码、文档或示例应用。通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业...
### RESTLET开发(三):基于Spring的REST服务 #### 一、基于Spring配置的Rest简单服务 在本文档中,我们将深入探讨如何利用RESTlet框架与Spring框架结合,构建高效的RESTful服务。Spring框架因其强大的功能和灵活...
Restlet Client插件是一款运行在chrome内核浏览器上的Web服务测试插件,该插件主要用于测试各种Web服务,能查看网站基本信息、浏览网页代码并能发送HTTP请求来测试网站Web服务,同时支持自动化API场景。用户在安装了...
restlet代码
Restlet是一个开源框架,专为构建RESTful(Representational State Transfer)Web服务而设计。REST是一种轻量级的架构风格,常用于构建高效、可扩展的网络应用程序。它强调资源的概念,通过URI(统一资源标识符)来...
Java Restlet实例,导入就可运行 在tomcat下运行的效果: 运行后访问的地址: http://localhost:8182/adages/ 获取单个的xml记录: http://localhost:8182/adages/xml/1
5. **示例代码**:在`authorizationControl`这个文件夹中,可能包含了实现上述功能的Java源代码示例。例如,一个名为`BasicAuthenticator`的类,它继承了`Authenticator`,并在`authenticate`方法内进行用户验证。...
要确保把以下JAR包写在你的classpath中,才能成功编译并运行接下来的例子: * org.restlet.jar(Restlet API) * com.noelios.restlet.jar (Noelios Restlet Engine核心) * com.noelios.restlet.ext.net.jar ...
RestletClient允许你以文本、源代码或文件形式输入这些数据。 3. **发送请求**:完成配置后,点击“发送”按钮,RestletClient将执行请求,并显示服务器的响应。这包括状态码(如200表示成功,404表示未找到),...
本压缩包包含Restlet框架运行所需的全部jar文件,使得开发者可以便捷地在Java环境中开发、测试和部署RESTful服务。 Restlet框架的核心组件包括以下几个部分: 1. **客户端API**:提供了与REST服务器交互的能力,...
Restlet与Spring集成是将Restlet框架与Spring框架结合,以增强RESTful服务的开发能力。Restlet是一个轻量级的Java框架,专门用于构建REST(Representational State Transfer)架构风格的应用程序。它遵循JAX-RS...
### RESTLET框架学习知识点 #### 一、RESTLET框架概览 - **RESTLET框架简介**:RESTLET是一个面向对象的Java开源框架,用于构建RESTful应用和服务。它旨在简化Web应用开发,允许开发者充分利用REST架构的优势。...
Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...
5. **运行应用**: 将Restlet附加到一个网络服务器(如Jetty或Grizzly),启动应用。 6. **测试**: 使用curl命令或Web浏览器测试Restlet服务,查看其是否按预期工作。 通过学习和实践"FirstRestlet"项目,开发者...
书中不仅介绍了Restlet框架的基本概念和技术细节,还通过丰富的示例代码展示了如何设计、实现和部署RESTful Web服务。 #### 二、Restlet框架简介 **Restlet** 是一个灵活且强大的Java框架,用于构建RESTful Web...