Freemarker 开发指南.docx
《Freemarker 开发指南.docx》由会员分享,可在线阅读,更多相关《Freemarker 开发指南.docx(25页珍藏版)》请在冰豆网上搜索。
Freemarker开发指南
Freemark开发指南
A概念
最常用的3个概念
sequence序列,对应java里的list、数组等非键值对的集合
hash键值对的集合
namespace对一个ftl文件的引用,利用这个名字可以访问到该ftl文件的资源
B指令
if,else,elseif
语法
<#ifcondition>
...
<#elseifcondition2>
...
<#elseifcondition3>
...
...
<#else>
...
#if>
用例
<#ifx=1>
xis1
#if>
<#ifx=1>
xis1
<#else>
xisnot1
#if>
switch,case,default,break
语法
<#switchvalue>
<#caserefValue1>
...
<#break>
<#caserefValue2>
...
<#break>
...
<#caserefValueN>
...
<#break>
<#default>
...
#switch>
用例
字符串
<#switchbeing.size>
<#case"small">
Thiswillbeprocessedifitissmall
<#break>
<#case"medium">
Thiswillbeprocessedifitismedium
<#break>
<#case"large">
Thiswillbeprocessedifitislarge
<#break>
<#default>
Thiswillbeprocessedifitisneither
#switch>
数字
<#switchx>
<#casex=1>
1
<#casex=2>
2
<#default>
d
#switch>
如果x=1输出12,x=2输出2,x=3输出d
list,break
语法
<#listsequenceasitem>
...
<#ifitem="spring"><#break>#if>
...
#list>
关键字
item_index:
是list当前值的下标
item_has_next:
判断list是否还有值
用例
<#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=”GBK”编码格式
parse=true是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true”
用例
/common/copyright.ftl包含内容
Copyright2001-2002${me}
Allrightsreserved.
模板文件
<#assignme="JuilaSmith">
Sometest
Yeah.
<#include"/common/copyright.ftl"encoding=”GBK”>
输出结果
Sometest
Yeah.
Copyright2001-2002JuilaSmith
Allrightsreserved.
Import
语法
<#importpathashash>
类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件
用例
假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用
<#import"/libs/mylib.ftl"asmy>
<@my.copyrightdate="1999-2002"/>
"my"在freemarker里被称作namespace
compress
语法
<#compress>
...
#compress>
用来压缩空白空间和空白的行
用例
<#assignx="moo\n\n">
(<#compress>
12345
${moo}
testonly
Isaid,testonly
#compress>)
输出
(12345
moo
testonly
Isaid,testonly)
escape,noescape
语法
<#escapeidentifierasexpression>
...
<#noescape>...#noescape>
...
#escape>
用例
主要使用在相似的字符串变量输出,比如某一个模块的所有字符串输出都必须是html安全的,这个时候就可以使用该表达式
<#escapexasx?
html>
Firstname:
${firstName}
<#noescape>Lastname:
${lastName}#noescape>
Maidenname:
${maidenName}
#escape>
相同表达式
Firstname:
${firstName?
html}
Lastname:
${lastName}
Maidenname:
${maidenName?
html}
assign
语法
<#assignname=value>
or
<#assignname1=value1name2=value2...nameN=valueN>
or
<#assignsameasabove...innamespacehash>
or
<#assignname>
capturethis
#assign>
or
<#assignnameinnamespacehash>
capturethis
#assign>
用例
生成变量,并且给变量赋值
给seasons赋予序列值
<#assignseasons=["winter","spring","summer","autumn"]>
给变量test加1
<#assigntest=test+1>
给mynamespage赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变量
<#import"/mylib.ftl"asmy>
<#assignbgColor="red"inmy>
将一段输出的文本作为变量保存在x里
下面的阴影部分输出的文本将被赋值给x
<#assignx>
<#list1..3asn>
${n}<@myMacro/>
#list>
#assign>
Numberofwords:
${x?
word_list?
size}
${x}
<#assignx>Hello${user}!
#assign>error
<#assignx=”Hello${user}!
”>true
同时也支持中文赋值,如:
<#assign语法>
java
#assign>
${语法}
打印输出:
java
global
语法
<#globalname=value>
or
<#globalname1=value1name2=value2...nameN=valueN>
or
<#globalname>
capturethis
#global>
全局赋值语法,利用这个语法给变量赋值,那么这个变量在所有的namespace中是可见的,如果这个变量被当前的assign语法覆盖如<#globalx=2><#assignx=1>在当前页面里x=2将被隐藏,或者通过${.global.x}来访问
setting
语法
<#settingname=value>
用来设置整个系统的一个环境
locale
number_format
boolean_format
date_format,time_format,datetime_format
time_zone
classic_compatible
用例
假如当前是匈牙利的设置,然后修改成美国
${1.2}
<#settinglocale="en_US">
${1.2}
输出
1,2
1.2
因为匈牙利是采用“,”作为十进制的分隔符,美国是用“.”
macro,nested,return
语法
<#macronameparam1param2...paramN>
...
<#nestedloopvar1,loopvar2,...,loopvarN>
...
<#return>
...
#macro>
用例
<#macrotestfoobar="Bar"baaz=-1>
Testtext,andtheparams:
${foo},${bar},${baaz}
#macro>
<@testfoo="a"bar="b"baaz=5*5-2/>
<@testfoo="a"bar="b"/>
<@testfoo="a"baaz=5*5-2/>
<@testfoo="a"/>
输出
Testtext,andtheparams:
a,b,23
Testtext,andtheparams:
a,b,-1
Testtext,andtheparams:
a,Bar,23
Testtext,andtheparams:
a,Bar,-1
定义循环输出的宏
<#macrolisttitleitems>
${title?
cap_first}:
<#listitemsasx>
- ${x?
cap_first}
#list>
#macro>
<@listitems=["mouse","elephant","python"]title="Animals"/>
输出结果
Animals:
包含body的宏
<#macrorepeatcount>
<#list1..countasx>
<#nestedx,x/2,x==count>
#list>
#macro>
<@repeatcount=4;chalfclast>
${c}.${halfc}<#iflast>Last!
#if>
@repeat>
输出
1.0.5
2.1
3.1.5
4.2Last!
t,lt,rt
语法
<#t>去掉左右空白和回车换行
<#lt>去掉左边空白和回车换行
<#rt>去掉右边空白和回车换行
<#nt>取消上面的效果
C一些常用方法或注意事项
表达式转换类
${expression}计算expression并输出
#{expression}数字计算#{expression;format}安格式输出数字format为M和m
M表示小数点后最多的位数,m表示小数点后最少的位数如#{121.2322;m2M2}输出121.23
数字循环
1..5表示从1到5,原型number..number
对浮点取整数
${123.23?
int}输出123
给变量默认值
${var?
default(“helloworld
”)?
html}如果varisnull那么将会被helloworld
替代
判断对象是不是null
<#ifmouse?
exists>
Mousefound
<#else>
也可以直接${mouse?
if_exists})输出布尔形
常用格式化日期
openingTime必须是Date型,详细查看freemarker文档Reference->build-inreferece->build-infordate
${openingTime?
date}
${openingTime?
date_time}
${openingTime?
time}
添加全局共享变量数据模型
在代码里的实现
cfg=Configuration.getDefaultConfiguration();
cfg.setSharedVariable("global","yougood");
页面实现可以通过global指令,具体查看指令里的global部分
直接调用java对象的方法
${object.methed(args)}
字符串处理(内置方法)
html安全输出
“abc
sdfsf”?html
返回安全的html输出,替换掉html代码
xml安全输出
var?
xml
substring的用法
<#assignuser=”hellojeen”>
${user[0]}${user[4]}
${user[1..4]}
输出:
ho
ello
类似String.split的用法
“abc;def;ghi”?
split(“;”)返回sequence
将字符串按空格转化成sequence,然后取sequence的长度
var?
word_list效果同var?
split(“”)
var?
word_list?
size
取得字符串长度
var?
length
大写输出字符
var?
upper_case
小写输出字符
var?
lower_case
首字符大写
var?
cap_first
首字符小写
var?
uncap_first
去掉字符串前后空格
var?
trim
每个单词的首字符大写
var?
capitalize
类似String.indexof:
“babcdabcd”?
index_of(“abc”)返回1
“babcdabcd”?
index_of(“abc”,2)返回5
类似String.lastIndexOf
last_index_of和String.lastIndexOf类似,同上
下面两个可能在代码生成的时候使用(在引号前加”\”)
j_string:
在字符串引号前加”\”
<#assignbeanName='The"foo"bean.'>
StringBEAN_NAME="${beanName?
j_string}";
打印输出:
StringBEAN_NAME="The\"foo\"bean.";
js_string:
<#assignuser="BigJoe's\"righthand\".">
alert("Welcome${user}!
");
打印输出
alert("WelcomeBigJoe\'s\"righthand\"!
");
替换字符串replace
${s?
replace(‘ba’,‘XY’)}
${s?
replace(‘ba’,‘XY’,‘规则参数’)}将s里的所有的ba替换成xy规则参数包含:
irmscf具体含义如下:
∙i:
大小写不区分.
∙f:
只替换第一个出现被替换字符串的字符串
∙r:
XY是正则表达式
∙m:
Multi-linemodeforregularexpressions.Inmulti-linemodetheexpressions^and$matchjustafterorjustbefore,respectively,alineterminatorortheendofthestring.Bydefaulttheseexpressionsonlymatchatthebeginningandtheendoftheentirestring.
∙s:
Enablesdotallmodeforregularexpressions(sameasPerlsinge-linemode).Indotallmode,theexpression.matchesanycharacter,includingalineterminator.Bydefaultthisexpressiondoesnotmatchlineterminators.
∙c:
Permitswhitespaceandcommentsinregularexpressions.
在模板里对sequences和hashes初始化
sequences
1.[“you”,”me”,”he”]
2.1..100
3.[{“Akey”:
”Avalue”},{“Akey1”:
”Avalue1”},
{“Bkey”:
”Bvalue”},{“Bkey1”:
”Bvalue1”},
]
hashes{“you”:
”a”,”me”:
”b”,”he”:
”c”}
注释标志
<#--
这里是注释
-->
旧版本的freemarker采用的是<#comment>注释#comment>方法
sequences内置方法
sequence?
first
返回sequence的第一个值;前提条件sequence不能是null
sequence?
last
返回sequence最后一个值
sequence?
reverse
反转sequence的值
sequence?
size
返回sequence的大小
sequence?
sort
对sequence按里面的对象toString()的结果进行排序
sequence?
sort_by(value)
对sequence按里面的对象的属性value进行排序
如:
sequence里面放入的是10个user对象,user对象里面包含name,age等属性
sequence?
sort_by(name)表示所有的user按user.name进行排序
hashes内置方法
hash?
keys
返回hash里的所有keys,返回结果类型sequence
hash?
values
返回hash里的所有value,返回结果类型sequence
Dfreemarker在web开发中注意事项
freemarker与webwork整合
web中常用的几个对象
与webwork整合之后通过配置的servlet已经把request,session等对象置入了数据模型中
在view中存在下面的对象
我们可以在ftl中${req}来打印req对象
∙req-thecurrentHttpServletRequest
∙res-thecurrentHttpServletResponse
∙stack-thecurrentOgnlValueStack
∙ognl-theOgnlToolinstance
∙webwork-aninstanceofFreemarkerWebWorkUtil
∙action-thecurrentWebWorkaction
∙exception-optionaltheExceptioninstance,iftheviewisaJSPexceptionorServletexceptionview
view中值的搜索顺序
${name}将会以下面的顺序查找name值
∙freemarkervariables
∙valuestack
∙requestattributes
∙sessionattributes
∙servletcontextattributes
在模板里ftl里使用标签
注意,如果标签的属性值是数字,那么必须采用nubmer=123方式给属性赋值
JSP页面
<%@pagecontentType="text/html;charset=ISO-8859-2"language="java"%>
<%@tagliburi="/WEB-INF/struts-html.tld"prefix="html"%>
<%@tagliburi="/WEB-INF/struts-bean.tld"prefix="bean"%>
messagekey="welcome.title"/>
errors/>
formaction="/query">
Keyword:
textproperty="keyword"/>
Exclude:
textproperty="exclude"/>
submitvalue="Send"/>
form>
模板ftl页面
<#assignhtml=JspTaglibs["/WEB-INF/struts-html.tld"]>
<#assignbean=JspTaglibs["/WEB-INF/struts-bean.tld"]>
<@bean.messagekey="welcome.title"/>
<@html.errors/>
<@html.formaction="/query">
Keyword:
<@html.textproperty="keyword"/>
Exclude:
<@html.textproperty="exclude"/>
<@html.submitvalue="S
展开阅读全文
相关搜索
资源标签