freemaker学习笔记--设计指导

<# ... > 中存放所有freemaker的内容,之外的内容全部原样输出。
<@ ... /> 是函数调用
两个定界符内的内容中,第一个符号表示指令或者函数名,其后的跟随参数。freemaker提供的控制包括如下:
<#if condition><#elseif condition><#else></#if> 条件判断
<#list hash_or_seq as var></#list> 遍历hash表或者collection(freemaker称作sequence)的成员
<#macro name param1 param2 ... ><#nested param></#macro> 宏,无返回参数
<#function name param1 param2><#return val></#function>函数,有返回参数
var?member_function(...) 用函数对var进行转换,freemaker称为build-ins。实际内部实现类似member_function(var, ...)
stringA[M .. N] 取子字符串,类似substring(stringA, M, N)
{key:value, key2:value2 ...} 直接定义一个hash表
[item0, item1, item2 ...] 直接定义一个序列
hash0[key0] 存取hash表中key对应的元素
seq0[5] 存取序列指定下标的元素
<@function1 param0 param1 ... /> 调用函数function1
<@macro0 param0 param1 ; nest_param0 nest_param1 ...> nest_body <
/@macro > 调用宏,并处理宏的嵌套
<#assign var = value > 定义变量并初始化
<#local var = value> 在 macro 或者 function 中定义局部变量并初始化
<#global var = value > 定义全局变量并初始化
${var} 输出并替换为表达式的值
<#visit xmlnode> 调用macro匹配xmlnode本身及其子节点
<#recurse xmlnode> 调用macro匹配xmlnode的子节点



<#if condition > </#if>
<#list SequenceVar as variable > repeatThis </#list>
<#include "/copyright_footer.html">

一个ftl标记不能放在另外一个ftl标记里面,但是注释标记能够放在ftl标记里面。

系统预定义指令采用<#...></#>
用户自定义指令采用<@...></@>

hash片段可以采用:
products[10..19] or products[5..] 的格式。

序列也可以做加法计算:passwords + {"joe":"secret42"}

缺省值: name!"unknown" 或者 (user.name)!"unknown" 或者 name! 或者 (user.name)!

null值检查: name?? or (user.name)??

转义列表:

Escape sequence

Meaning

/"

Quotation mark (u0022)

/'

Apostrophe (a.k.a. apostrophe-quote) (u0027)

//

Back slash (u005C)

/n

Line feed (u000A)

/r

Carriage return (u000D)

/t

Horizontal tabulation (a.k.a. tab) (u0009)

/b

Backspace (u0008)

/f

Form feed (u000C)

/l

Less-than sign: <

/g

Greater-than sign: >

/a

Ampersand: &

/{

Curly bracket: {

/xCode

Character given with its hexadecimal Unicode code (UCS code)


如果想打印${,则需要将{转义,可以写成"$/{user}",或者可以用生字符(r指令):$(r "${xx}"}

序列构成:<#list ["winter", "spring", "summer", "autumn"] as x>${x}</#list>

不同的对象可以存放在一个序列里面,比如:[2 + 2, [1, 2, 3, 4], "whatnot"]. 第一个是数字,第二个是序列,第三个是字符串。

可用采用start..end的方式来定义一个数字序列,start可以小于end,同时,end也可以省略。

hash取值支持一下四种模式:book.author.name, book["author"].name, book.author.["name"], book["author"]["name"].

特殊变量是指freemaker引擎本身定义的变量。访问时,以.variable_name的语法访问。

变量表达式支持嵌套模式,比如:${"Hello ${user}!"}。

变量表达式在指令中的使用情况:
变量表达式可以在指令中,用“”的方式存在,不如:<#include "/footer/${company}.html">.
但是不允许下面的方式存在: <#if ${isBig}>Wow!</#if>, 正确写法是:<#if isBig>Wow!</#if>.
而且 <#if "${isBig}">Wow!</#if>写法也不正确,因为"${isBig}"返回的是字符串,不是boolean类型。

字符串中取字符或字符串采用以下语法:${user[0]},${user[0..2]} ${user[4..]},${user?string(4)}

序列操作:
   加法:<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user> 但要注意串联之后的读取速度变慢。
   子序列:seq[1..4]

序列和hash的串联都只能用于两个相加,不能有多个相加的模式,hash相加,如果两个相加的hash存在相同的key,则后面会覆盖前面的。

在使用>=或者>时,需要注意一些问题,因为freemaker会将>解释成标记的关闭符,为了解决这个问题,需要在表达式加上括号,比如: <#if (x > y)>. 或者使用 &gt; and &lt符号来代替。

无值变量(包括无该变量,null,返回void,无属性等):unsafe_expr!default_expr or unsafe_expr! or (unsafe_expr)!default_expr or (unsafe_expr)!
缺省值可以是任何类型,不一定是数字,比如:hits!0 或者 colors!["red", "green", "blue"].

如果缺省值忽略,那么将会默认为空串、空序列或者空hash,因为freemarker支持多类型的值。不过要让默认值为0或false,则不能省略缺省值。

非顶层变量的无值处理:
   product.color!"red":只处理product不为空,color为空的缺省值处理,如果product为空,则freemaker会抛出异常。(product.color)!"red":则会处理product为空,color为空,或者没有color属性的无值情况。

无值变量的判断操作:unsafe_expr?? or (unsafe_expr)??

判断变量是否是无值。

普通变量插入方式: ${expression},${3+5);
数字变量插入方式: #{expression} or #{expression; format}:过期。
变量只能用于文本区或者是字符串里面,比如:<h1>Hello ${name}!</h1>以及 <#include "/footer/${company}.html">

数字值的插入:根据缺省的number_format输出,以及可以通过setting来达到设置数字格式的目的,也可以通过内置函数string来改变输出格式。

日期类型的格式设置:date_format, time_format 和 datetime_format


定义宏:
   不带参数:<#macro 宏名>...</#macro>,引用<@宏名 />
   带参数:<#macro 宏名 参数...>...</#macro>,引用<@宏名 参数1=值1.../>,带有参数的宏,调用是参数的值必须和参数的个数相同。当然也可以在宏定义时给参数一些默认值。比如:<#macro greet person color="black">


宏里面的嵌套内容:
<#macro border>
  <table border=4 cellspacing=0 cellpadding=4><tr><td>
    <#nested>
  </tr></td></table>
</#macro> 
在宏的定义body中加入<#nested>指令。嵌套的内容可以是任何正确的ftl块。

宏的本地变量在嵌套内容中是不可见的。

宏定义时,<#nest>指令相当于调用定义的内容,而使用宏时,nest body相当于定义。
<#macro repeat count>
  <#list 1..count as x>
    <#nested x, x/2, x==count>
  </#list>
</#macro>
<@repeat count=4 ; c, halfc, last>
  ${c}. ${halfc}<#if last> Last!</#if>
</@repeat> 


定义变量:
   在模板中定义的变量将会隐藏(不是更改)数据模型根下面的同名的变量。

模板中的3种类型变量:
   1:plain variables,能够在模板中的任何地方访问,一个模板include另外一个模板,也可以访问被包含模板的变量。可以通过assign或者macro指令产生或替换变量。
   如果要访问数据模型中的变量,则可以通过.global来访问:
   <#assign user = "Joe Hider">
   ${user}          <#-- prints: Joe Hider -->
   ${.globals.user} <#-- prints: Big Joe--> 
   2:Local variables,宏定义body中用local指令创建或者替换。
   3:Loop variables:由list指令产生。


namespaces:
<#import "/lib/my_test.ftl" as my> <#-- the hash called "my" will be the "gate" -->
<@my.copyright date="1999-2002"/>
${my.mail} 

设置命名空间里面的变量:<#assign mail="jsmith@other.com" in my>

命名空间与数据模型:命名空间的ftl可以访问数据模型的变量。同样命名空间的变量也会隐藏数据模型中同名的变量。

空白问题:
1:White-space stripping,默认为enabled,清除ftl标记带来的空白以及缩进。处理模板的空白。
2:t, rt, lt指令。
3:ftl的参数strip_text.

用compress directive或者transform来处理输出。
<#compress>...</#compress>:消除空白行。
<@compress single_line=true>.../@compress将输出压缩为一行。

可替换语法:
freemarker可用"["代替"<".在模板的文件开头加上[#ftl].
 
阅读更多
个人分类: freemarker
上一篇Java 中的Annotation全攻略
下一篇java 5 泛型指南
想对作者说点什么? 我来说一句

freemaker学习笔记

2013年01月10日 291KB 下载

freemaker struts2

2013年01月12日 285KB 下载

freemaker全部资料

2013年04月25日 14.27MB 下载

freemaker easy getstart

2011年03月03日 590KB 下载

FreeMaker学习 mvc

2010年06月21日 280KB 下载

freemaker语法

2011年11月25日 82KB 下载

没有更多推荐了,返回首页

关闭
关闭