博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FreeMarker帮助手册
阅读量:4112 次
发布时间:2019-05-25

本文共 3261 字,大约阅读时间需要 10 分钟。

FreeMarker学习(一)(Ftl)
<# ... > 中存放所有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 <
 > 调用宏,并处理宏的嵌套
<#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  code ( 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)??

判断变量是否是无值。

转载地址:http://xuesi.baihongyu.com/

你可能感兴趣的文章
mac 安装 tomcat 配置
查看>>
linux下正确安装jsoncpp
查看>>
document.body.scrollTop等常见易混淆属性整理
查看>>
基于EasyUI的软件框架打造-树(Tree)封装
查看>>
关于模板该不该用css强制编辑器文本开头空两格
查看>>
KMP 算法实现
查看>>
《图解 HTTP》 学习笔记
查看>>
webpack小白入门之文件监听,热更新,文件指纹,代码压缩【1-4】
查看>>
微信小程序picker隐藏年份
查看>>
快速了解 React Hooks 原理
查看>>
响应式布局
查看>>
百度云下载工具分享
查看>>
spark on yarn任务提交缓慢解决
查看>>
Filco圣手二代双模蓝牙机械键盘的连接方法
查看>>
pyspark学习笔记
查看>>
JDK源码那些事儿之PriorityBlockingQueue
查看>>
Docker那些事儿之镜像创建
查看>>
Docker那些事儿之编排工具docker-compose
查看>>
JDK源码那些事儿之SynchronousQueue上篇
查看>>
JDK源码那些事儿之SynchronousQueue下篇
查看>>