热门标签 | 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正常解析了。


推荐阅读
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 如何在浏览器中高效调用本地应用程序的方法与技巧
    为了在浏览器中高效调用本地应用程序,本文介绍了一种实用方法。通过创建并运行一个注册表文件(如 `test.reg`),可以实现点击浏览器按钮后自动启动指定的本地应用。具体步骤包括编写特定的注册表条目,并确保其正确配置以支持浏览器与本地应用之间的无缝交互。此外,文章还探讨了安全性和兼容性方面的注意事项,为开发者提供了全面的指导。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • 如何构建和部署C# Windows服务应用程序
    本文介绍了如何从零开始构建和部署C# Windows服务应用程序。通过详细步骤和代码示例,帮助读者掌握创建、配置和部署Windows服务的关键技术点,适合初学者和有经验的开发人员参考。 ... [详细]
  • 深入解析Wget CVE-2016-4971漏洞的利用方法与安全防范措施
    ### 摘要Wget 是一个广泛使用的命令行工具,用于从 Web 服务器下载文件。CVE-2016-4971 漏洞涉及 Wget 在处理特定 HTTP 响应头时的缺陷,可能导致远程代码执行。本文详细分析了该漏洞的成因、利用方法以及相应的安全防范措施,包括更新 Wget 版本、配置防火墙规则和使用安全的 HTTP 头。通过这些措施,可以有效防止潜在的安全威胁。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • APKAnalyzer(1):命令行操作体验与功能解析
    在对apkChecker进行深入研究后,自然而然地关注到了Android Studio中的APK分析功能。将APK文件导入IDE中,系统会自动解析并展示其中各类文件的详细信息。官方文档提供了详细的命令行工具使用指南,帮助开发者快速上手。本文以一个RecyclerView的Adapter代理开源库为例,探讨了如何利用这些工具进行高效的APK分析。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
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社区 版权所有