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

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

      freemarker资料汇总

      最后,基础语法的文本文件《Freemarker基础语法.txt》和《Freemarker学习归纳 .txt》是对Freemarker核心语法的精炼总结,方便初学者快速入门。这些文件可能包括变量、表达式、控制流、注释等基本元素,是学习...

      springboot学习思维笔记.rar

      这份"springboot学习思维笔记"很可能是对SpringBoot核心概念、特性、以及如何进行有效学习的一系列整理和归纳,通常包括思维导图(xmind)形式的概览和详细的文本说明。 1. **SpringBoot基础知识** - **自动配置**...

      JAVA工程师年度总结.pdf

      我曾熟悉并应用SSH框架(Struts、Spring、Hibernate),在表现层使用FreeMarker和JSP。在实际项目中,我运用SpringMVC框架开发了针对XXX行业的管理系统。尽管如此,我也意识到自身在某些领域的不足,例如未使用过...

      Hadoop+Django+Hive+Vue电商数据分析及推荐系统答辩PPT.pptx

      本文通过Python编程语言,利用爬虫技术定向抓取相关网站内容,并进行文本挖掘、关键信息抽取、分类与归纳,以实现统计分析。此外,还使用Python进行关联分析,设计并编写了相应的电商数据分析及推荐系统。该系统具有...

      基于java的大学宿舍管理系统毕业设计外文翻译及[管理资料].docx

      根据提供的文档信息,我们可以归纳出以下几个关键的知识点: ### 一、Java在大学宿舍管理系统中的应用 #### 1. Java技术概述 Java是一种广泛使用的面向对象编程语言,它以其跨平台性和安全性而闻名。Java技术在...

      IT实训报告

      实训总结不仅归纳了整个项目的学习成果,还反思了不足之处,为后续的改进提供了方向。 ### 项目部署简单说明 项目部署说明提供了系统上线前的准备步骤,包括环境配置、安装指南和操作流程,确保系统能顺利运行于...

      SpringBoot专栏教程-邮件.pdf

      根据提供的文件信息,我们可以归纳出一系列与Spring Boot相关的知识点,主要围绕邮件功能展开的可能性较低,因为文件内容更多地涉及Spring Boot的基础概念、Web开发、数据访问等主题。下面将基于这些信息来提炼出...

      spring开发视频高级教程.txt

      下面将根据标题、描述、标签及部分可见内容来归纳总结几个关键的知识点。 ### Spring框架概述 Spring框架最初由Rod Johnson创建,旨在简化企业级Java应用程序的开发。Spring框架的核心特性包括依赖注入...

      Struts2.1+Spring3.0+JPA1.0 .pdf

      根据提供的文件信息,我们可以归纳出以下关键知识点,主要聚焦于Struts2框架的学习与应用: ### Struts2框架概述 **Struts2** 是一个基于Java的开源Web应用程序框架,它继承了Struts1的优点,并引入了许多新特性,...

    Global site tag (gtag.js) - Google Analytics