freemarker中文手册.docx
《freemarker中文手册.docx》由会员分享,可在线阅读,更多相关《freemarker中文手册.docx(76页珍藏版)》请在冰豆网上搜索。
freemarker中文手册
开发笔记
截取字符
<#ifnews.title?
lengthlt13>
${news.title}
<#else>
${news.title[0..12]}...
#if>
一、freemarker的空值和默认值
${user?
if_exists}
${user?
default('yourname')}
判断对象是不是null
<#ifmouse?
exists>
Mousefound
<#else>
或<#ifbook.name?
?
>
Mousefound
#if>
list空值判断<#ifbookList?
size=0>
<#listrecommendlistascontent>
<#ifcontent_index%3==0>
28px;padding-top:
2px;font-weight:
bold;font-size:
14px;padding-left:
10px;">${content.title}
#if>
<#ifcontent_index%3==1>
- ${content.title}
#if>
<#ifcontent_index%3==2>
- ${content.title}
#if>
#list>
<#listrecommendlistascontent>
<#ifcontent_index%3==0>
#if>
#list>
List指令还隐含了两个循环变量:
item_index:
当前迭代项在所有迭代项中的位置,是数字值。
item_has_next:
用于判断当前迭代项是否是所有迭代项中的最后一项。
在循环过程中,如果您想跳出循环,那么可以使用结合break指令,即<#break>来完成。
<#escapexas(x)!
"">//去除null报错
三、 Freemarker如何遍历List实例应用
创通过上面的介绍,相信您已经对Freemarker如何遍历List有了了解,那么我们就废话少说,开始做一个应用吧。
User类
publicclassUser{
privateStringusername;
private
(省略set和get方法)
}
user.ftl
<#--Freemarker遍历list-->
简单遍历list:
<#listuserListasuser>
用户名:
${user.userName}
密 码:
${user.userPassword}
年 龄:
${user.age}
#list>
<#--Freemarker遍历list并应用list隐含变量item_index-->
item_index使用:
<#listuserListasuser>
第${user_index+1}个用户
用户名:
${user.userName}
密 码:
${user.userPassword}
年 龄:
${user.age}
#list>
<#--Freemarker遍历list并应用list隐含变量item_has_next-->
item_has_next,size使用:
<#listuserListasuser>
用户名:
${user.userName}
密 码:
${user.userPassword}
年 龄:
${user.age}
<#if!
user_has_next>
共有${userList?
size}最后一个用户是:
${user.userName}
#if>
#list>
<#--Freemarker遍历list并按用户年龄升序排序-->
按用户年龄升序排序:
<#listuserList?
sort_by("age")asuser>
用户名:
${user.userName}
密 码:
${user.userPassword}
年 龄:
${user.age}
#list>
<#--Freemarker遍历list并按用户年龄降序排序-->
按用户年龄降序排序:
<#listuserList?
sort_by("age")?
reverseasuser>
用户名:
${user.userName}
密 码:
${user.userPassword}
年 龄:
${user.age}
#list>
<#--Freemarker遍历list当用户年龄大于21岁时,停止输出-->
list中应用break:
<#listuserList?
sort_by("age")?
reverseasuser>
用户名:
${user.userName}
密 码:
${user.userPassword}
年 龄:
${user.age}
<#if(user.age>21)>
<#break>
#if>
#list>
1、快速入门
(1)模板+数据模型=输出
● FreeMarker基于设计者和程序员是具有不同专业技能的不同个体的观念
● 他们是分工劳动的:
设计者专注于表示——创建HTML文件、图片、Web页面的其它可视化方面;程序员创建系统,生成设计页面要显示的数据
● 经常会遇到的问题是:
在Web页面(或其它类型的文档)中显示的信息在设计页面时是无效的,是基于动态数据的
● 在这里,你可以在HTML(或其它要输出的文本)中加入一些特定指令,FreeMarker会在输出页面给最终用户时,用适当的数据替代这些代码
● 下面是一个例子:
Welcome!Welcome${user}!
Ourlatestproduct:
${latestProduct.name}!
● 这个例子是在简单的HTML中加入了一些由${…}包围的特定代码,这些特定代码是FreeMarker的指令,而包含FreeMarker的指令的文件就称为模板(Template)
● 至于user、latestProduct.url和latestProduct.name来自于数据模型(datamodel)
● 数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成
● 模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型
● 下面是一个可能的数据模型:
(root)
|
+-user="BigJoe"
|
+-latestProduct
|
+-url="products/greenmouse.html"
|
+-name="greenmouse"
● 数据模型类似于计算机的文件系统,latestProduct可以看作是目录,而user、url和name看作是文件,url和name文件位于latestProduct目录中(这只是一个比喻,实际并不存在)
● 当FreeMarker将上面的数据模型合并到模板中,就创建了下面的输出:
Welcome!WelcomeBigJoe!
Ourlatestproduct:
greenmouse!
(2)数据模型
● 典型的数据模型是树型结构,可以任意复杂和深层次,如下面的例子:
(root)
|
+-animals
||
|+-mouse
|||
||+-size="small"
|||
||+-price=50
||
|+-elephant
|||
||+-size="large"
|||
||+-price=5000
||
|+-python
||
|+-size="medium"
||
|+-price=4999
|
+-test="Itisatest"
|
+-whatnot
|
+-because="don'tknow"
● 类似于目录的变量称为hashes,包含保存下级变量的唯一的查询名字
● 类似于文件的变量称为scalars,保存单值
● scalars保存的值有两种类型:
字符串(用引号括起,可以是单引号或双引号)和数字(不要用引号将数字括起,这会作为字符串处理)
● 对scalars的访问从root开始,各部分用“.”分隔,如animals.mouse.price
● 另外一种变量是sequences,和hashes类似,只是不使用变量名字,而使用数字索引,如下面的例子:
(root)
|
+-animals
||
|+-(1st)
|||
||+-name="mouse"
|||
||+-size="small"
|||
||+-price=50
||
|+-(2nd)
|||
||+-name="elephant"
|||
||+-size="large"
|||
||+-price=5000
||
|+-(3rd)
||
|+-name="python"
||
|+-size="medium"
||
|+-price=4999
|
+-whatnot
|
+-fruits
|
+-(1st)="orange"
|
+-(2nd)="banana"
● 这种对scalars的访问使用索引,如animals[0].name
(3)模板
● 在FreeMarker模板中可以包括下面三种特定部分:
Ø ${…}:
称为interpolations,FreeMarker会在输出时用实际值进行替代
Ø FTL标记(FreeMarker模板语言标记):
类似于HTML标记,为了与HTML标记区分,用#开始(有些以@开始,在后面叙述)
Ø 注释:
包含在<#--和-->(而不是
--和-->)之间
● 下面是一些使用指令的例子:
Ø if指令
<#ifanimals.python.price
Pythonsarecheaperthanelephantstoday.
<#else>
Pythonsarenotcheaperthanelephantstoday.
#if>
Ø list指令
Wehavetheseanimals:
Name | Price <#listanimalsasbeing> |
---|
${being.name} | ${being.price}Euros #list> 输出为: Wehavetheseanimals:
|
Name | Price |
---|
mouse | 50Euros |
elephant | 5000Euros |
python | 4999Euros Ø include指令 TestpageTestpageBlahblah... <#include"/copyright_footer.html"> Ø 一起使用指令 Wehavetheseanimals:
|
Name | Price <#listanimalsasbeing> |
---|
<#ifbeing.size="large">#if> ${being.name} <#ifbeing.size="large">#if> | ${being.price}Euros #list> FreeMarker设计指南(3) 3、模板 (1)整体结构 ● 模板使用FTL(FreeMarker模板语言)编写,是下面各部分的一个组合: Ø 文本: 直接输出 Ø Interpolation: 由${和},或#{和}来限定,计算值替代输出 Ø FTL标记: FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出 Ø 注释: 由<#--和-->限定,不会输出 ● 下面是以一个具体模板例子: [BR] [BR] Welcome![BR][BR] [BR] <#-- Greet the user with his/her name -->[BR] Welcome ${user}![BR] We have these animals: [BR] [BR][BR] ● [BR]是用于换行的特殊字符序列 ● 注意事项: Ø FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的 Ø Interpolation只能在文本中使用 Ø FTL标记不能位于另一个FTL标记内部,例如: <#if<#include'foo'>='bar'>... Ø 注释可以位于FTL标记和Interpolation内部,如下面的例子: Welcome ${user<#--Thenameofuser-->}![BR] We have these animals: [BR] [BR]<#list <#--somecomment...-->animalsas <#--again...-->being>[BR] ... Ø 多余的空白字符会在模板输出时移除 (2)指令 ● 在FreeMarker中,使用FTL标记引用指令 ● 有三种FTL标记,这和HTML标记是类似的: Ø 开始标记: <#directivenameparameters> Ø 结束标记: #directivename> Ø 空内容指令标记: <#directivenameparameters/> ● 有两种类型的指令: ● FTL标记不能够交叉,而应该正确的嵌套,如下面的代码是错误的: 预定义指令和用户定义指令 ● 用户定义指令要使用@替换#,如<@mydirective>...@mydirective>(会在后面讲述) <#listanimalsasbeing> - ${being.name}for${being.price}Euros
<#ifuse="BigJoe"> (exceptforyou) #list> #if><#--WRONG! --> ● 如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息 ● FreeMarker会忽略FTL标记中的空白字符,如下面的例子: <#list[BR] animals as[BR] being[BR] >[BR] ${being.name} for ${being.price} Euros[BR] #list > ● 但是,<、和指令之间不允许有空白字符 (3)表达式 ● 直接指定值 Ø 字符串 ⏹ 使用单引号或双引号限定 ⏹ 如果包含特殊字符需要转义,如下面的例子: ${"It's\"quoted\"and thisisabackslash: \\"} ${'It\'s"quoted"and thisisabackslash: \\'} 输出结果是: It's"quoted"and thisisabackslash: \ It's"quoted"and thisisabackslash: \ ⏹ 下面是支持的转义序列: 转义序列 含义 \" 双引号(u0022) \' 单引号(u0027) \\ 反斜杠(u005C) \n 换行(u000A) \r Return(u000D) \t Tab(u0009) \b Backspace(u0008) \f Formfeed(u000C) \l < \g > \a & \{ { \xCode 4位16进制Unicode代码 ⏹ 有一类特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子: ${r"${foo}"} ${r"C: \foo\bar"} 输出的结果是: ${foo} C: \foo\bar Ø 数字 ⏹ 直接输入,不需要引号 ⏹ 精度数字使用“.”分隔,不能使用分组符号 ⏹ 目前版本不支持科学计数法,所以“1E3”是错误的 ⏹ 不能省略小数点前面的0,所以“.5”是错误的 ⏹ 数字8、+8、08和8.00都是相同的 Ø 布尔值 ⏹ true和false,不使用引号 Ø 序列 ⏹ 由逗号分隔的子变量列表,由方括号限定,下面是一个例子: <#list["winter","spring","summer","autumn"]asx> ${x} #list> 输出的结果是: winter spring summer autumn ⏹ 列表的项目是表达式,所以可以有下面的例子: [2+2,[1,2,3,4],"whatnot"] ⏹ 可以使用数字范围定义数字序列,例如2..5等同于[2,3,4,5],但是更有效率,注意数字范围没有方括号 ⏹ 可以定义反递增的数字范围,如5..2 Ø 散列(hash) ⏹ 由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔,下面是一个例子: {"name": "green mouse","price": 150} ⏹ 键和值都是表达式,但是键必须是字符串 ● 获取变量 Ø 顶层变量: ${variable},变量名只能是字母、数字、下划线、$、@和#的组合,且不能以数字开头 Ø 从散列中获取数据 ⏹ 可以使用点语法或方括号语法,假设有下面的数据模型: (root) | +-book || |+-title="Breedinggreenmouses" || |+-author || |+-name="JuliaSmith" || |+-info="Biologist,1923-1985,Canada" | +-test="title" 下面都是等价的: book.author.name book["author"].name book.author.["name"] book["author"]["name"] ⏹ 使用点语法,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字是任意表达式的结果 Ø 从序列获得数据: 和散列的方括号语法语法一样,只是方括号中的表达式值必须是数字;注意: 第一个项目的索引是0 Ø 序列片断: 使用[startIndex..endIndex]语法,从序列中获得序列片断(也是序列);startIndex和endIndex是结果为数字的表达式 Ø 特殊变量: FreeMarker内定义变量,使用.variablename语法访问 ● 字符串操作 Ø Interpolation(或连接操作) ⏹ 可以使用${..}(或#{..})在文本部分插入表达式的值,例如: ${"Hello${use
展开阅读全文
相关搜索
|