热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Groovy模板引擎

本文参考自Templateengines,大部分代码直接引用了文档的内容。模板引擎介绍Groovy语言包含了一个模板引擎功能,可以生成各种类型的格式化文件,非常方便。模板引擎有下面

本文参考自Template engines,大部分代码直接引用了文档的内容。

模板引擎介绍

Groovy语言包含了一个模板引擎功能,可以生成各种类型的格式化文件,非常方便。模板引擎有下面几个,它们都实现了Template接口。

  • SimpleTemplateEngine – 基本的模板
  • StreamingTemplateEngine – 功能和 SimpleTemplateEngine相同,不过支持大于64k的模板
  • GStringTemplateEngine – 将模板保存为可写的闭包,在流式场景中很有用
  • XmlTemplateEngine – 输出XML文件的模板引擎
  • MarkupTemplateEngine – 一个完整的、优化过的模板引擎,可以用于生成HTML等模板

SimpleTemplateEngine

这是最贱的模板引擎, 使用起来也非常简单。直接看Groovy文档的例子吧。可以看到它的模板语法类似JSP标签和EL表达式。

def text = 'Dear "$firstname $lastname",\nSo nice to meet you in <% print city %>.\nSee you in ${
month},\n${signed}'
def binding = ["firstname":"Sam", "lastname":"Pullara", "city":"San Francisco", "month":"December", "signed":"Groovy-Dev"]
def engine = new groovy.text.SimpleTemplateEngine()
def template = engine.createTemplate(text).make(binding)
def result = 'Dear "Sam Pullara",\nSo nice to meet you in San Francisco.\nSee you in December,\nGroovy-Dev'

StreamingTemplateEngine

它和SimpleTemplateEngine类似,只不过能处理比较大的文本。它使用<% %><%= %>和GString语法。下面的例子同样来自Groovy文档。

def text = '''\ Dear <% out.print firstname %> ${lastname}, We <% if (accepted) out.print 'are pleased' else out.print 'regret' %> \ to inform you that your paper entitled '$title' was ${ accepted ? 'accepted' : 'rejected' }. The conference committee.'''
def template = new groovy.text.StreamingTemplateEngine().createTemplate(text)
def binding = [
firstname : "Grace",
lastname : "Hopper",
accepted : true,
title : 'Groovy for COBOL programmers'
]
String respOnse= template.make(binding)
assert respOnse== '''Dear Grace Hopper, We are pleased to inform you that your paper entitled 'Groovy for COBOL programmers' was accepted. The conference committee.'''

GStringTemplateEngine

首先我们先将模板保存为文件。注意在模板中没有使用print方法,而是使用out,这样符合GString的规范。

Dear "$firstname $lastname",
So nice to meet you in <% out <<(city == "New York" ? "\\"The Big Apple\\"" : city) %>.
See you in ${month},
${signed}

然后读取模板,并使用给定的字符串替换模板。

def f = new File('test.template')
def engine = new groovy.text.GStringTemplateEngine()
def template = engine.createTemplate(f).make(binding)
println template.toString()

XmlTemplateEngine

XmlTemplateEngine用于生成XML模板。它提供了标准的${expression}$variable语法来插入数据。还提供了用来插入代码段和表达式。<>"'这几个符号会在处理模板的时候转义。gsp: tags命名空间的标签会在模板生成的时候移除,其他命名空间则不会移除。

下面是Groovy文档的例子。

def binding = [firstname: 'Jochen', lastname: 'Theodorou', nickname: 'blackdrag', salutation: 'Dear']
def engine = new groovy.text.XmlTemplateEngine()
def text = '''\ xmlns:foo='baz' type='letter'>
def greeting = "${salutation}est"
greeting
$firstname "$nickname" $lastname
How are you today?

''' def template = engine.createTemplate(text).make(binding) println template.toString()

生成的结果如下。

type='letter'>
Dearest
to xmlns:foo='baz'>
Jochen "blackdrag" Theodorou
to>
How are you today?

MarkupTemplateEngine

简介

终于说到重点了。这其实才是本篇文章想要说的重点内容。在官方文档中,前面所有内容才占了所有内容的四分之一。剩下的内容都在这里。

Groovy标记模板引擎的功能很强,完全可以作为一个WEB程序的视图层使用。不过我在实际用的时候发现一点问题,那就是Intellij IDEA没有支持……这就比较蛋疼了,我好像在记事本里写代码一样。这大概就是它最主要的缺点了吧。

这个标记模板引擎主要用来生成类XML的模板,类似HTML等等。但是也可以用来生成所有类型的文档。前面那些模板都是基于字符串的。而这个模板是基于Groovy DSL的(学过Gradle就明白了,它们长得很像)。

先来看看直观的例子吧。假设有下面的模板。

xmlDeclaration()
cars {
cars.each {
car(make: it.make, model: it.model)
}
}

模型数据是这样的。

model = [cars: [new Car(make: 'Peugeot', model: '508'), new Car(make: 'Toyota', model: 'Prius')]]

最后生成的文件类似这样。


<cars><car make='Peugeot' model='508'/><car make='Toyota' model='Prius'/>cars>

Groovy标记模板引擎提供的功能有强类型的模型检查、代码片和导入、国际化等几个重要功能。

代码格式和方法

标记模板其实是合法的Groovy代码。下面这个代码中其实有很多方法和闭包,看看你能认出几个。其实看了这么多Groovy文章的话,应该很容易猜出来哪些是方法、哪些是参数了。

yieldUnescaped ''
html(lang:'en') {
head {
meta('http-equiv':'"Content-Type" cOntent="text/html; charset=utf-8"')
title('My page')
}
body {
p('This is an example of HTML contents')
}
}

废话就不说了。说说常用的方法吧。

  • yieldUnescaped方法会直接输出给定的语句,不转义其中的字符。
  • yield方法和上面相反,会转义特殊字符。
  • head这些HTML标签方法会生成对应的标签。
  • xmlDeclaration()方法会生成一个标准的XML文档头。
  • comment方法生成HTML注释。
  • newLine生成一个新行。

包含

模板中还可以包含其他模板。下面是三种包含方式,分别包含另一个模板,不需要转义的文本或者是需要转义的文本。

include template: 'other_template.tpl'
include unescaped: 'raw.txt'
include escaped: 'to_be_escaped.txt'

还有几个等价的Groovy方法,这些方法主要在模板文件是动态的时候才有用。

includeGroovy() includeEscaped() includeUnescaped()

布局

我们可以编写布局文件。布局文件和其它Groovy模板文件的后缀名都是tpl。我一开始不知道,结果找不到视图文件,花了不少时间。例如编写下面这样一个文件。

html { head { title(title) }
body { bodyContents() }
}

然后将页面写为下面这样。Groovy模板引擎会将布局文件和实际布局结合,生成最终的布局。

layout 'layout-main.tpl',
title: 'Layout example',
bodyContents: contents { p('This is the body') }

使用模板引擎

使用方法和其他模板引擎差不多。都要创建引擎实例,然后传入模板文件和数据。标记模板引擎还需要一个额外的配置对象。

TemplateConfiguration cOnfig= new TemplateConfiguration();
MarkupTemplateEngine engine = new MarkupTemplateEngine(config);
Template template = engine.createTemplate("p('test template')");
Map<String, Object> model = new HashMap<>();
Writable output = template.make(model);
output.writeTo(writer);

默认情况下生成的模板是部分行的,适合生产环境但是不适合人类阅读。我们可以修改配置来让结果更可读。下面的配置打开了缩进和分行。其他配置请查阅相应文档。

config.setAutoNewLine(true);
config.setAutoIndent(true);

国际化

我们可以为每个模板文件创建不同区域的版本,这样就可以让程序可以实现国际化功能。例如,原始的文件是file.tpl,那么法语版本的文件就是file_fr_FR.tpl,英语版本就是file_en_US.tpl。在创建模板配置对象的时候,我们可以传递一个Locale对象作为默认区域使用。

强类型声明

Groovy模板的类型是在运行时解析的,不过我们也可以手动声明数据类型,这样模板执行速度会更快。在modelTypes中将使用到的模型声明出即可。

modelTypes = {
List pages
}
pages.each { page ->
p("Page title: $page.title")
p(page.text)
}

Spring集成

Spring对Groovy标记模板提供了支持。只要类路径存在Groovy相关类,就可以配置使用Groovy标记模板。

首先先添加Groovy的依赖。下面是Gradle的依赖配置。

compile 'org.codehaus.groovy:groovy-all:2.4.9'

然后在Spring配置文件中添加下面的配置。


<mvc:view-resolvers>
<mvc:groovy/>
mvc:view-resolvers>

<mvc:groovy-configurer auto-indent="true" cache-templates="false" resource-loader-path="/WEB-INF/templates"/>

之后,在配置的模板路径下编写*.tpl格式的模板文件,就可以让Spring正常解析了。


推荐阅读
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
author-avatar
Amy0807520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有