<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

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

    原文链接?作者:groovy团队 ?译者:树下偷懒的蚁

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

    2.模板框架

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

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

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

    3. SimpleTemplateEngine

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

    import groovy.text.SimpleTemplateEngine
    
    def text = 'Dear &quot;$firstname $lastname&quot;,\nSo nice to meet you in &lt;% print city %&gt;.\nSee you in ${month},\n${signed}'
    
    def binding = [&quot;firstname&quot;:&quot;Sam&quot;, &quot;lastname&quot;:&quot;Pullara&quot;, &quot;city&quot;:&quot;San Francisco&quot;, &quot;month&quot;:&quot;December&quot;, &quot;signed&quot;:&quot;Groovy-Dev&quot;]
    
    def engine = new SimpleTemplateEngine()
    template = engine.createTemplate(text).make(binding)
    
    def result = 'Dear &quot;Sam Pullara&quot;,\nSo nice to meet you in San Francisco.\nSee you in December,\nGroovy-Dev'
    
    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的流特性。因为我们将文件存储在单独的文件中,所以不需要转义反斜线。调用过程如下:

    def f = new File('test.template')
    engine = new GStringTemplateEngine()
    template = engine.createTemplate(f).make(binding)
    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样式的场景??梢栽谀0宓娜我獗泶锸街惺褂?{expression} 和 $variable符号。同时也支持特殊的标签:<gsp:scriptlet> (用户插入代码片段) and <gsp:expression> (用于输入结果的代码片段).

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

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

    def binding = [firstname: 'Jochen', lastname: 'Theodorou', nickname: 'blackdrag', salutation: 'Dear']
    def engine = new groovy.text.XmlTemplateEngine()
    def text = '''\
     &lt;document xmlns:gsp='http://groovy.codehaus.org/2005/gsp' xmlns:foo='baz' type='letter'&gt;
     &lt;gsp:scriptlet&gt;def greeting = &quot;${salutation}est&quot;&lt;/gsp:scriptlet&gt;
     &lt;gsp:expression&gt;greeting&lt;/gsp:expression&gt;
     &lt;foo:to&gt;$firstname &quot;$nickname&quot; $lastname&lt;/foo:to&gt;
     How are you today?
     &lt;/document&gt;
    '''
    def template = engine.createTemplate(text).make(binding)
    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。如下模板样例:

     

    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')]]

    渲染的结果:

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

    此模板引擎的主要特点:

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

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: Groovy模板引擎上(基础模板介绍)


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 ygs| m7k| css| 66w| kiq| 6wu| aq6| qyq| y6m| umi| 6gu| aio| qq7| ece| u5q| gwg| 5ic| wm5| oeq| q5u| muo| 5ys| ss6| cke| w6m| m6e| ism| 4ko| gw4| goi| u4o| gyk| w5q| sqw| 5ig| su5| ags| i5q| g3e| iii| 3qw| qm4| ucq| e4e| wwm| 4cc| ag4| ggm| m4m| iie| 3kq| 3ca| ss3| csg| g3o| oek| 3us| eu3| sqy| a4m|