Groovy模板引擎上(基础模板介绍)

简介:

1.简介
Groovy支持多种方式动态的生成文本譬如:GStrings, printf(基于Java5),MarkupBuilder 。除此之外,模板框架则是非常适用基于静态模板生成文本的应用程序。

2.模板框架

在Groovy中,模板框架包含TemplateEngine抽象基类(引擎必须实现),Template接口(引擎生成的模板必须实现)。

Groovy包含的以下几种模板引擎:

  • SimpleTemplateEngine -基础模板引擎
  • GStringTemplateEngine -将模板作为可写的闭包 (适用于流操作)
  • XmlTemplateEngine -适用于输出XML格式的模板引擎
  • MarkupTemplateEngine – 非常完整优化的模板引擎

3. SimpleTemplateEngine

SimpleTemplateEngine允许在模板中使用类似JSP风格的代码(如下例),脚本和EL表达式。样例

01 import groovy.text.SimpleTemplateEngine
02  
03 def text = 'Dear "$firstname $lastname",\nSo nice to meet you in <% print city %>.\nSee you in ${month},\n${signed}'
04  
05 def binding = ["firstname":"Sam", "lastname":"Pullara", "city":"San Francisco", "month":"December", "signed":"Groovy-Dev"]
06  
07 def engine = new SimpleTemplateEngine()
08 template = engine.createTemplate(text).make(binding)
09  
10 def result = 'Dear "Sam Pullara",\nSo nice to meet you in San Francisco.\nSee you in December,\nGroovy-Dev'
11  
12 assert result == template.toString()

 

然而,通常在模板中混入业务逻辑不是良好的习惯。但是有时一些简单的逻辑是有用的。上述的例子中,我们可以修改一下:

$firstname

可以改为(假设模板已经import了capitalize)

${firstname.capitalize()}

或者这样

<% print city %>

改为:

<% print city == "New York" ? "The Big Apple" : city %>

3.1.高级应用说明

如果直接将模板嵌入到脚本中(如我们上面做的那样),必须小心反斜杠转义。模板中的字符串在传入到模板框架之前需要Groovy解析,而GString表达式以及脚本代码作为Groovy程序的一部分,必须要转义反斜杠。例如,想用引号把 The Big Apple引起来,可以这样做:

<% print city == "New York" ? "\\"The Big Apple\\"" : city %>

相似的,如果想新起一行,我们可以这样用:

\\n

“\n” 可以在静态模板文本中使用,也可以在外部模板文件中使用。同样,如果要显示反斜线本身,要用:

\\\\

在外部文件中:

\\\\

4.GStringTemplateEngine

使用GStringTemplateEngine的方法,和上述的例子有点类似(显示更多的参数)。首先,我们将模板存在文件中:

test.template

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

注意:我们使用out替代print支持GStringTemplateEngine的流特性。因为我们将文件存储在单独的文件中,所以不需要转义反斜线。调用过程如下:

1 def f = new File('test.template')
2 engine = new GStringTemplateEngine()
3 template = engine.createTemplate(f).make(binding)
4 println template.toString()

输入结果如下:

Dear "Sam Pullara",
So nice to meet you in "The Big Apple".
See you in December,
Groovy-Dev

5. XmlTemplateEngine

XmlTemplateEngine适用于输入模板输出结果都是XML样式的场景。可以在模板的任意表达式中使用${expression} 和 $variable符号。同时也支持特殊的标签:<gsp:scriptlet> (用户插入代码片段) and <gsp:expression> (用于输入结果的代码片段).

注解和处理指令在处理的过程中会被移除,同时特殊的XML符号比如:<,>" 和 '会被相应的XML符号转义。输出结果将按照标准的XML输出格式进行缩进。gsp:tags 定义的Xmlns命名空间会被移除但是其他的命名空间将会被保留(可能转换成XML树中等效的结果)。

正常情况下,模板原文件会保存在单独的文件中,但是下面的例子提供一个String类型的XML模板。

01 def binding = [firstname: 'Jochen', lastname: 'Theodorou', nickname: 'blackdrag', salutation: 'Dear']
02 def engine = new groovy.text.XmlTemplateEngine()
03 def text = '''\
04  &lt;document xmlns:gsp='http://groovy.codehaus.org/2005/gsp' xmlns:foo='baz' type='letter'&gt;
05  &lt;gsp:scriptlet&gt;def greeting = &quot;${salutation}est&quot;&lt;/gsp:scriptlet&gt;
06  &lt;gsp:expression&gt;greeting&lt;/gsp:expression&gt;
07  &lt;foo:to&gt;$firstname &quot;$nickname&quot; $lastname&lt;/foo:to&gt;
08  How are you today?
09  &lt;/document&gt;
10 '''
11 def template = engine.createTemplate(text).make(binding)
12 println template.toString()

输出结果如下:

<document type=’letter’> Dearest <foo:to xmlns:foo=’baz’> Jochen &quot;blackdrag&quot; Theodorou </foo:to> How are you today? </document>

6. The MarkupTemplateEngine

此模板引擎主要适用于生成XML风格类似的标记(XML, XHTML, HTML5, …),但是也可以用于生成任意文本。和传统的模板引擎不同的是,此模板引擎基于DSL。如下模板样例:

 

1 xmlDeclaration()
2 cars {
3    cars.each {
4        car(make: it.make, model: it.model)
5    }
6 }

如果用下面的数据模型填充:

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

渲染的结果:

<?xml version='1.0'?> <cars><car make='Peugeot' model='508'/><car make='Toyota' model='Prius'/></cars>

此模板引擎的主要特点:

  • 标记构建器风格的语法
  • 模板编译成字节代码
  • 渲染迅速
  • 可选择的模板数据类型校验
  • 包含
  • 国际化支持
  • 碎片化/布局

  • 转载自 并发编程网 - ifeve.com
相关文章
|
消息中间件 Java 调度
自顶向下学习 RocketMQ(六):定时消息
定时消息会暂存在名为 SCHEDULE_TOPIC_XXXX 的 topic 中,并根据 delayTimeLevel 存入特定的 queue,queueId = delayTimeLevel – 1,即一个 queue 只存相同延迟的消息,保证具有相同发送延迟的消息能够顺序消费。broker 会调度地消费 SCHEDULE_TOPIC_XXXX,将消息写入真实的 topic。
自顶向下学习 RocketMQ(六):定时消息
|
7月前
|
运维 jenkins 测试技术
Websoft9 面板是干什么的?
Websoft9 是一款专注于 Web 应用部署与管理的服务器面板工具,通过自动化脚本和图形化界面简化主流开源软件(如 WordPress、GitLab 等)的安装、配置和管理。它支持一键部署、集中管理和基础运维功能,降低技术门槛,适合个人站长、开发者及中小企业使用。提供丰富的应用市场、跨平台兼容性和完善的文档,帮助企业快速实现业务上线并减少运维成本。
210 1
Websoft9 面板是干什么的?
|
4月前
|
算法 Unix 程序员
程序员行业的学历门槛与天赋密码:揭开大厂招聘的真相·优雅草卓伊凡
程序员行业的学历门槛与天赋密码:揭开大厂招聘的真相·优雅草卓伊凡
157 3
程序员行业的学历门槛与天赋密码:揭开大厂招聘的真相·优雅草卓伊凡
|
前端开发 JavaScript 安全
javascript:void(0);用法及常见问题解析
【6月更文挑战第3天】JavaScript 中的 `javascript:void(0)` 用于创建空操作或防止页面跳转。它常见于事件处理程序和超链接的 `href` 属性。然而,现代 web 开发推荐使用 `event.preventDefault()` 替代。使用 `javascript:void(0)` 可能涉及语法错误、微小的性能影响和XSS风险。考虑使用更安全的替代方案,如返回 false 或箭头函数。最佳实践是保持代码清晰、安全和高性能。
5446 0
|
前端开发 Java Spring
springbootWeb常用注解使用
本文概述了Spring Boot Web中处理HTTP请求的常用注解,包括`@PathVariable`、`@RequestHeader`、`@RequestParam`、`@RequestBody`、`@ModelAttribute`和`@CookieValue`的用法及其示例。
springbootWeb常用注解使用
|
JSON Java 测试技术
jsonpath :从入门到精通
jsonpath :从入门到精通
|
8月前
|
机器学习/深度学习 数据采集 数据可视化
通义灵码2.0实现数据分析小项目
本文介绍了使用通义灵码2.0实现一个数据分析小项目的全过程。从数据清洗、特征分布可视化到构建和评估多个机器学习模型,详细展示了每一步的操作和结果。通过简单的描述和提问,通义灵码2.0能够自动生成并优化代码,极大地简化了开发流程。最终,项目成功完成了数据的分析和预测模型的构建,验证了通义灵码2.0的强大功能和易用性。
通义灵码2.0实现数据分析小项目
|
11月前
|
弹性计算 并行计算 双11
阿里云服务器多少钱一年?看看2024双11优惠价格,太给力了!
2024年双十一期间,阿里云推出多款优惠云服务器配置。轻量应用服务器2核2G、3M带宽、50GB ESSD云盘,仅需36元/年;云服务器ECS 2核2G、3M带宽、40GB ESSD Entry云盘,99元/年;ECS u1实例2核4G、5M带宽、80GB ESSD Entry盘,199元/年。更多配置详见官网。
767 1
|
存储 数据挖掘 Linux
Linux命令split详解:大文件处理的得力助手
`split`命令是Linux用于将大文件分割成小文件的工具,常用于日志处理、备份。它支持按行数(-l)、字节数(-b)分割,并能自定义输出文件名(-a, -d)。例如,`split -b 10M largefile.txt smallfile_`会按10MB切割`largefile.txt`,生成`smallfile_`开头的文件。注意确保磁盘空间充足,避免文件名冲突,并备份原始文件。结合其他命令使用,能提高文件管理效率。
|
XML 前端开发 Java
Spring Boot与Spring MVC的区别和联系
Spring Boot与Spring MVC的区别和联系