freemarker
struts2与FreeMarker整合提供的内建变量如下:
名称作用
stack值栈本身,方便使用${stack.findString('ognlexpr')}的方式调用
action最近执行的action
responseHttpServletResponse
res与response相同
requestHttpServletRequest
req与reqeust相同
sessionHttpSession
applicationServletContext
baserequest的上下文路径(contextpath)
freemarker中exist,default说明
<#ifs?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"]asx>
${x}
</#list>
可以使用数字范围定义数字序列,例如2..5等同于[2,3,4,5],但是更有效率,注意数字范围没有方括号,可以定义反递增的数字范围,如5..2
序列片断:使用[startIndex..endIndex]语法,从序列中获得序列片断(也是序列);startIndex和endIndex是结果为数字的表达式
=====.子串===============================
假设user的值为”tomcat”
${user[0]}${user[4]}?tc
${user[1..4]}?omc
===================散列=================
散列(hash):由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔
例如:{"name":"greenmouse","price":150}
键和值都是表达式,但是键必须是字符串
${..}只能用于文本部分,下面的代码是错误的:
<#if${isBig}>Wow!</#if>
<#if"${isBig}">Wow!</#if>
应该写成:
<#ifisBig>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
===================比较操作符=============
使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等
=和!=两边必须是相同类型的值,否则会产生错误,例如<#if1="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
例如:
<#settingnumber_format="currency"/>
<#assignanswer=42/>
${answer}
${answer?string}<#--thesameas${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-ddHH:mm:sszzzz")}
${lastUpdated?string("EEE,MMMd,''yy")}
插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
<#assignfoo=true/>
${foo?string("yes","no")}
输出:yes
数字Interpolation的#{expr;format}形式可以用来格式化数字,format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
例如:
<#assignx=2.582/>
<#assigny=4/>
#{x;M2}<#--2.58-->
#{y;M2}<#--4-->
===============string============
--截取字符串
exp?substring(from,toExclusive)
exp?substring(from)
--第一个单词的首字母大写
exp?cap_first
例如:${"greENmouse"?cap_first}输出:GreENmouse
--取消第一个单词的首字母大写
exp?uncap_first
--所有单词的首字母大写
capitalize
例如:${"greenmouse"?capitalize}输出:GreenMouse
--字符串转换成日期时间值
date,time,datetime
例如:
<#assigntest1="10/25/1995"?date("MM/dd/yyyy")>
<#assigntest2="15:05:30"?time("HH:mm:ss")>
<#assigntest3="1995-10-2503:05PM"?datetime("yyyy-MM-ddhh:mma")>
${test1}
${test2}
${test3}
输出:
Oct25,1995
3:05:30PM
Oct25,19953:05:00PM
也可以不带格式化参数,将按照默认的格式显示
例如:<#assigntest1="Oct25,1995"?date>
<#assigntest2="3:05:30PM"?time>
<#assigntest3="Oct25,199503:05:00PM"?datetime>
--判断字符串以什么字符串结束
ends_with返回Boolean值
例如:"redhead"?ends_with("head")返回:true
--判断字符串以什么字符串开始
starts_with返回Boolean值
--逃逸字符
<========<
>========>
&========&
"========"
\========\\
{========\{
}========\}
\n换行(u000A)
\rReturn(u000D)
\tTab(u0009)
\bBackspace(u0008)
\fFormfeed(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
例如:<#assignbeanName='The"foo"bean.'>
StringBEAN_name="${beanName?j_string}";
输出:StringBEAN_name="The\"foo\"bean.";
--根据javascript语言的转义字符串规则转义字符串
js_string
例如:
<#assignuser="BigJoe's\"righthand\"">
<script>
alert("Welcome${user?js_string}!");
</script>
输出:
<script>
alert("WelcomeBigJoe\'s\"righthand\"!");
</script>
--取字符串的长度
length
--将字符串转换成小写
lower_case
例如:"GrEeNMoUsE"?lower_case输出:"greenmouse"
--将字符串转换成大写
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")>Itcontains"ice"</#if>
输出:
Itcontains"ice"
--匹配正则表达式
matches返回boolean值
例如:"fooo"?matches('fo*')返回:true
--字符串转换成数字
number
--替换字符串
replace
例如:
${"thisisacaracarus"?replace("car","bulldozer")}
输出:thisisabulldozerabulldozerus
--字符串拆分
split
例如:
<#list"someMOOtestMOOtext"?split("MOO")asx>
-${x}
</#list>
输出:
-some
-test
-text
--去除前后的空格
trim
例如:(${"greenmouse"?trim})输出:(greenmouse)
--word_list
例如:
<#assignwords="abcd,.1-2-3"?word_list>
<#listwordsasword>[${word}]</#list>
输出:[a][bcd,][.][1-2-3]
==================数字=====================
将数字转换成字符串
string
例如:<#assignanswer=42/>
${answer}
${answer?string}<#--thesameas${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:45PM
12:45:09PM
12:45:09PMCEST
12:45:09PMCEST
备注:date(年月日),time(时间),datetime(年月日+时间)
==============booleans==================
将逻辑boolean值转换成字符串
string
例如:foo?string输出:"true"
foo?string("yes","no")输出:"yes"
================序列sequences=============
--取序列的第一个变量
first如果序列为空将报错
--取序列的最后一个变量
last如果序列为空将报错
--序列中是否包含某个变量
seq_contains
例如:<#assignx=["red",16,"blue","cyan"]>
"blue":${x?seq_contains("blue")?string("yes","no")}
输出:"blue":yes
--取变量在序列中首次出现的索引值
seq_index_of
例如:
<#assigncolors=["red","green","blue"]>
${colors?seq_index_of("blue")}
输出:2
--取变量在序列中末次出现的索引值
seq_last_index_of
--序列顺序翻转
reverse
--返回序列的大小
size
--升序排列序列
sort
例如:<#assignls=["whale","Barbara","zeppelin","aardvark","beetroot"]?sort>
<#listlsasi>${i}</#list>
输出:aardvarkBarbarabeetrootwhalezeppelin
--按照关键字升序排列序列
sort_by
例如:
<#assignls=[
{"name":"whale","weight":2000},
{"name":"Barbara","weight":53},
{"name":"zeppelin","weight":-200},
{"name":"aardvark","weight":30},
{"name":"beetroot","weight":0.3}
]>
Orderbyname:
<#listls?sort_by("name")asi>
-${i.name}:${i.weight}
</#list>
Orderbyweight:
<#listls?sort_by("weight")asi>
-${i.name}:${i.weight}
</#list>
--将序列分成多组
chunk
例如:
<#assignseq=['a','b','c','d','e','f','g','h','i','j']>
<#listseq?chunk(4)asrow>
<#listrowascell>${cell}</#list>
</#list>
<#listseq?chunk(4,'-')asrow>
<#listrowascell>${cell}</#list>
</#list>
输出:
abcd
efgh
ij
abcd
efgh
ij--
====================hashes==========
keys--取关键字
例如:
<#assignh={"name":"mouse","price":50}>
<#assignkeys=h?keys>
<#listkeysaskey>${key}=${h[key]};</#list>
输出:
name=mouse;price=50;
values--取value值
=====================其他插件方法=======
--表达式运算
eval
例如:"1+2"?eval输出:3
--判断变量的类型
Built-inReturnstrueifthevalueisa...
is_stringstring
is_numbernumber
is_booleanboolean
is_datedate(alltypes:date-only,time-onlyanddate-time)
is_methodmethod
is_transformtransform
is_macromacro
is_hashhash
is_hash_exextendedhash(i.e.supports?keysand?values)
is_sequencesequence
is_collectioncollection
is_enumerablesequenceorcollection
is_indexablesequence
is_directivemacroortransform
is_nodenode
##################指令参考################
===============if,else,elseif===========
<#ifcondition>
...
<#elseifcondition2>
...
<#elseifcondition3>
...
...
<#else>
...
</#if>
================switch,case,default,break===========
<#switchvalue>
<#caserefValue1>
...
<#break>
<#caserefValue2>
...
<#break>
...
<#caserefValueN>
...
<#break>
<#default>
...
</#switch>
=================list,break======================
<#listsequenceasitem>
...
</#list>
<#listseqasx>
${x}
<#ifx="spring"><#break></#if>
</#list>
<#liststudents[0..5]ass_list></#list>取list的前5条记录
list项的索引xxx_index索引值从0开始
判断是否有下一项xxx_has_next
例如:
<#assignseq=["winter","spring","summer","autumn"]>
<#listseqasx>
${x_index+1}.${x}<#ifx_has_next>,</#if>
</#list>
输出:
1.winter,
2.spring,
3.summer,
4.autumn
=====================include=================
<#includefilename>
or
<#includefilenameoptions>
options:含两项encoding=encoding,parse=parse
encoding编码字符串parse是否解析模板
=====================import=================
<#importpathashash>
===============noparse===================
<#noparse>
...
</#noparse>
不解析某段文字
例如:
<#noparse>
<#listanimalsasbeing>
<tr><td>${being.name}<td>${being.price}Euros
</#list>
</#noparse>
输出:
<#listanimalsasbeing>
<tr><td>${being.name}<td>${being.price}Euros
</#list>
=======================compress=====================
<#compress>
...
</#compress>
去掉多余的空格和换行
例如:
<#assignx="moo\n\n">
(<#compress>
12345
${moo}
testonly
Isaid,testonly
</#compress>)
输出:
(12345
moo
testonly
Isaid,testonly)
=====================定义变量给变量赋值assign=========
<#assignname=value>
or
<#assignname1=value1name2=value2...nameN=valueN>
or
<#assignsameasabove...innamespacehash>
or
<#assignname>
capturethis
</#assign>
or
<#assignnameinnamespacehash>
capturethis
</#assign>
==============定义全局变量赋值global===========
<#globalname=value>
or
<#globalname1=value1name2=value2...nameN=valueN>
or
<#globalname>
capturethis
</#global>
===============setting设置freemarker的系统变量=================
<#settingname=value>
===================去除空格============
<#t><#lt><#rt><#nt>成对使用类似trim方法
##################freemarker中的保留字###################
true:booleanvalue``true''
false:booleanvalue``false''
gt:comparisonoperator``greaterthan''
gte:comparisonoperator``greaterthanorequivalent''
lt:comparisonoperator``lessthan''
lte:comparisonoperator``lessthanorequivalent''
as:usedbyafewdirectives
in:usedbyafewdirectives
using:usedbyafewdirectives
========================注释comment=============
旧格式:<#--...-->
新格式:
<#comment>.........</#comment>
=====================循环foreach===============
<#foreachiteminsequence>
类似于:<#listsequenceasitem>.
==================默认值default===================
exp1?default(exp2)
类似于原来的exp1!exp2
===============判断变量是否存在existsif_exists==============
exists老版本中(exp1)?exists
if_exists新版本中(exp1)?if_exists
所有内置函数:
chunk,is_date,last,root,j_string,round,contains,is_hash,long,float,ends_with,namespace,matches,time,values,seq_last_index_of,uncap_first,byte,substring,is_transform,web_safe,groups,seq_contains,is_macro,index_of,word_list,int,is_method,eval,parent,xml,number,capitalize,if_exists,rtf,node_type,double,is_directive,url,size,default,floor,ceiling,is_boolean,split,node_name,is_enumerable,seq_index_of,is_sequence,sort,is_node,sort_by,left_pad,cap_first,interpret,children,node_namespace,chop_linebreak,date,short,last_index_of,is_collection,ancestors,length,trim,datetime,is_string,reverse,c,keys,upper_case,js_string,has_content,right_pad,replace,is_hash_ex,new,is_number,lower_case,is_indexable,string,exists,html,first