freemarker

freemarker中exist,default说明
<#if s?exists> 
${s?if_exists} 
exists用在逻辑判断,而if_exists用来打印东西时用到,如果存在打印,不存在打印空字符串. 
exp1?exists将会被exp1??代替 
exp1?if_exists将会被exp1!代替 
exp1?default(exp2)将会被exp1!exp2.


FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的
如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息
FreeMarker会忽略FTL标记中的空白字符, 但是,<、</和指令之间不允许有空白字符
局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量

==================序列=================
序列:由逗号分隔的子变量列表,由方括号限定,索引从0开始
例如: <#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>
可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],但是更有效率,注意数字范围没有方括号,可以定义反递增的数字范围,如5..2

序列片断:使用[startIndex..endIndex]语法,从序列中获得序列片断(也是序列);startIndex和endIndex是结果为数字的表达式

=====. 子串 ===============================
假设user的值为”tom cat”
${user[0]}${user[4]} ? tc
${user[1..4]} ? om c


===================散列=================
散列(hash):由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔
例如:{"name":"green mouse", "price":150}
 键和值都是表达式,但是键必须是字符串

${..}只能用于文本部分,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:
<#if isBig>Wow!</#if>

====================算术运算=============
+、-、×、/、%,下面是一个例子:
avg 求平均值
${avg(3,5,20)} ${avg(student.zhangyaang.age,student.situ.age)}
${x * x - 100}
${x / 2}
${12 % 10}

操作符两边必须是数字,因此下面的代码是错误的:
${3 * "5"} <#-- WRONG! --> 
使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串,例如:
${3 + "5"} 
输出结果是:
35

使用内建的int(后面讲述)获得整数部分,例如:
${(x/2)?int} 输出结果是(假设x为5)2

=================== 比较操作符=============
使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等
=和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起错误
Freemarker是精确比较,所以对"x"、"x  "和"X"是不相等的
对数字和日期可以使用<、<=、>和>=,但不能用于字符串
由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x > y)>
另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=

===================逻辑操作符===============
&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误

================== 内建函数=================
内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,下面列出常用的一些函数
---------------字符串使用的:
html:对字符串进行HTML编码
cap_first:使字符串第一个字母大写
lower_case:将字符串转换成小写
upper_case:将字符串转换成大写
trim:去掉字符串前后的空白字符
-------------序列使用的:
size:获得序列中元素的数目
-------------数字使用的:
int:取得数字的整数部分(如-1.9?int的结果是-1)

=======================操作符优先顺序==============
操作符组 操作符
后缀 [subvarName] [subStringRange]. (methodParams)
一元 +expr、-expr、!
内建 ?
乘法 *、 / 、%
加法 +、-
关系 <、>、<=、>=(lt、lte、gt、gte)
相等 ==(=)、!=
逻辑and &&
逻辑or ||
数字范围 ..


====================插值 Interpolation=============
Interpolation有两种类型:
通用Interpolation:${expr}
数字Interpolation:#{expr}或#{expr; format}
注意:Interpolation只能用于文本部分
通用Interpolation ,插入字符串值:直接输出表达式结果
插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
<#setting number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string}  <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
输出结果是:
$42.00
$42.00
42
$42.00
4,200%

插入日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}

插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
<#assign foo=true/>
${foo?string("yes", "no")}
输出:yes

数字Interpolation的#{expr; format}形式可以用来格式化数字,format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
例如:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2}   <#-- 2.58 -->
#{y; M2}   <#-- 4    -->


===============string============
--截取字符串
exp?substring(from,toExclusive)
exp?substring(from)

--第一个单词的首字母大写
exp?cap_first
例如:${"greEN mouse"?cap_first} 输出:GreEN mouse

--取消第一个单词的首字母大写
exp?uncap_first

--所有单词的首字母大写
capitalize
例如: ${"  green  mouse"?capitalize} 输出:  Green Mouse

--字符串转换成日期时间值
date, time, datetime
例如:
<#assign test1 = "10/25/1995"?date("MM/dd/yyyy")>
<#assign test2 = "15:05:30"?time("HH:mm:ss")>
<#assign test3 = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")>
${test1}
${test2}
${test3}
输出:
Oct 25, 1995
3:05:30 PM
Oct 25, 1995 3:05:00 PM
也可以不带格式化参数,将按照默认的格式显示
例如:<#assign test1 = "Oct 25, 1995"?date>
<#assign test2 = "3:05:30 PM"?time>
<#assign test3 = "Oct 25, 1995 03:05:00 PM"?datetime>

--判断字符串以什么字符串结束
ends_with 返回Boolean值
例如:"redhead"?ends_with("head") 返回:true

--判断字符串以什么字符串开始
starts_with 返回Boolean值

--逃逸字符
< ======== &lt;
> ======== &gt;
& ======== &amp;
" ======== &quot;
\ ======== \\
{ ======== \{
} ======== \}
\n 换行(u000A)
\r Return (u000D)
\t Tab (u0009)
\b Backspace (u0008)
\f Form feed (u000C)
\l <
\g >
\a &

 


--获取字符串在字符串中的下标索引,索引值从0开始
index_of
例如:"abcabc"?index_of("bc")      输出:1
      "abcabc"?index_of("bc",2)    输出:4

--取最后匹配的字符串的索引
last_index_of
例如:"abcabc"?last_index_of("ab")  输出:3
"abcabc"?last_index_of("ab", 2) 输出:0

--根据java语言的转义字符串规则转义字符串
j_string
例如:<#assign beanName = 'The "foo" bean.'>
String BEAN_NAME = "${beanName?j_string}";
输出:String BEAN_NAME = "The \"foo\" bean.";

--根据javascript语言的转义字符串规则转义字符串
js_string
例如:
<#assign user = "Big Joe's \"right hand\"">
<script>
  alert("Welcome ${user?js_string}!");
</script>
输出:
<script>
  alert("Welcome Big Joe\'s \"right hand\"!");
</script>


--取字符串的长度
length

--将字符串转换成小写
lower_case
例如:"GrEeN MoUsE"?lower_case  输出:"green mouse"

--将字符串转换成大写
upper_case

--左补齐
left_pad 补齐的长度大于等于number
例如:
[${""?left_pad(5)}]
[${"a"?left_pad(5)}]
[${"abcdefg"?left_pad(5)}]
输出:
[     ]
[    a]
[abcdefg]
[abcdefg]
可以指定补齐的字符
[${"a"?left_pad(5, "-")}]
输出:[----a]

--右补齐
right_pad

--判断是否包含某个字符串
contains
例如:<#if "piceous"?contains("ice")>It contains "ice"</#if>
输出:  
It contains "ice" 
 
--匹配正则表达式
matches 返回boolean值
例如:"fooo"?matches('fo*') 返回:true

--字符串转换成数字
number

--替换字符串
replace
例如:  
 ${"this is a car acarus"?replace("car", "bulldozer")}
输出:this is a bulldozer abulldozerus

--字符串拆分
split
例如:
<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list> 
输出:
- some
- test
- text

--去除前后的空格
trim
例如: (${"  green mouse  "?trim})  输出:(green mouse)

--word_list
例如:  
<#assign words = "   a bcd, .   1-2-3"?word_list>
<#list words as word>[${word}]</#list>
输出:[a][bcd,][.][1-2-3]

==================数字=====================
将数字转换成字符串
string
例如: <#assign answer=42/>
${answer}
${answer?string}  <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent} 
输出:
42
42
42
$42.00
4,200% 
 
================日期时间=================
将日期时间转换成指定格式的字符串
string
例如:
${openingTime?string.short}
${openingTime?string.medium}
${openingTime?string.long}
${openingTime?string.full}
输出:
12:45 PM
12:45:09 PM
12:45:09 PM CEST
12:45:09 PM CEST

备注:date(年月日), time(时间), datetime(年月日+时间)

==============booleans ==================
将逻辑boolean值转换成字符串
string
例如:foo?string 输出:"true"
foo?string("yes", "no") 输出:"yes"

================序列 sequences=============
--取序列的第一个变量
first 如果序列为空将报错

--取序列的最后一个变量
last 如果序列为空将报错

--序列中是否包含某个变量
seq_contains
例如:<#assign x = ["red", 16, "blue", "cyan"]>
"blue": ${x?seq_contains("blue")?string("yes", "no")}
输出:"blue": yes

--取变量在序列中首次出现的索引值
seq_index_of
例如:
<#assign colors = ["red", "green", "blue"]>
${colors?seq_index_of("blue")}
输出:2

--取变量在序列中末次出现的索引值
seq_last_index_of

--序列顺序翻转
reverse

--返回序列的大小
size

--升序排列序列
sort
例如:<#assign ls = ["whale", "Barbara", "zeppelin", "aardvark", "beetroot"]?sort>
<#list ls as i>${i} </#list> 
输出:aardvark Barbara beetroot whale zeppelin

--按照关键字升序排列序列
sort_by
例如:
<#assign ls = [
  {"name":"whale", "weight":2000},
  {"name":"Barbara", "weight":53},
  {"name":"zeppelin", "weight":-200},
  {"name":"aardvark", "weight":30},
  {"name":"beetroot", "weight":0.3}
]>
Order by name:
<#list ls?sort_by("name") as i>
- ${i.name}: ${i.weight}
</#list>

Order by weight:
<#list ls?sort_by("weight") as i>
- ${i.name}: ${i.weight}
</#list> 

--将序列分成多组
chunk
例如:
<#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']>

<#list seq?chunk(4) as row>
  <#list row as cell>${cell} </#list>
</#list>

<#list seq?chunk(4, '-') as row>
  <#list row as cell>${cell} </#list>
</#list> 
输出:
  a b c d
  e f g h
  i j

  a b c d
  e f g h
  i j - -

==================== hashes==========
keys--取关键字
例如:
<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list> 
输出: 
 name = mouse; price = 50;

values--取value值


=====================其他插件方法=======
--表达式运算
eval
例如:"1+2"?eval  输出:3

--判断变量的类型
Built-in Returns true if the value is a ...
is_string string
is_number number
is_boolean boolean
is_date date (all types: date-only, time-only and date-time)
is_method method
is_transform transform
is_macro macro
is_hash hash
is_hash_ex extended hash (i.e. supports ?keys and ?values)
is_sequence sequence
is_collection collection
is_enumerable sequence or collection
is_indexable sequence
is_directive macro or transform
is_node node

##################指令参考################
===============if, else, elseif===========
<#if condition>
  ...
<#elseif condition2>
  ...
<#elseif condition3>
  ...
...
<#else>
  ...
</#if>

================switch, case, default, break===========
<#switch value>
  <#case refValue1>
    ...
    <#break>
  <#case refValue2>
    ...
    <#break>
  ...
  <#case refValueN>
    ...
    <#break>
  <#default>
    ...
</#switch>

=================list, break======================
<#list sequence as item>
    ...
</#list>

<#list seq as x>
  ${x}
  <#if x = "spring"><#break></#if>
</#list>

<#list students[0..5] as s_list></#list>取list的前5条记录 

list项的索引 xxx_index 索引值从0开始
判断是否有下一项 xxx_has_next
例如:
<#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
 
=====================include=================
<#include filename>
or
<#include filename options>
options:含两项encoding=encoding, parse=parse
encoding 编码字符串 parse 是否解析模板

=====================import=================
<#import path as hash>


===============noparse===================
<#noparse>
  ...
</#noparse>
不解析某段文字
例如:
<#noparse>
  <#list animals as being>
  <tr><td>${being.name}<td>${being.price} Euros
  </#list>
</#noparse> 
输出:
<#list animals as being>
  <tr><td>${being.name}<td>${being.price} Euros
  </#list>


=======================compress=====================
<#compress>
  ...
</#compress>
去掉多余的空格和换行
例如:
<#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)

=====================定义变量 给变量赋值 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>

==============定义全局变量 赋值 global===========
<#global name=value>
or
<#global name1=value1 name2=value2 ... nameN=valueN>
or
<#global name>
  capture this
</#global>

===============setting 设置freemarker的系统变量=================
<#setting name=value>

===================去除空格============
<#t> <#lt> <#rt> <#nt> 成对使用 类似 trim方法


##################freemarker中的保留字###################
true: boolean value ``true''
false: boolean value ``false''
gt: comparison operator ``greater than''
gte: comparison operator ``greater than or equivalent''
lt: comparison operator ``less than''
lte: comparison operator ``less than or equivalent''
as: used by a few directives
in: used by a few directives
using: used by a few directives


========================注释comment=============
 旧格式:<#--...-->
新格式:
<#comment> .........</#comment>

=====================循环foreach===============
<#foreach item in sequence>
类似于:<#list sequence as item>.

==================默认值default===================
exp1?default(exp2)
类似于原来的 exp1!exp2

===============判断变量是否存在exists if_exists==============
exists 老版本中 (exp1)?exists
if_exists 新版本中 (exp1)?if_exists

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值