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值

--逃逸字符

<========&lt;

>========&gt;

&========&amp;

"========&quot;

\========\\

{========\{

}========\}

\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

相关推荐