- 浏览: 251827 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 4119前面一篇文章分析了servlet里init方法,包括init方 ... -
Restlet实战(二十九)(完结篇)运行流程之源代码分析
2009-08-20 17:32 5230终于到了完结篇,也体 ... -
Restlet实战(二十八)源代码分析之压缩 (Compression)
2009-08-10 15:36 3199上篇文章我给出了如何 ... -
Restlet实战(二十七)压缩 (Compression)
2009-08-05 12:09 7151在进入代码部分之前,还是贴出<<RESTful W ... -
Restlet实战(二十六)事务 (Transaction)
2009-08-02 23:29 5322<<Restful Web Service> ... -
Restlet实战(二十五)缓存 (Cache)
2009-07-31 22:18 3941说明:以下部分文字说明摘自<<Restful We ... -
Restlet实战(二十四)获取参数值(续)
2009-07-31 14:44 10367这个系列之前已经有一篇文章写如何获取参数值,看Restlet实 ... -
欢迎加入Restlet圈子
2009-07-28 22:28 2756如果你进来是因为想看Restlet相关的文章,那么欢迎你加入r ... -
Restlet实战(二十三)实现条件GET (Conditional Get)
2009-07-28 17:47 4998先普及一下什么是条件GET,以下摘自<<Restf ... -
Restlet实战(二十二)仿造PUT和DELETE
2009-07-28 13:17 7152在Restlet实战(七)-提交和处理Web Form 中提到 ... -
Restlet实战(二十一)如何保护确定的资源(续)
2009-07-16 16:18 3962在Restlet实战(十七)如何保护确定的资源 中我给出一个如 ... -
Restlet实战(二十)使用Restlet之SSL
2009-07-15 21:37 3267待写 -
Restlet实战(十九)使用Restlet实现Web Service
2009-07-15 21:34 4283先说明本篇文章要实现的功能,仍然做一些假设,当前系统是基于Re ... -
Restlet实战(十八)Restlet如何产生WADL
2009-07-11 21:57 9802现在究竟REST是否需要WADL这种东西,有很多争论,有人说不 ... -
Restlet实战(十七)如何保护确定的资源
2009-07-11 21:55 3392在面向资源的架构中, ... -
Restlet实战(十六)结合源代码分析及使用Filter
2009-07-11 21:13 5709其实在Web应用中Filter对大家来说一点都不陌生,比如说在 ... -
Restlet实战(十四)如何在Restlet得到Servlet request和Session
2009-07-09 16:39 11489如果你现在已经有一个web系统,而为了一些需求,你集成了res ... -
Restlet实战(十三)如何在Servlet中呼叫Restlet
2009-07-09 14:47 4500看到这个题目,或许你会问,你之前的很多文章不都是与servle ... -
Restlet实战(十二)获取参数值
2009-07-07 15:06 6908本篇文章将讲解三种不 ... -
Restlet实战(十一)结合源代码修改Restlet-Spring配置文件
2009-07-04 23:56 6129上篇文章结合了Restlet的源码分析了Restlet-spr ...
相关推荐
NULL 博文链接:https://ajaxcn.iteye.com/blog/438237
Restlet与Spring 集成
restlet相关文档
restlet项目
org.restlet.jar
Restlet Client插件是一款运行在chrome内核浏览器上的Web服务测试插件,该插件主要用于测试各种Web服务,能查看网站基本信息、浏览网页代码并能发送HTTP请求来测试网站Web服务,同时支持自动化API场景。用户在安装了...
一个简单的Restlet开发框架的Basic认证的例子
restlet2.1学习笔记项目代码
Restlet项目为“建立REST概念与Java类之间的映射”提供了一个轻量级而全面的框架。它可用于实现任何种类的REST式系统,而不仅仅是REST式Web服务;而且,事实证明它自从2005年诞生之时起,就是一个可靠的软件。 ...
Restlet所需要的所有jar包 一次下载,以后高枕无忧!
RESTLET开发实例(二)使用Component、Application的REST服务
restlet入门helloworld示例
本文是对Restlet官方教程http://restlet.com/learn/tutorial/2.2/的中文翻译。
RESTLET框架学习书籍
Restlet2.0用户指南
资源里面包含了Restlet从入门到高级的开发过程,对学习Restlet有很大的帮助
restlet工程示例,restlet工程小例子
RESTLET开发实例(一)基于JAX-RS的REST服务
restlet restful,web工程,可直接运行。启动后,main方法作为client运行调用服务端。服务器数据之间沟通利器,绝对不坑。