freemarker语法完整版
更新时间:2024-06-17 12:55:02 阅读量: 综合文库 文档下载
最常用的概念
1、 scalars:存储单值
字符串:简单文本由单或双引号括起来。 数字:直接使用数值。 日期:通常从数据模型获得
布尔值:true或false,通常在<#if …>标记中使用
2、 hashes:充当其它对象的容器,每个都关联一个唯一的查询名字 具有一个唯一的查询名字和他包含的每个变量相关联。
3、 sequences:充当其它对象的容器,按次序访问 使用数字和他包含的每个变量相关联。索引值从0开始。
4、 集合变量:
除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由<#list...>指令使用的受限sequences。
5、 方法:通过传递的参数进行计算,以新对象返回结果 方法变量通常是基于给出的参数计算值在数据模型中定义。
6、 用户自定义FTL指令:宏和变换器 7、 节点
节点变量表示为树型结构中的一个节点,通常在XML处理中使用。
在模板里对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 模板
使用FTL(freeMarker模板语言)编写 组成部分 一、整体结构
1、注释:<#--注释内容-->,不会输出。 2、文本:直接输出。
3、interpolation:由 ${var} 或 #{var} 限定,由计算值代替输出。 4、FTL标记 二.表达式 1、直接指定值: 1-1、字符串:
由双引号或单引号括起来的字符串,其中的特殊字符(如' \等)需要转义。
1-2、raw字符串:
有一种特殊的字符串称为raw字符串,被认为是纯文本,其中的\\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子:
${r\屏幕输出结果为:/${data}\
转义 含义 序列
\\\双引号(u0022) \\' 单引号(u0027) \\\\ 反斜杠(u005C) \\n 换行(u000A) \\r Return (u000D) \\t Tab (u0009) \\b Backspace (u0008) \\f Form feed (u000C) \\l < \\g > \\a & \\{ {
\\xCode 4位16进制Unicode代码
1-3、数字:直接输入,不需要引号
1)、精度数字使用―.‖分隔,不能使用分组符号 2)、目前版本不支持科学计数法,所以―1E3‖是错误的 3)、不能省略小数点前面的0,所以―.5‖是错误的 4)、数字8、+8、08和8.00都是相同的 1-4、布尔值:true和false,不使用引号
1-5、序列:由逗号分隔的子变量列表,由[]方括号限定。 1)、子变量列表可以是表达式
2)、可以使用数字范围定义数字序列,不需要方括号限定,例如2..5等同于[2, 3, 4, 5],但是更有效率,可以定义反递增范围如:5..2。 1-6、散列(hash)
1)、由逗号分隔的键/值列表,由{}大括号限定,键和值之间用冒号分隔,如:{\string\
2)、键和值都是表达式,但是键必须是字符串。
2、获取变量:
2-1、顶层变量:${变量名}
变量名只能是字母、数字、下划线、$、#、@ 的组合,且不能以数字开头。 2-2、散列:有两种方法
1)、点语法:变量名字和顶层变量的名字受同样的限制 2)、方括号语法:变量名字无限制,可以是任意的表达式的结果 book.author.name book.author.[\book[\book[\以上是等价的。
2-3、序列:使用散列的方括号语法获取变量,方括号中的表达式结果必须为数字。注意:第一个项目的索引为0。可以使用
[startindex..endindex]语法获取序列片段。
2-4、特殊变量:FreeMarker内定义变量,使用.variablename语法访问。 3、字符串操作
3-1、interpolation:使用${}或#{}在文本部分插入表达式的值,例如: ${\
${\也可以使用+来获得同样的结果: ${\
${username+username+username}
注意:${}只能用于文本部分而不能出现于标记内。 <#if ${user.login}>或<#if \都是错误的; <#if user.login>是正确的。
本例中user.login的值必须是布尔类型。
如:
<#macro greet person color>
使用时:
<@greet color=\正确
<@greet person=\错误,color没有赋值,此时,如果在定义宏时为color定义缺省值<#macro greet person color=\这样的话,这个使用方法就是正确的。
<@greet color=\错误,宏greet定义中未指定bgcolor这个参数
2、嵌套内容:
2-1、自定义指令可以有嵌套内容,使用<#nested>指令,执行自定义指令开始和结束标记之间的模板片段。例如:
<#macro greet> <#nested> #macro>
<@greet>hello Emma!@greet> 输出为 hello Emma!
2-2、<#nested>指令可以被多次调用,例如 <#macro greet> <#nested> <#nested> <#nested>
<#nested>
#macro>
<@greet>hello Emma!@greet> 输出为 hello Emma! hello Emma! hello Emma! hello Emma!
2-3、嵌套的内容可以是有效的FTL,例如: <#macro welcome> <#nested> #macro>
<#macro greet person color=\
<@welcome>
<@greet person=\<@greet person=\<@greet person=\@welcome> 输出为:
2-4、宏定义中的局部变量对嵌套内容是不可见的,例如: <#macro repeat count> <#local y=\ <#list 1..count as x> ${y}${count}/${x}:<#nested /> #list> #macro> <@repeat count=3> ${y?default(\ ${x?default(\${count?default(\@repeat> 输出结果为 test 3/1:??? test 3/2:??? test 3/3:??? 2-5、在宏定义中使用循环变量,通常用来重复嵌套内容,基本用法为:作为nested指令的参数,传递循环变量的实际值,而在调用自定义指令时,在标记的参数后面指定循环变量的名字。 例如: <#macro repeat count> <#list 1..count as x> <#nested x,x/2,x==count /> #list> #macro> <@repeat count=4;c,halfc,last> ${c}. ${halfc} <#if last> last! #if> @repeat> 输出结果是 1. 0.5 2. 1 3. 1.5 4. 2last! 注意:指定循环变量的数目和用户定义指令开始标记指定的不同不会有问题 调用时,少指定循环变量,多指定的值会不见 调用时,多指定循环变量,多余的循环变量不会被创建 二、在模板中定义变量 1、在模板中定义的变量有三种类型 1-1、plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。 1-2、局部变量:在宏定义体中有效,使用local指令创建和替换。 1-3、循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建。 注意: 1)、宏的参数是局部变量,不是循环变量。 2)、局部变量隐藏同名的plain变量 3)、循环变量隐藏同名的plain变量和局部变量。 例如: <#assign x=\1. ${x} <#-- plain --> <@test /> 6. ${x} <#list [\7. ${x} <#-- loop --> <#assign x=\8. ${x} <#-- loop --> #list> 9. ${x} <#-- plain2 --> <#macro test> 2. ${x} <#-- plain --> <#local x=\3. ${x} <#-- local --> <#list [\4. ${x} <#-- loop --> #list> 5. ${x} <#-- local --> #macro> 4)、内部循环变量隐藏同名的外部循环变量 <#list [\${x} <#-- loop1 --> <#list [\${x} <#-- loop2 --> <#list [\${x} <#-- loop3 --> #list> ${x} <#-- loop2 --> #list> 具体到和webwork整合,因为本身webwork提供了整合servlet,如果要增加全局共享变量,可以通过修改com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实现,我们可以在这个servlet初始化的时候来初始化全局共享变量 与webwork整合配置 配置web.xml E高级方法 自定义方法 ${timer(\ ${timer(\ 在模板中除了可以通过对象来调用方法外(${object.methed(args)})也可以直接调用java实现的方法,java类必须实现接口TemplateMethodModel的方法exec(List args). 下面以把毫秒的时间转换成按格式输出的时间为例子 public class LongToDate implements TemplateMethodModel { public TemplateModel exec(List args) throws TemplateModelException { SimpleDateFormat mydate = new SimpleDateFormat((String) args.get(0))); return mydate.format(new Date(Long.parseLong((String)args.get(1))); } } 将LongToDate对象放入到数据模型中 root.put(\模板里使用 <#assign x = \ 输出 2001-10-12 5:21:12 2001-10-12 自定义 Transforms 实现自定义的<@transform>文本或表达式@transform>的功能,允许对中间的最终文本进行解析转换 例子:实现<@upcase>str@upcase> 将str转换成STR 的功能 代码如下: import java.io.*; import java.util.*; import freemarker.template.TemplateTransformModel; class UpperCaseTransform implements TemplateTransformModel { public Writer getWriter(Writer out, Map args) { return new UpperCaseWriter(out); } private class UpperCaseWriter extends Writer { private Writer out; UpperCaseWriter (Writer out) { this.out = out; } public void write(char[] cbuf, int off, int len) throws IOException { out.write(new String(cbuf, off, len).toUpperCase()); } public void flush() throws IOException { out.flush(); } public void close() { } } } 然后将此对象put到数据模型中 root.put(\ 在view(ftl)页面中可以如下方式使用 <@upcase> hello world @upcase> 打印输出: HELLO WORLD F.Built-ins ${x?upper_case} – 小写变大写 ${test?html} - 转换为HTML编码格式 ${repeat(\– 复制B次A Example: ${test?html} ${test?upper_case?html} Assuming that test stores the string ``Tom & Jerry'', the output will be: Tom & Jerry TOM & JERRY --------- ${repeat(\ will print: :WhatWhatWhat 1. String内置的JavaScript转换: js_string 用途:用于JavaScript转义,转换',\换行等特殊字符 模板: 输出: 2.内置的默认值处理:default 用途: 用于处理默认值 模本: User: ${userLogin.name?default(\ ${(employee.department.manager.name)?default(\输出: User: Anonymous 注,可以对整个对象树加上(),再用内置处理器这种方便的做法,偶也是最近刚学会的,以前一直用很傻的方法做..... 3. Sequence内置的计数器: xxx_index 用途:显示序号 模板: <#list employees as e> ${e_index}. ${e.name} #list> 输出: 1. Readonly 2. Robbin 4. Sequence内置的分段器: chunk 用途:某些比较BT的排版需求 模板: <#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 - - String ${\ this is a backslash: \\\\\ ${'It\\'s \ this is a backslash: } ${r\ raw字符串,原封不动地现实引号中的内容 ps:前一种是用双引号来引用字符串,后一种是用单引号来引用字符串。 分别需要对双引号和单引号进行转义 ${\ ${user + user + user + user} 效果相同 ★substring ${user[0]}${user[4]} ${user[1..4]} ${user[4..]} ★number 不支持科学计数法 小数点前面的零不能省略 ★sequences <#list [\ ${x} #list> <#list 2..5 as x> ${x} #list> <#list [2,3,4,5] as x> ${x} #list> 数组的拼接 <#list [\ - ${user} #list> ★hash <#assign ages = {\ - Joe is ${ages.Joe} - Fred is ${ages.Fred} - Julia is ${ages.Julia} 注意重复的键对应的值取最后的一个 ★运算 ${5/2?int} 显示2 cap_first : 首字母大写 capitalize: 所有单词首刺目大写 html : 转换为HTML格式 < replaced with < > replaced with > & replaced with & \ index_of : 显示元素所在的位置 \返回值为1(下标从0开始) Contains:判断是否存在字符 <#if \输出: It contains \ Replace :替换 split(―XX‖):截取XX之后的字符 <#list \- ${x} #list> 输出: - some - test - text starts_with :字符串由什么开始返回布尔型 trim :去掉空格 seq_index_of 数组中元素的位置 <#assign colors = [\${colors?seq_index_of(\输出: 2 Default : 设置变量的默认值 Exists:放在if句 如果没有….. <#if mouse?exists> Mouse found <#else> No mouse found #if> Creating mouse... <#assign mouse = \<#if mouse?exists> Mouse found <#else> No mouse found #if> 输出 : No mouse found Creating mouse...
正在阅读:
freemarker语法完整版06-17
开业提交材料05-04
电控发动机ECU标定系统05-11
数字摄影测量学 - 图文09-21
采访成功人士的感想10-18
党风廉政建设个人工作总结优选范文04-03
2016年广州大学化学综合知识之无机化学复试笔试最后押题五套卷05-07
毕业设计-发动机缸盖10-31
浪潮ERP软件年结手册(2010)-GS05-24
服装设计策划书 - 图文05-20
- 冀教版版五年级科学下册复习资料
- 微生物学复习提纲
- 2013—2014学年小学第二学期教研组工作总结
- 国有土地转让委托服务合同协议范本模板
- 我的固废说明书
- 企业管理诊断报告格式
- 东鼎雅苑施工组织设计
- 谈谈如何做好基层党支部书记工作
- 浮梁县环保局市级文明单位创建工作汇报
- 管理学基础知识
- 大学物理实验报告23 - PN结温度传感器特性1
- 计算机网络实践
- 酒桌上这四种情况下要坐牢,千万别不当回事……
- 国家康居示范工程建设技术要点
- 中国贴布行业市场调查研究报告(目录) - 图文
- 新课标下如何在高中物理教学中培养学生的创新能力初探
- 营养师冬季养生食谱每日一练(7月4日)
- 关注江西2017年第3期药品质量公告
- 建设海绵城市专题习题汇总
- 10万吨年环保净水剂建设项目报告书(2).pdf - 图文
- 整版
- 语法
- freemarker
- 部编版小学二年级语文上册第二单元测试题及答案
- 2018年湖北省黄石市中考文综试卷(含详细答案)
- 微专题:构造函数法解选填压轴题
- 人教版九年级化学复习提纲 - 图文
- 基坑及暗挖隧道项目监测管理办法
- 浅谈初始学生飞行训练期间常见问题及其对策
- 2015高中数学1.4.3正切函数的性质与图象教案新人教A版必修4(数
- 8路抢答器
- 浅谈工程施工现场管理
- 社会救助工作知识问答
- 在学校附近开服装店好吗,渠道网告诉您该怎么做
- 浅谈如何在教育中运用动画片
- 建德市小学科学2010年度优质课比赛教学实录
- 迪士尼神奇英语重点单词和句子(上册)
- 计算机二级Access期末考试复习题
- 2.2014年设施农业项目申报指南
- 2015年河南省郑州市高考数学三模试卷(理科)
- 实验二 顺序表与链表
- 道路标准
- FLAC3D各种命令笔记