- 浏览: 253688 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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如何实现。
很多信息系统的某一个功能点的流程通常都是这样,首先进入一个列表页面,点击页面上的新增按钮,则进入新增页面,新增数据成功后,或者回到当前页面或者回到列表页面,这要看具体是怎么要求的。
下面就以Customer为例来模式实现这个流程。
需要说明的是,Restlet是使用Freemarker模板作为页面的展示而不是Jsp。在开始修改资源以及其它代码之前,我们需要费点功夫把FreeMarker集成进去,不是说Restlet已经集成FreeMarker了吗?我们还需要做什么工作?别急,且听我一一道来:
从官方给出的Restlet与Freemarker的结合的例子能看出,要是想在restlet中使用Freemarker,需要以下几步:
Properties properties = getProperties("clap://class/config/mailApplication.properties"); this.webRootPath = properties.getProperty("web.root.path"); final File templateDir = new File(webRootPath + "/tmpl"); Configuration fmc = new freemarker.template.Configuration(); fmc.setDirectoryForTemplateLoading(templateDir);
上述代码是指定FreeMarker模板文件的存放目录等信息,设置完成后,在Restlet里面可以引用:
org.restlet.ext.freemarker.TemplateRepresentation.TemplateRepresentation(String templateName, Configuration config, Object dataModel, MediaType mediaType)
如果是一个测试程序,直接这样使用没有问题,但是如果真正的铲平开发,这样的代码会出现在产品的各个角落,非常的糟糕。
那么能不能把这段代码封装起来,作为一个公共的代码,至少维护起来方便,下面就借助于Spring来实现这样的封装。
因为Spring的 FreeMarkerConfigurer已经实现了Configuration的获取的操作,所以,我们就借助它来封装代码。这里,把模板文件的目录设定为/WEB-INF/view
则在Spring配置文件里加入:
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/view/"/> </bean>
接着,创建一个BaseResource类,将上述类注入进来,并且创建一些方法来简化使用Freemarker的操作:
public class BaseResource extends Resource { FreeMarkerConfigurer freemarkerConfig; public BaseResource(){} public BaseResource(Context context, Request request, Response response) { super(context, request, response); } /** * Returns the reference of a resource according to its id and the reference * of its "parent". * * @param parentRef * parent reference. * @param childId * id of this resource * @return the reference object of the child resource. */ protected Reference getChildReference(Reference parentRef, String childId) { if (parentRef.getIdentifier().endsWith("/")) { return new Reference(parentRef.getIdentifier() + childId); } else { return new Reference(parentRef.getIdentifier() + "/" + childId); } } /** * Returns a templated representation dedicated to HTML content. * * @param templateName * the name of the template. * @param dataModel * the collection of data processed by the template engine. * @return the representation. */ protected Representation getHTMLTemplateRepresentation(String templateName, Map<String, Object> dataModel) { // The template representation is based on Freemarker. return new TemplateRepresentation(templateName, freemarkerConfig .getConfiguration(), dataModel, MediaType.TEXT_HTML); } public FreeMarkerConfigurer getFreemarkerConfig() { return freemarkerConfig; } public void setFreemarkerConfig(FreeMarkerConfigurer freemarkerConfig) { this.freemarkerConfig = freemarkerConfig; } }
ok, 我们接下来考虑第一个功能点,列出所有Customer,对应的请求的URL应该是:http://serverIp:port/context/customers.
由于这个URl对应的资源是CustomersResource,访问的方法是get,所以,我们修改resource类的represent方法:
@Override public Representation represent(Variant variant) { List<Customer> customers = customerDAO.getAllCustomers(); setValueForCustomer(customers); final Map<String, Object> dataModel = new TreeMap<String, Object>(); dataModel.put("customers", customers); dataModel.put("resourceRef", getRequest().getResourceRef()); dataModel.put("rootRef", getRequest().getRootRef()); return getHTMLTemplateRepresentation("customers.html", dataModel); }
由于只是模拟操作数据库,所以,硬编码设定一些值:
private void setValueForCustomer(List customers){ Customer customer = new Customer(); customer.setId("1"); customer.setName("Johnson"); customer.setAddress("Shanghai"); customers.add(customer); customer = new Customer(); customer.setId("2"); customer.setName("Wood"); customer.setAddress("Beijing"); customers.add(customer); customer = new Customer(); customer.setId("3"); customer.setName("Simon"); customer.setAddress("Guangzhou"); customers.add(customer); }
从represent方法能看到,封装数据后,最后会转向到customer.html来显示所有查询到的customer。
customer.html
<div style="float: left"> <h4>List of users.</h4> <table> <tr> <th>User</th> </tr> <#list customers as customer> <tr> <td><a href="">${customer.id} ${customer.name} ${customer.address}</a></td> </tr> </#list> </table> </div>
评论
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/view/"/> </bean>
我们还应该将其mapping到customersResource bean的freemarkerConfig属性,要不然在调 getHTMLTemplateRepresentation(String templateName,
Map<String, Object> dataModel) 时会发现freemarkerConfig注入不成功!
Spring貌似从2.0以后,就支持自动注入了,默认是byName,当让还有byType等。不需要显式的配置一个bean为另外一个Bean的属性。
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/view/"/> </bean>
我们还应该将其mapping到customersResource bean的freemarkerConfig属性,要不然在调 getHTMLTemplateRepresentation(String templateName,
Map<String, Object> dataModel) 时会发现freemarkerConfig注入不成功!
发表评论
-
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 4002在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实战(十四)如何在Restlet得到Servlet request和Session
2009-07-09 16:39 11526如果你现在已经有一个web系统,而为了一些需求,你集成了res ... -
Restlet实战(十三)如何在Servlet中呼叫Restlet
2009-07-09 14:47 4525看到这个题目,或许你会问,你之前的很多文章不都是与servle ... -
Restlet实战(十二)获取参数值
2009-07-07 15:06 6952本篇文章将讲解三种不 ... -
Restlet实战(十一)结合源代码修改Restlet-Spring配置文件
2009-07-04 23:56 6170上篇文章结合了Restlet的源码分析了Restlet-spr ...
相关推荐
本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...
客户端部分,RESTlet允许开发者创建REST客户端代理,能够方便地与远程REST服务进行交互。这个特性对于测试、集成或者构建复杂的分布式系统非常有用,因为它简化了HTTP请求的构建和发送过程。 RESTlet框架的关键特性...
Restlet与Spring集成是将Restlet框架与Spring框架结合,以增强RESTful服务的开发能力。Restlet是一个轻量级的Java框架,专门用于构建REST(Representational State Transfer)架构风格的应用程序。它遵循JAX-RS...
在Restlet中,资源由`org.restlet.resource.ServerResource`或`org.restlet.resource.ClientResource`类表示,负责处理请求并返回响应。 3. **代表(Representation)**:在REST中,资源的状态通过数据的表示形式...
2. **Client/Server Connector**: 这些组件允许Restlet与网络进行交互,处理客户端请求和服务器端响应。它们抽象了底层的HTTP通信细节。 3. **Representation**: RESTful服务中的数据以“表示”形式存在,可以是...
在使用过程中,要注意版本兼容性问题,确保Restlet框架及其依赖库与你的Java运行环境和其它库相兼容。此外,理解RESTful设计原则,如资源的URI定位、状态码的使用、无状态通信等,对于有效利用Restlet构建高质量的...
在本篇博文中,我们将深入探讨如何利用jQuery和Ajax技术与Restlet 2.0框架进行交互,实现对Restful资源的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,即CRUD操作。Restlet是一个开源的Java ...
REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性的Web服务。在这个"Restlet开发的Basic认证"示例中,我们将探讨如何在Restlet应用中实现HTTP基本认证,这是一种广泛使用的身份...
**Restlet Client插件安装包详解** 在现代的Web应用开发中,API(Application Programming Interface)扮演着至关重要的角色,尤其是RESTful API,它已成为构建分布式系统和微服务架构的标准。为了有效地测试和调试...
#### 五、生成和消费Restlet表示 第四章“Producing and consuming Restlet representations”聚焦于如何在Restlet应用中生成和处理数据表示。这里涵盖了表示的序列化与反序列化过程,以及如何支持不同类型的媒体...
这一章详细讨论了如何设计和使用Restlet中的表示层(Representation),包括数据格式、序列化/反序列化过程等。表示层是RESTful服务的重要组成部分,它决定了客户端和服务器之间交换的数据格式。 #### 6. Restlet...
Restlet是Java领域的一款开源框架,专门用于构建REST(Representational State Transfer)风格的Web服务。RESTful是一种软件架构风格,设计模式,是基于HTTP协议的Web服务设计原则,强调资源的概念,通过URI来定位...
【Restlet in Action 中文】这本书是一本针对Java开发者介绍Restlet框架的实战指南,旨在帮助读者更好地理解和使用RESTful Web API。Restlet是一个开源的Web框架,它以面向对象的方式提供了一系列类和示例,使得...
- **语义网的整合**:探讨如何将Restlet与语义网结合,提高应用的数据处理能力。 #### 四、实践操作 - **第一章:反思Web开发**: - 学习REST架构的基本原理。 - 了解RESTLET框架的历史背景和发展现状。 - 实践...
org.restlet.jar
**RESTLET**是一个轻量级且全面的框架,旨在实现REST(Representational State Transfer)原则与Java类之间的映射。该框架支持广泛的REST式系统构建,不仅仅局限于RESTful Web服务。 RESTLET的设计受到了多种Web...
Restlet Client是一个专门用于RESTful API测试的工具,它允许开发者以图形化界面或者命令行方式与REST API进行交互。REST(Representational State Transfer)是一种架构风格,广泛应用于Web服务设计,特别是微服务...
Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...
最后,"RESTLET开发实例(三)基于spring的REST服务.doc"会介绍如何将Restlet与Spring框架集成。Spring是Java企业级应用开发的主流框架,提供了丰富的功能和优秀的依赖注入机制。结合Spring,Restlet服务可以利用...