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

Restlet实战(十五)如何与表示层交互

    博客分类:
  • REST
阅读更多

首先还是设定一个应用场景,看看用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>

 

 

 

 

分享到:
评论
5 楼 liu.da101 2012-04-27  
出现中文乱码怎么办呀?
4 楼 junjieshow 2010-05-07  
mailApplication.properties这个文件里存是什么?
3 楼 xiantiaolang 2010-04-12  
我用的spring2.5,customersResource bean是要注入freemarkerConfig才行
2 楼 ajax 2009-08-10  
nocohol 写道
在学习这章的时候,有个地方要注意一下下,作者没有写上去,就是在Spring context configuration, 定义了一个freemarker configure的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注入不成功!


Spring貌似从2.0以后,就支持自动注入了,默认是byName,当让还有byType等。不需要显式的配置一个bean为另外一个Bean的属性。
1 楼 nocohol 2009-08-10  
在学习这章的时候,有个地方要注意一下下,作者没有写上去,就是在Spring context configuration, 定义了一个freemarker configure的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实战(二十六)事务 (Transaction)

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

    restlet

    客户端部分,RESTlet允许开发者创建REST客户端代理,能够方便地与远程REST服务进行交互。这个特性对于测试、集成或者构建复杂的分布式系统非常有用,因为它简化了HTTP请求的构建和发送过程。 RESTlet框架的关键特性...

    Restlet与Spring 集成

    Restlet与Spring集成是将Restlet框架与Spring框架结合,以增强RESTful服务的开发能力。Restlet是一个轻量级的Java框架,专门用于构建REST(Representational State Transfer)架构风格的应用程序。它遵循JAX-RS...

    restlet2.1学习笔记项目代码

    在Restlet中,资源由`org.restlet.resource.ServerResource`或`org.restlet.resource.ClientResource`类表示,负责处理请求并返回响应。 3. **代表(Representation)**:在REST中,资源的状态通过数据的表示形式...

    restlet项目

    2. **Client/Server Connector**: 这些组件允许Restlet与网络进行交互,处理客户端请求和服务器端响应。它们抽象了底层的HTTP通信细节。 3. **Representation**: RESTful服务中的数据以“表示”形式存在,可以是...

    Restlet所需要的所有jar包

    在使用过程中,要注意版本兼容性问题,确保Restlet框架及其依赖库与你的Java运行环境和其它库相兼容。此外,理解RESTful设计原则,如资源的URI定位、状态码的使用、无状态通信等,对于有效利用Restlet构建高质量的...

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

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

    Restlet开发的Basic认证

    REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性的Web服务。在这个"Restlet开发的Basic认证"示例中,我们将探讨如何在Restlet应用中实现HTTP基本认证,这是一种广泛使用的身份...

    Restlet Client 插件安装包

    **Restlet Client插件安装包详解** 在现代的Web应用开发中,API(Application Programming Interface)扮演着至关重要的角色,尤其是RESTful API,它已成为构建分布式系统和微服务架构的标准。为了有效地测试和调试...

    Restlet in action 英文 完整版

    #### 五、生成和消费Restlet表示 第四章“Producing and consuming Restlet representations”聚焦于如何在Restlet应用中生成和处理数据表示。这里涵盖了表示的序列化与反序列化过程,以及如何支持不同类型的媒体...

    RESTLET IN ACTION

    这一章详细讨论了如何设计和使用Restlet中的表示层(Representation),包括数据格式、序列化/反序列化过程等。表示层是RESTful服务的重要组成部分,它决定了客户端和服务器之间交换的数据格式。 #### 6. Restlet...

    restlet restful

    Restlet是Java领域的一款开源框架,专门用于构建REST(Representational State Transfer)风格的Web服务。RESTful是一种软件架构风格,设计模式,是基于HTTP协议的Web服务设计原则,强调资源的概念,通过URI来定位...

    Restlet in action 中文

    【Restlet in Action 中文】这本书是一本针对Java开发者介绍Restlet框架的实战指南,旨在帮助读者更好地理解和使用RESTful Web API。Restlet是一个开源的Web框架,它以面向对象的方式提供了一系列类和示例,使得...

    RESTLET框架学习书籍

    - **语义网的整合**:探讨如何将Restlet与语义网结合,提高应用的数据处理能力。 #### 四、实践操作 - **第一章:反思Web开发**: - 学习REST架构的基本原理。 - 了解RESTLET框架的历史背景和发展现状。 - 实践...

    org.restlet.jar

    org.restlet.jar

    RESTLET开发

    **RESTLET**是一个轻量级且全面的框架,旨在实现REST(Representational State Transfer)原则与Java类之间的映射。该框架支持广泛的REST式系统构建,不仅仅局限于RESTful Web服务。 RESTLET的设计受到了多种Web...

    FE助手和Restlet Client

    Restlet Client是一个专门用于RESTful API测试的工具,它允许开发者以图形化界面或者命令行方式与REST API进行交互。REST(Representational State Transfer)是一种架构风格,广泛应用于Web服务设计,特别是微服务...

    restlet实现最简单的restful webservice

    Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...

    Restlet开发实例

    最后,"RESTLET开发实例(三)基于spring的REST服务.doc"会介绍如何将Restlet与Spring框架集成。Spring是Java企业级应用开发的主流框架,提供了丰富的功能和优秀的依赖注入机制。结合Spring,Restlet服务可以利用...

Global site tag (gtag.js) - Google Analytics