`

FreeMarker指令学习

阅读更多

自己翻译官方文档,有些不大理解的没翻译出来。。由于字数有限,,只能上传附件了。。

附件上还有:FreeMarker中文文档.pdf

FreeMarker_Programmer Guide.pdf  中文版

 

if, else, elseif
语法:
<#if condition>
  ...
<#elseif condition2>
  ...
<#elseif condition3>
  ...
...
<#else>
  ...
</#if>
备注:condition、condition2···必须为boolean 类型,<#elseif ··>、<#else>可有0或多个。
实例:
 <#if x == 1>
  x is 1
<#elseif x == 2>
  x is 2
<#elseif x == 3>
  x is 3
<#elseif x &gt 4>
  x is 4
<#else>
  x is not 1 nor 2 nor 3 nor 4
</#if>   
备注:< 或 > 号 必须转义,否则出错。。转义请参考其他文档。

switch, case, default, break
语法
<#switch value>
  <#case refValue1>
    ...
    <#break>
  <#case refValue2>
    ...
    <#break>
  ...
  <#case refValueN>
    ...
    <#break>
  <#default>
    ...
</#switch>
备注:该指令官方不推荐使用了,可以用if, else, elseif 指令代替。

list, break
语法
<#list sequence as item>
    ...
</#list>
备注: sequence 为一个sequence 或者 collection 类型。item 为 循环的变量。该指令中包含有两个特殊的循环变量,
item_index:该值为当前循环的值。 item_has_next:该值为一个boolean类型,表明该循环是否含有下一个(是否为循环到了最后一个)
实例:
<#assign seq = ["winter", "spring", "summer", "autumn"]>
<#list seq as x>
  ${x_index + 1}. ${x}<#if x_has_next>,</#if>
</#list> 
输出:
  1. winter,
  2. spring,
  3. summer,
  4. autumn   
 实例:
<#assign x=3>
<#list 1..x as i>
  ${i}
</#list>  
备注:当x 为一个数值序列时,可以使用该list 列出两个数值之间的值。(适合于表格的序号填写)
实例:
<#list seq as x>
  ${x}
  <#if x = "spring"><#break></#if>
</#list>
备注:可以用<#if···><#break> 来终止该循环。

include
语法
<#include path>
或者
<#include path options>
备注:
path: 为包含一个文件的路径或者是一个输出为String 类型的表达式。 
options: 一个或多个的参数: encoding=encoding, parse=parse 
encoding: 包含文件解析的编码,如GBK、utf-8等
parse: 为一个boolean 类型值,true为用ftl解析,false为当作text文件解析 (also accepts a few string values for backward compatibility)
实例:
/common/copyright.ftl内容:
Copyright 2001-2002 ${me}<br>
All rights reserved.   
主体内容: 
<#assign me = "Juila Smith">
<h1>Some test</h1>
<p>Yeah.
<hr>
<#include "/common/copyright.ftl">   
 输出   
<h1>Some test</h1>
<p>Yeah.
<hr>
Copyright 2001-2002 Juila Smith
All rights reserved.   
备注:path 可以包含*任意取值,例如:*/copyright.ftl、commons/*/copyright.ftl等,*表示任意路径下的。
该指令具有国际化,如<#include "footer.ftl">, 这个指令的搜索文件的顺序为footer_en_US.ftl,footer_en.ftl,footer.ftl (本地为英国)。

import
语法:
<#import path as hash>
备注:
path:模板的路径名. 
hash: 在该文件中使用该模板指令的名称。
实例:
<#import "/libs/mylib.ftl" as my>
文件中的使用:
<@my.copyright date="1999-2002"/> 

noparse
语法:
<#noparse>
  ...
</#noparse>
备注:该指令包含的文件将不被解析成ftl,而是直接输出。
实例:
Example:
--------
<#noparse>
  <#list animals as being>
  <tr><td>${being.name}<td>${being.price} Euros
  </#list>
</#noparse>   
输出: 
 Example:
--------
  <#list animals as being>
  <tr><td>${being.name}<td>${being.price} Euros
  </#list>

compress
语法:
<#compress>
  ...
</#compress>
备注:该指令将会把数据模型中的空格或者html格式去掉。
实例:
<#assign x = "    moo  \n\n   ">
(<#compress>
  1 2  3   4    5
  ${moo}
  test only

  I said, test only

</#compress>) 
输出:
(1 2 3 4 5
moo
test only
I said, test only)

escape, noescape
语法:
<#escape identifier as expression>
  ...
  <#noescape>...</#noescape>
  ...
</#escape> 
备注:该指令对${```}该指令进行了格式化的输出。
备注:
<#escape x as x?html>
  Customer Name: ${customerName}
  Items to ship:
  <#escape x as itemCodeToNameMap[x]>
    ${itemCode1}
    ${itemCode2}
    ${itemCode3}
    ${itemCode4}
  </#escape>
</#escape>  
相当于:
Customer Name: ${customerName?html}
  Items to ship:
    ${itemCodeToNameMap[itemCode1]?html}
    ${itemCodeToNameMap[itemCode2]?html}
    ${itemCodeToNameMap[itemCode3]?html}
    ${itemCodeToNameMap[itemCode4]?html}

assign
语法:
<#assign name=value>
or
<#assign name1=value1 name2=value2 ... nameN=valueN>
or
<#assign same as above... in namespacehash>
or
<#assign name>
  capture this
</#assign>
or
<#assign name in namespacehash>
  capture this
</#assign>
备注:该指令可以创建或者替换变量为页面使用,该变量为最高的层才能被创建或替换,如foo,当foo.bar时将不能被创建或者替换。
name:变量的名称。value:变量的值。namespacehash:import指令中的引用名。
实例:
<#assign seasons = ["winter", "spring", "summer", "autumn"]> 
<#assign
  seasons = ["winter", "spring", "summer", "autumn"]
  test = test + 1
>
实例:  
<#import "/mylib.ftl" as my>
<#assign bgColor="red" in my>
实例:
 <#macro myMacro>foo</#macro>
<#assign x>
  <#list 1..3 as n>
    ${n} <@myMacro />
  </#list>
</#assign>
Number of words: ${x?word_list?size}
${x} 
输出:
Number of words: 6
    1 foo
    2 foo
    3 foo

global
语法:
<#global name=value>
or
<#global name1=value1 name2=value2 ... nameN=valueN>
or
<#global name>
  capture this
</#global>
备注:该指令相似于assign 指令,只是该指令创建的变量可以被所有命名空间使用。
实例:
<#global x = 1> 
<#assign x = 2>
${x}
${.global.x}
</#assign>
输出:
2
1
备注:如果在当前命名空间中,有同名的变量存在,则global 变量将没隐藏,如需访问则:${.global.x} 

local
语法:
<#local name=value>
or
<#local name1=value1 name2=value2 ... nameN=valueN>
or
<#local name>
  capture this
</#local>
备注:该指令类似 assign 指令,但它创建或者替换了本例变量,它只能在macro定义或者function 定义中有效。

setting
语法:
<#setting name=value>
备注:该指令的设置将影响到该指令设置的地方以下的内容有效。
它提供的设值有:
local:该值为本地的语言,将影响数值、时间等的格式。取值例如:en, en_US, en_US_MAC
number_format:用于将数值转换成String,当没有明确的格式被指定时。
boolean_format:用于将boolean转换成String
date_format,time_format,datetime_format:用于将时间转换成String
time_zone:用于设置时区,如"GMT", "GMT+2", "GMT-1:30", "CET", "PST", "America/Los_Angeles"
url_escaping_charset:
classic_compatible:
实例:
${1.2}
<#setting locale="en_US">
${1.2}  
输出:
1,2
1.2 

User-defined directive (<@...>)
语法:
<@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN/>
(Note the XML-style / before the >)  
or if you need loop variables 
<@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN ; lv1, lv2, ..., lvN/>

Or the same as the above two but with end-tag

<@user_def_dir_exp ...>
  ...
</@user_def_dir_exp>
or
<@user_def_dir_exp ...>
  ...
</@>

Or all above but with positional parameter passing 

<@ val1, val2, ..., valN/>
...etc.
备注:该指令为调用用户自定义的指令,比如macro
实例:
<@list items=["mouse", "elephant", "python"] title="Animals"/>
...
<#macro list title items>
  <p>${title?cap_first}:
  <ul>
    <#list items as x>
      <li>${x?cap_first}
    </#list>
  </ul>
</#macro>  
输出:
  <p>Animals:
  <ul>
      <li>Mouse
      <li>Elephant
      <li>Python
  </ul>
  
...  
实例:
<@myRepeatMacro count=4 ; x, last>
  ${x}. Something... <#if last> This was the last!</#if>
</@myRepeatMacro>  

macro, nested, return
语法:
<#macro name param1 param2 ... paramN>
  ...
  <#nested loopvar1, loopvar2, ..., loopvarN>
  ...
  <#return>
  ...
</#macro>
备注:该指令保存着模板的部分定义,可以用用户指令来调用该指令使用。该指令可以定义在任何地方,不管设定的地方之前或者之后都能使用。也可以指定默认参数的默认值。
实例:
<#macro test foo bar="Bar" baaz=-1>
  Test text, and the params: ${foo}, ${bar}, ${baaz}
</#macro>
<@test foo="a" bar="b" baaz=5*5-2/>
<@test foo="a" bar="b"/>
<@test foo="a" baaz=5*5-2/>
<@test foo="a"/>  
输出:
  Test text, and the params: a, b, 23
  Test text, and the params: a, b, -1
  Test text, and the params: a, Bar, 23
  Test text, and the params: a, Bar, -1
实例:
<#macro img src extra...>
  <img src="/context${src?html}" 
  <#list extra?keys as attr>
    ${attr}="${extra[attr]?html}"
  </#list>
  >
</#macro>
<@img src="/images/test.png" width=100 height=50 alt="Test"/> 
输出:
  <img src="/context/images/test.png"
    alt="Test"
    height="50"
    width="100"
  >  
实例:
<#macro do_thrice>
  <#nested 1>
  <#nested 2>
  <#nested 3>
</#macro>
<@do_thrice ; x>
  ${x} Anything.
</@do_thrice>  
输出:
  1 Anything.
  2 Anything.
  3 Anything.
实例:
<#macro test>
  Test text
  <#return>
  Will not be printed.
</#macro>
<@test/>  
输出:
Test text

function, return
语法:
<#function name param1 param2 ... paramN>
  ...
  <#return returnValue>
  ...
</#function>
备注:该指令创建了一个方法变量,该指令和macro指令类似,只是return 中必须有返回值。
实例:
<#function avg x y>
  <#return (x + y) / 2>
</#function>
${avg(10, 20)}  
输出:
15
实例:
<#function avg nums...>
  <#local sum = 0>
  <#list nums as num>
    <#local sum = sum + num>
  </#list>
  <#if nums?size != 0>
    <#return sum / nums?size>
  </#if>
</#function>
${avg(10, 20)}
${avg(10, 20, 30, 40)}
${avg()!"N/A"}  
输出:
15
25
N/A

flush
语法:
<#flush>
备注:强制输出。虽然FreeMarker会自动的flush 但有些时候要强制flash 的时候可以使用该指令。

stop
语法:
<#stop>
or
<#stop reason>
备注:当FreeMarker要强制终止的时候,可以使用该指令,reason 为自定义终止的原因。

ftl
语法:
<#ftl param1=value1 param2=value2 ... paramN=valueN>
备注:该指令是提供一些参数如果该文件是ftl文件,如果该文件存在则该设置在文件的最开始的地方。
设置的参数有:
encoding:模板的编码,取值为:utf-8、GBK等
strip_whitespace:是否去掉空格。取值为true、false
strip_text:是否去掉最高层的文本,取值为true、false
strict_syntax:是否为严格的语法,取值为true、false
ns_prefixes:
attributes:

t, lt, rt
语法
<#t>  -在该行中忽略所有的空格
<#lt> -在该行中忽略左边的所有空格
<#rt> -在该行中忽略右边的所有空格
<#nt> -不去掉该行的空格

实例:
--
  1 <#t>
  2<#t>
  3<#lt>
  4
  5<#rt>
  6
--  
输出:
--
1 23
  4
  5  6
--  

attempt, recover
语法:
<#attempt>
  attempt block
<#recover>
  recover block
</#attempt>
备注:该指令是一个错误的捕获,和java 中的 try{}catch 相似。<#recover>是修复指令,代替出错的输出文本。
实例:
Primary content
<#attempt>
  Optional content: ${thisMayFails}
<#recover>
  Ops! The optional content is not available.
</#attempt>
Primary content continued  
输出:
如果thisMayFails 变量不存在
Primary content
  Ops! The optional content is not available.
Primary content continued 
如果thisMayFails 变量存在
Primary content
  Optional content: 123
Primary content continued

visit, recurse, fallback
语法:
<#visit node using namespace>
or
<#visit node>
<#recurse node using namespace>
or
<#recurse node>
or
<#recurse using namespace>
or
<#recurse>
<#fallback>
备注:visit 和recurse 指令是用来递归处理树节点的。在实际中,很多情况下是用来处理xml。
实例:
<#-- Assume that nodeWithNameX?node_name is "x" -->
<#visit nodeWithNameX>
Done.
<#macro x>
   Now I'm handling a node that has the name "x".
   Just to show how to access this node: this node has ${.node?children?size} children.
</#macro>  
输出:
Now I'm handling a node that has the name "x".
   Just to show how to access this node: this node has 3 children.
Done.  
实例:
主体
<#import "n1.ftl" as n1>
<#import "n2.ftl" as n2>

<#-- This will call n2.x (because there is no n1.x): -->
<#visit nodeWithNameX using [n1, n2]>

<#-- This will call the x of the current namespace: -->
<#visit nodeWithNameX>

<#macro x>
  Simply x
</#macro>
  
n1.ftl
<#macro y>
  n1.y
</#macro>

 n2.ftl:  
 <#macro x>
  n2.x
  <#-- This will call n1.y, becuase it inherits the "using [n1, n2]" from the pending visit call: -->
  <#visit nodeWithNameY>
  <#-- This will call n2.y: -->
  <#visit nodeWithNameY using .namespace>
</#macro>

<#macro y>
  n2.y
</#macro>   
 输出:
 n2.x
  n1.y
  n2.y

  Simply x

 

分享到:
评论
3 楼 wq13480 2010-01-11  
加上目录就更好了.
2 楼 zdz8207 2009-11-06  
博主总结得非常好,虽然我用了很久freemarker了,但还有很多地方是没有用过的,非常感谢!
1 楼 javacto 2009-10-21  

相关推荐

    FreeMarker相关学习文档

    1. 模板:模板是FreeMarker的核心,它是HTML或其他文本文件,其中包含特定的FreeMarker指令和变量,这些元素在运行时会被数据模型中的值替换。 2. 数据模型:数据模型是Java对象的集合,它提供模板需要的数据。...

    freemarker学习资料汇总

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

    freemarker中文学习资料

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

    freemarker格式化缩进文本或include指令

    要实现这个功能,开发者通常需要自定义一个FreeMarker指令或使用已有的扩展库。例如,`FormatDirective.java`可能就是一个实现了自定义格式化的指令。在自定义指令中,你可以根据需要处理模板输出的文本,添加适当的...

    freemarker的学习资料、架包、源码

    在学习FreeMarker的过程中,了解其基本概念和工作原理至关重要。FreeMarker模板是由HTML或XML格式的静态内容与动态内容标记(通常以`&lt;#...&gt;`和`${...}`表示)组成。动态内容由Java代码提供,而模板引擎负责将这些...

    FreeMarker学习资料

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

    freemarker学习资料

    在这个例子中,`${user}`和`${latestProduct.url}`、`${latestProduct.name}`是FreeMarker指令,它们将在运行时被数据模型中的实际值替换。数据模型可以包含各种对象,如字符串、数字、日期、布尔值以及更复杂的数据...

    freeMarker学习入门

    模板是包含FreeMarker指令的文件,这些指令通常以`${...}`形式出现,用于在生成最终输出时被数据模型中的实际值替换。例如,以下模板展示了如何将用户名和最新产品的信息插入到HTML中: ```html &lt;title&gt;Welcome!...

    Freemarker入门学习资料

    通过深入学习"Freemarker入门学习资料"中的内容,你可以掌握Freemarker的基本使用、语法特性、与Spring的整合方法,以及最佳实践,从而有效地进行Web应用的视图层开发。记得实践中不断探索和优化,提升模板设计和...

    freemarker学习例子

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

    FreeMarker学习指南

    在FreeMarker的工作流程中,模板是HTML或其他文本文件,其中包含特定的指令,通常是用`${...}`包裹的数据引用。这些指令在运行时会被实际的数据值所替换。例如,模板中的`&lt;h1&gt;Welcome ${user}!&lt;/h1&gt;`会在运行时用...

    FreeMarker学习代码小结

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

    FreeMarker学习资料整理

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

    SSH freemarker例子学习 拿来就能用 注释全面

    FreeMarker提供了丰富的内置指令和函数,如`#if`、`#foreach`、`#set`等,使得模板可以进行条件判断、循环和变量操作。此外,FreeMarker支持国际化、模板继承、宏定义等功能,增强了其灵活性和可维护性。 总之,SSH...

    freemarker Demo 适用于freemarker初学

    Freemarker是一个强大的模板引擎,常用于JavaEE应用中的视图层处理,尤其与Struts2等MVC框架配合使用,能实现灵活的动态页面...在学习过程中,可以逐步尝试不同的表达式、控制结构和内置功能,加深对Freemarker的理解。

    Freemarker学习资料

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

    freemarker

    3. **Freemarker指令(Directives)**:这些是控制流程或结构的特殊标记,如`&lt;#if&gt;`、`&lt;#foreach&gt;`、`&lt;#assign&gt;`等。它们允许你在模板中进行条件判断、循环和变量赋值。 4. **内置函数(Built-in Functions)**:...

    freemarker 源码、中文API、 freemarker Myeclipse 编辑器

    通过这份手册,你可以了解到Freemarker的语法、指令、内置对象以及如何与Java代码进行交互等核心概念。例如,Freemarker支持控制结构(如if、foreach)、变量表达式、函数调用等,这些都是构建动态页面的基础。同时...

Global site tag (gtag.js) - Google Analytics