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> 注释 方法

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>

<@greet>hello Emma! 输出为 hello Emma!

2-2、<#nested>指令可以被多次调用,例如 <#macro greet> <#nested> <#nested> <#nested>

<#nested>

<@greet>hello Emma! 输出为 hello Emma! hello Emma! hello Emma! hello Emma!

2-3、嵌套的内容可以是有效的FTL,例如: <#macro welcome> <#nested>

<#macro greet person color=\

<@welcome>

<@greet person=\<@greet person=\<@greet person=\ 输出为:

2-4、宏定义中的局部变量对嵌套内容是不可见的,例如: <#macro repeat count> <#local y=\ <#list 1..count as x>

${y}${count}/${x}:<#nested />

<@repeat count=3> ${y?default(\ ${x?default(\${count?default(\ 输出结果为 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 />

<@repeat count=4;c,halfc,last> ${c}. ${halfc} <#if last> last! 输出结果是 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 -->

9. ${x} <#-- plain2 --> <#macro test> 2. ${x} <#-- plain --> <#local x=\3. ${x} <#-- local --> <#list [\4. ${x} <#-- loop -->

5. ${x} <#-- local -->

4)、内部循环变量隐藏同名的外部循环变量 <#list [\${x} <#-- loop1 --> <#list [\${x} <#-- loop2 --> <#list [\${x} <#-- loop3 -->

${x} <#-- loop2 -->

具体到和webwork整合,因为本身webwork提供了整合servlet,如果要增加全局共享变量,可以通过修改com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实现,我们可以在这个servlet初始化的时候来初始化全局共享变量 与webwork整合配置 配置web.xml

freemarker

com.opensymphony.webwork.views.freemarker.FreemarkerServlet

TemplatePath /

NoCache true

ContentType text/html

template_update_delay 0

default_encoding GBK

number_format

0.##########

1

freemarker *.ftl

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>文本或表达式的功能,允许对中间的最终文本进行解析转换

例子:实现<@upcase>str 将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

打印输出: 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} 输出: 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 seq?chunk(4, '-') as row>

<#list row as cell>${cell} 输出: 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 2..5 as x> ${x} <#list [2,3,4,5] as x> ${x}

数组的拼接

<#list [\ - ${user} ★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} 输出: - 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

Creating mouse...

<#assign mouse = \<#if mouse?exists> Mouse found <#else>

No mouse found 输出 :

No mouse found Creating mouse...

本文来源:https://www.bwwdw.com/article/zhk3.html

Top