注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

Template Service  

2014-04-09 13:50:04|  分类: WebX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1. Template Service

1.1. 概述

1.1.1. 什么是Template

Template是一种动态生成文本的机制,中文译名模板。在模板中,它描绘了静态文本与动态文本结合的规则。使用过程中,模板引擎会以模板为基础,将动态内容信息结合到模板当中,最终输出整份文本文档。在Web应用中,最常见的就是利用Velocity模板引擎将动态数据结合到HTML模板当中,得到最终HTML文档。

1.1.2. Template Service

Template Service是对Template Engine的一种高度抽象。它不细化到某一种具体类型的Template Engine。

我们可以将符合Template Service规范的任意Template Engine,无缝集成到Tempate Service中,而使用者只需要关注Service统一对外暴露的接口就可以了。下图描述了应用程序,Template Service和Template Engine之间的关联。

Template Service - 和申 - 和申的个人主页

 

1.2. Template Service的使用

1.2.1. 配置

Template Service在配置文件中是用 services:template 标签来定义的。

下面是一个简单的Template Service配置实例:

<services:template cacheEnabled="" defaultExtension="" searchLocalizedTemplates="" searchExtensions="">
        // engines defination
</services:template>

例子列举了Template Service中,4个比较关键的配置属性。

cacheEnabled表示是否保存模板搜索的结果,默认值会根据productionMode改变。可设置的值为true或false。

defaultExtension表示模板的默认后缀。可设置的值是字符串。

searchLocalizedTemplates表示根据当前locale,搜索最合适的localized模板。可设置的值为true或false。

searchExtensions表示让Template Service搜索可用的模板名后缀。可设置的值为true或false。

配置小技巧:

在配置Template Service过程中,我们一般可以忽略template后缀名。因为当你配置searchExtensions="true"时,Template Service会自己搜索可用的模板名。这样做的另一个好处就是模板与Web应用本身不会有太高的耦合。

1.2.2. 程序如何使用模板

在程序中使用Template Service主要有两种方法:

第一种方法是通过应用上下文获取com.alibaba.citrus.service.template.TemplateService接口实例。然后通过直接调用Template Service对外暴露的接口方法,来使用Template Service。

下面这个例子展示了一个简单的Template查找和渲染功能:

假设有一个简单的模板,如下:

My name is ${name}.

通过Template Service渲染这个模板:

TemplateService service = (TemplateService) factory.getBean("templateService");
if (service.exists("test")) { // test is a template name
    TemplateContext context = new MappedTemplateContext();
    context.put("name", "Webx3");
    try {
        service.getText("test", context);
    } catch (TemplateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

输出结果是:

 My name is Webx3.

第二种方法是使用Webx3框架。你只要编写好Screen或Control,并在配置文件中定义了Template Service。之后,框架会根据请求URL的格式,自动搜索对应的模板文件,渲染输出结果。

1.3. 模板引擎

1.3.1. 概述

模板引擎是将模板和上下文信息结合,渲染输出文本文档的机制。目前框架主要提供了三种模板引擎:Velocity,Freemarker和JSP。

1.3.2. Velocity Engine

Velocity Engine是Apache旗下的顶级项目。它具备模板引擎的易用性和良好的性能,目前来说,是我们开发首选的引擎框架。

与Template Service集成后的Velocity Engine,不仅保留了官方原有的特性和功能,在此基础上,还往融入了VM插件体系。

在Template Service中配置Velocity Engine的格式如下:

<services:template xmlns="http://www.alibaba.com/schema/services/template/engines"
        searchExtensions="true">
        <velocity-engine templateEncoding="GBK" strictReference="false"
            path="/${component}/templates">
            <global-macros>
                <name>global/*.vm</name>
            </global-macros>
            <plugins>
                <vm-plugins:escape-support defaultEscape="html">
                    <vm-plugins:noescape>
                        <vm-plugins:if-matches pattern="^control." />
                        <vm-plugins:if-matches pattern="^screen_placeholder" />
                        <vm-plugins:if-matches pattern="^stringEscapeUtil.escape" />
                        <vm-plugins:if-matches pattern="^csrfToken.(get)?hiddenField" />
                    </vm-plugins:noescape>
                </vm-plugins:escape-support>
            </plugins>
        </velocity-engine>
    </services:template>

在velocity engine配置中,有两个子标签,一个是 global-macros,用于定义全局宏。另一个是 vm-plugins,代表velocity的插件配置。

全局宏做为velocity的原生机制,我们不在这里多做讲解了。我们着重来看一下插件配置。

在这个例子中,我们配置了一个字符转义插件并使用了 noescape 标签。noesape,顾名思义,就是请不要转义。它的原理是当Velocity渲染文本时,如果匹配到指定的正则表达式内容,则不对这块内容进行转义。

从另一个角度理解,符合Template Service规范的Velocity Engine默认是对所有字符进行强制转义的。

1.3.3. Freemarker和JSP

Freemarker和JSP引擎做为Velocity引擎的一种补充,不是很常用。它们的配置如下:

<services:template xmlns="http://www.alibaba.com/schema/services/template/engines"
        searchExtensions="true">
        <freemarker-engine templateEncoding="GBK" path="/${component}/templates" />
        <jsp-engine path="/${component}/templates" />
    </services:template>

可以看到,所有的引擎配置,都是符合 xxx-engine 的命名规范。在Freemarker和JSP引擎的配置当中,省略了像Velocity的插件配置。如果你有需要插件来实现的相关需求,也可以手动配置上。

1.4. 创建新的模板引擎

对于有些项目可能需要创建自己的模板引擎,我们也考虑到了。创建新引擎,你只需要使用springext,为Template Service创建一个扩展点和对应的schema,最后实现扩展点的解析器即可。

当然,springext的使用,不是本章的重点。对于如何创建扩展点,实现扩展点解析器,请参见springext章节。

1.5. 总结

本章介绍了Template Service的配置和使用。其中包括 Velocity,Freemarker和JSP的配置。我们还了解了Template Service默认对所有模板内容进行转义,当你想要控制某一块内容不转义时,需要安装转义插件,并配置不转义的内容范围。

  评论这张
 
阅读(550)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016