`
smile6688
  • 浏览: 11958 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Freemarker学习归纳(三)

阅读更多
4.FreeMarker 3 宏/模板
宏Macro
宏是在模板中使用macro指令定义
l.1 基本用法
宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:
<#macro greet>
  Hello Joe!
调用宏时,与使用FreeMarker的其他指令类似,只是使用@替代FTL标记中的#。
<@greet></@greet> <#--<@greet/>-->
在macro指令中可以在宏变量之后定义参数,如:
<#macro greet person>
  Hello ${person}!
可以这样使用这个宏变量:
<@greet person="Fred"/>
但是下面的代码具有不同的意思:
<@greet person=Fred/>
这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式。
宏可以有多参数,下面是一个例子:
<#macro greet person color>
  Hello ${person}!
可以这样使用该宏变量,其中参数的次序是无关的:
<@greet person="Fred" color="black"/>
可以在定义参数时指定缺省值,否则,在调用宏的时候,必须对所有参数赋值:
<#macro greet person color="black">
  Hello ${person}!
注意:宏的参数是局部变量,只能在宏定义中有效。
嵌套内容
FreeMarker的宏可以有嵌套内容,<#nested>指令会执行宏调用指令开始和结束标记之间的模板片断,举一个简单的例子:
<#macro border>
 
    <#nested>
 
执行宏调用:
<@border>The bordered text</@border>
输出结果:
    The bordered text
 
<#nested>指令可以被多次调用,每次都会执行相同的内容。
<#macro do_thrice>
  <#nested>
  <#nested>
  <#nested>
<@do_thrice>
  Anything.
FMPP 输出结果:
Anything.
Anything.
Anything.
嵌套内容可以是有效的FTL,下面是一个有些复杂的例子,我们将上面三个宏组合起来:
<@border>
 
  <@do_thrice>
   
  • <@greet person="Joe"/>
  •  
    输出结果:
     
       
  • Hello Joe!
  •    
  • Hello Joe!
  •    
  • Hello Joe!
  •  
     
    宏定义中的局部变量对嵌套内容是不可见的,例如:
    <#macro repeat count>
      <#local y = "test">
      <#list 1..count as x>
        ${y} ${count}/${x}: <#nested>
     
    <@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat>
    输出结果:
    test 3/1: ? ? ?
    test 3/2: ? ? ?
    test 3/3: ? ? ?
    在宏定义中使用循环变量
    nestted指令也可以有循环变量(循环变量的含义见下节),调用宏的时候在宏指令的参数后面依次列出循环变量的名字,格式如下:
    <@ macro_name paramter list; loop variable list[,]>
    例如:
    <#macro repeat count>
      <#list 1..count as x>
        <#nested x, x/2, x==count>
     
    <@repeat count=4 ; c, halfc, last>
      ${c}. ${halfc}<#if last> Last!
    这里count是宏的参数,c, halfc,last则为循环变量,输出结果:
    1. 0.5
      2. 1
      3. 1.5
      4. 2 Last!
    循环变量和宏标记指定的不同不会有问题,如果调用时少指定了循环变量,那么多余的值不可见。调用时多指定了循环变量,多余的循环变量不会被创建:
    <@repeat count=4 ; c, halfc, last>
      ${c}. ${halfc}<#if last> Last!
    <@repeat count=4 ; c, halfc>
      ${c}. ${halfc}
    <@repeat count=4>
      Just repeat it...
    在模板中定义变量
    在模板中定义的变量有三种类型:
    plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。
    局部变量:在宏定义体中有效,使用local指令创建和替换。
    循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量
    局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量,下面是一个例子:
    <#assign x = "plain">
     
    ${x}  <#-- we see the plain var. here -->

    <@test/>
    6. ${x}  <#-- the value of plain var. was not changed -->
    <#list ["loop"] as x>
        7. ${x}  <#-- now the loop var. hides the plain var. -->
        <#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here -->
        8. ${x}  <#-- it still hides the plain var. -->
    9. ${x}  <#-- the new value of plain var. -->
    <#macro test>
      2. ${x}  <#-- we still see the plain var. here -->
      <#local x = "local">
      3. ${x}  <#-- now the local var. hides it -->
      <#list ["loop"] as x>
        4. ${x}  <#-- now the loop var. hides the local var. -->
     
      5. ${x}  <#-- now we see the local var. again -->
    输出结果:
    1. plain
      2. plain
      3. local
      4. loop
      5. local
      6. plain
      7. loop
      8. loop
      9. plain2
    内部循环变量隐藏同名的外部循环变量,如:
    <#list ["loop 1"] as x>
      ${x}
      <#list ["loop 2"] as x>
        ${x}
        <#list ["loop 3"] as x>
          ${x}
       
        ${x}
     
      ${x}
    输出结果:
    loop 1
        loop 2
          loop 3
        loop 2
      loop 1
    模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用特殊变量global,下面的例子假设数据模型中的user的值是Big Joe:
    <#assign user = "Joe Hider">
    ${user}          <#-- prints: Joe Hider -->
    ${.globals.user} <#-- prints: Big Joe -->
    名字空间
    通常情况,只使用一个名字空间,称为主名字空间,但为了创建可重用的宏、变换器或其它变量的集合(通常称库),必须使用多名字空间,其目的是防止同名冲突
    创建库
    下面是一个创建库的例子(假设保存在lib/my_test.ftl中):
    <#macro copyright date>
     

    Copyright (C) ${date} Julia Smith. All rights reserved.

     
    Email: ${mail}

     

     
    <#assign mail = "jsmith@acme.com">
    使用import指令导入库到模板中,Freemarker会为导入的库创建新的名字空间,并可以通过import指令中指定的散列变量访问库中的变量:
    <#import "/lib/my_test.ftl" as my>
    <#assign mail="fred@acme.com">
    <@my.copyright date="1999-2002"/>
    ${my.mail}
    ${mail}
    输出结果:

    Copyright (C) 1999-2002 Julia Smith. All rights reserved.

    可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间。还可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子:
    <#import "/lib/my_test.ftl" as my>
    ${my.mail}
    <#assign mail="jsmith@other.com" in my>
    ${my.mail}
    输出结果:
    数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库:
    <#macro copyright date>
     

    Copyright (C) ${date} ${user}. All rights reserved.

    <#assign mail = "${user}@acme.com">
    假设数据模型中的user变量的值是Fred,则下面的代码:
    <#import "/lib/my_test.ftl" as my>
    <@my.copyright date="1999-2002"/>
    ${my.mail}
    输出结果:

    Copyright (C) 1999-2002 Fred. All rights reserved.

    Fred@acme.com
    分享到:
    评论

    相关推荐

      freemarker学习资料汇总

      本压缩包集合了丰富的Freemarker学习资源,涵盖从基础到进阶的各种知识点,以下是这些文档中可能包含的详细内容: 1. **Freemarker中文手册.pdf**: 这份手册通常会详细介绍Freemarker的基本概念,如模板语言、...

      Freemarker学习归纳

      Freemarker是一个强大的模板引擎,常用于Web应用中的视图层渲染,特别是在Java环境中与Spring框架结合使用广泛。本篇文章将深入探讨Freemarker的基本概念、语法特性、使用场景以及最佳实践,帮助读者全面理解并掌握...

      FreeMarker相关学习文档

      三、FreeMarker的常用语法 1. 输出表达式:`${expression}`,用于输出数据模型中的值。 2. 条件语句:`&lt;#if&gt;...&lt;#else&gt;...&lt;#endif&gt;`,用于条件判断。 3. 循环结构:`&lt;#foreach item in list&gt;`,遍历列表或数组。 4. ...

      freemarker学习

      Freemarker的核心思想是将数据模型与模板结合,通过模板来呈现准备好的数据。 在开始使用Freemarker之前,你需要先下载相关的jar包。你可以访问FreeMarker的官方网站...

      Freemarker学习笔记

      Freemarker学习笔记可以帮助初学者了解,快速掌握Freemarker

      FreeMarker学习资料

      ### FreeMarker 学习资料详解 #### 一、FreeMarker 模板文件构成 FreeMarker 是一种用于生成动态文档的工具,它通过结合固定的文本、注释、变量(插值)以及指令(FTL标签)来创建动态内容。具体而言,FreeMarker ...

      freemarker学习资料

      在快速入门中,我们看到FreeMarker的基本工作原理是通过模板中的特定指令,如`${...}`,将动态数据插入到静态模板中。例如,以下模板展示了如何欢迎用户并显示最新产品的信息: ```html &lt;title&gt;Welcome! &lt;h1&gt;...

      freemarker中文学习资料

      这个“freemarker中文学习资料”压缩包提供了详尽的网页版API文档,对于想要深入理解和掌握Freemarker的开发者来说,是一份非常宝贵的资源。 1. **Freemarker基础概念** - **模板语言**:Freemarker使用一种简单的...

      FreeMarker 学习手册

      FreeMarker 学习手册 详细介绍FreeMarker模板技术的手册

      freemarker学习例子

      这个“freemarker学习例子”应该包含了一些基础到进阶的Freemarker用法,帮助初学者快速上手。 在Freemarker中,主要涉及以下几个核心概念: 1. **模板(Templates)**:模板是Freemarker的核心,它是HTML或其他文本...

      FreeMarker学习代码小结

      在本篇文章中,我们将深入探讨FreeMarker的学习要点,包括其基本概念、语法以及实际应用。 一、基本概念 1. 模板(Template):FreeMarker的中心是模板文件,它是一种特殊的文本文件,包含固定文本和变量。变量是由...

      freemarker官方中文帮助文档

      学习这个中文帮助文档,你将能够熟练地创建和管理Freemarker模板,更好地实现视图层与后端逻辑的解耦,提升开发效率。同时,文档还可能涵盖高级特性,如自定义指令和函数,以及与其他技术(如Spring MVC)的集成。...

      FreeMarker学习资料整理

      下面,我们将深入探讨FreeMarker的基础知识、应用场景以及如何进行学习。 1. **基础概念** - **模板**:FreeMarker的核心是模板,它是由开发者编写的HTML或XML文件,其中嵌入了特定的FreeMarker语法,用于动态生成...

      FreeMarker学习指南

      FreeMarker的核心理念是将设计者的职责与程序员的职责分开,设计者专注于创建模板,而程序员负责处理数据模型,两者通过FreeMarker协同工作。 FreeMarker不依赖于特定的Web容器或HTTP协议,这意味着它可以被集成到...

      Freemarker学习总结.pdf

      三、字符串操作函数: 1. `substring(start, [end])`:从字符串中截取子串。`start`是起始索引,`end`是结束索引(可选,若省略则默认为字符串长度)。注意索引从0开始。 2. `cap_first`:将字符串的第一个单词的首...

      Freemarker学习资料

      Freemarker是一个强大的模板引擎,常用于Java Web开发中生成...通过学习和掌握Freemarker,开发者能够更高效地构建动态页面,实现数据与视图的解耦。在实际项目中,结合具体业务需求和最佳实践,能够更好地发挥其优势。

      freeMarker学习入门

      FreeMarker 是一个强大的模板引擎,主要用于生成HTML或其他类型的文本输出,尤其在Web开发中被...通过学习FreeMarker,开发者可以更好地实现MVC架构中的视图层,提高开发效率,并创建出更加灵活、可维护的Web应用程序。

      freemarker 自定义freeMarker标签

      本篇将深入探讨如何自定义FreeMarker标签,以扩展其功能并适应特定项目需求。 首先,理解FreeMarker的默认标签语法至关重要。FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件...

    Global site tag (gtag.js) - Google Analytics