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 |
<document xmlns:gsp= 'https://groovy.codehaus.org/2005/gsp' xmlns:foo= 'baz' type= 'letter' >
|
05 |
<gsp:scriptlet>def greeting = "${salutation}est"</gsp:scriptlet>
|
06 |
<gsp:expression>greeting</gsp:expression>
|
07 |
<foo:to>$firstname "$nickname" $lastname</foo:to>
|
08 |
How are you today?
|
09 |
</document>
|
10 |
'' '
|
11 |
def template = engine.createTemplate(text).make(binding) |
12 |
println template.toString() |
輸出結果如下:
<document type=’letter’> Dearest <foo:to xmlns:foo=’baz’> Jochen "blackdrag" 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
最後更新:2017-05-23 10:02:16