freemarker 模板

1 总体结构

模板(FTL 编程)是由如下部分混合而成的:

Text 文本:文本会照着原样来输出。

Interpolation 插值:这部分的输出会被计算的值来替换。插值由${和}所分隔(或者#{和},这种风格已经不建议再使用了)。

FTL tags 标签:FTL 标签和 HTML 标签很相似,但是它们却是给 FreeMarker 的指示,而且不会打印在输出内容中。

Comments 注释:FTL 的注释和 HTML 的注释也很相似,但它们是由<#--和-->来分隔的。注释会被 FreeMarker 所忽略,更不会在输出内容中显示。

2 指令

使用 FTL 标签来调用 directives 指令,比如调用 list 指令。

指令有两种类型:预定义指令和用户自定义指令。对于用户自定义的指令使用@来代替#

更深的区别在于如果指令没有嵌套内容,那么必须这么使用 <@mydirective parameters />而预定义指定则为<#directive something>

FreeMarker 可以不需要#来理解预定义指令(比如<if user == "Big Joe">...</if>)。而我们不建议这样来使用。

3 表达式

当需要给插值或者指令参数提供值时,可以使用变量或其他复杂的表达式。例如,我们设 x 为 8,y 为 5,那么(x+y)/2 的值就会被处理成数字类型的值 6.5

当给插值提供值时:插值的使用方式为${expression}

当给指令参数提供值时:在入门章节我们已经看到 if 指令的使用了。这个指令的语法是:<#if expression>...</#if>。这里的表达式计算结果必须是布尔类型的。

快速浏览(备忘单)

直接确定值

_1 字符串

如果文本本身包含用于字符引用的引号(双引号”或单引号’)或反斜杠时,应该在它们的前面再加一个反斜杠,这就是转义。转义允许你直接在文本中输入任何字符,也包括反斜杠。

下面的表格是 FreeMarker 支持的所有转义字符。

原生字符串:在原生字符串中,反斜杠和${没有特殊的含义,它们被视为普通的字符。为了表明字符串是原生字符串,在开始的引号或单引号之前放置字母 r,例如:

${r"${foo}"}
${r"C:\foo\bar"}

将会打印:

${foo}
C:\foo\bar

_2 数字 输入不带引号的数字就可以直接指定一个数字,必须使用点作为小数的分隔符而不能是

其他的分组分隔符。

_3 布尔值 直接写 true 或 false 就表征一个布尔值了,不需使用引号。

_4 序列

指定一个文字的序列,使用逗号来分隔其中的每个子变量,然后把整个列表放到方括号中。例如:

<#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>

列表中的项目是表达式,那么也可以这样做:[2 + 2, [1, 2, 3, 4], "whatnot"],其中第一个子变量是数字 4,第二个子变量是一个序列,第三个子变量是字符串”whatnot”。 也可以用 start..end 定义存储数字范围的序列,这里的 start 和 end 是处理数

字值表达式,比如 2..5 和[2, 3, 4, 5]是相同的,但是使用前者会更有效率(内存占用少而且速度快)。可以看出前者也没有使用方括号,这样也可以用来定义递减的数字范围,比如 5..2。(此外,还可以省略 end,只需 5..即可,但这样序列默认包含 5,6,7,8

等递增量直到无穷大)

_5 哈希表

在模板中指定一个哈希表,就可以遍历用逗号分隔开的“键/值”对,把列表放到花括号内。键和值成对出现并以冒号分隔。看这个例子:{"name":"green mouse", "price":150}。注意到名字和值都是表达式,但是用来检索的名字就必须是字符串类型的。

4 检索变量

_1 顶层变量

为了访问顶层的变量,可以简单地使用变量名。

_2 从哈希表中检索数据

如果有一个表达式的结果是哈希表,那么我们可以使用点和子变量的名字得到它的值.

下面这些示例它们含义都是相等的:book.author.name, book["author"].name, book.author.["name"], book["author"]["name"]

如果我们想 指 定 同一个表达式 的 子变量,那么还有另外一种语法格式 :在方括号中可以给出任意长度字符串的表达式。在上面这个数据模型示例中你还可以这么来获取 title:book[test] :这里的test是根元素test中的值.

_3 从序列中检索数据

这和从哈希表中检索是相同的,但是你只能使用方括号语法形式来进行,而且方括号内的表达式最终必须是一个数字而不是字符串。在第一章的数据模型示例中,为了获取第一个动物的名字(记住第一项数字索引是 0 而不是 1)可以这么来写:animals[0].name。

_4 特殊变量

特殊变量是由 FreeMarker 引擎本身定义的,为了使用它们,可以按照如下语法形式来

进行:.variable_name。

通常情况下是不需使用特殊变量,而对专业用户来说可能用到。所有特殊变量的说明可

以参见参考手册。

5 字符串操作

_1 插值(或连接)

可以在字符串的文字中使用${…}(#{…})。${...}的作用和在文本区的是相同的。

也可以使用+号来达到类似的效果,这是比较老的方法,也叫做字符串连接。

_2 获取一个字符

user[0]

获取一定范围内的字符,比如${user[1..4]}和${user[4..]}。然而现在这种使用方法已经被废弃了,作为它的替代,可以使用内建

函数 substring,

6 序列操作

_1 连接

序列的连接可以使用+号来进行,例如:

<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list>
- Joe
- Fred
- Julia
- Kate 

_2 序列切分

使 用 [firstindex..lastindex] 可 以 获 取 序 列 中的一部分 ,这里的firstindex 和lastindex 表达式的结果是数字。如果seq 存储序列"a", "b", "c", "d", "e", "f",那么表达式 seq[1..4]将会是含有"b", "c", "d", "e"的序列(索引为 1 的项是"b",索引为 4 的项是"e")。 lastindex
可以被省略,那么这样将会读取到序列的末尾。如果 seq 存储序列"a", "b", "c", "d", "e", "f",那么 seq[3..]将是含有"d", "e", "f"的序列。

7 哈希表操作

_1 连接

像连接字符串那样,也可以使用+号的方式来连接哈希表。如果两个哈希表含有键相同的项,那么在+号右侧的哈希表中的项目优先。

<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia}
Joe is 30
- Fred is 25
- Julia is 18

8 算数运算

有时我们只想获取计算结果的整数部分,这可以使用内建函数 int 来解决。

${(x/2)?int}
${1.1?int}
${1.999?int}
${-1.1?int}
${-1.999?int}

9 比较运算

测试两个值相等使用=(或者采用 Java 和 C 语言中的==,二者是完全等同的。) 测试两个值不等使用!=。

FreeMarker 解释>的时候可以把它当作 FTL 标签的结束符。为了避免这种问题,不得不将表达式放到括号内:<#if (x > y)>,或者可以在比较关系处使用>和<:<#if x > y>。可以使用 lt 代替<,lte代替<=,gt 代替>,gte 代替>=, 由于历史遗留的原因,FTL 也支持\lt, \lte, \gt 和 \gte,使用他们和使用不带反斜杠的效果一样。

10 逻辑操作

11 内建函数

内建函数以?形式提供变量的不同形式或者其他信息。使用内建函数的语法和访问哈希表子变量的语法很像,除了使用?号来代替

点,其他的都一样。例如得到字符串的大写形式:user?upper_case。

示例:

${test?html}
${test?upper_case?html}

假设字符串 test 存储”Tom & Jerry”,那么输出为:

Tom & Jerry
TOM & JERRY

12 方法调用

${repeat("What", 3)}

将会打印出:

WhatWhatWhat 

13 处理不存在的值

_1 默认值

使用形式 概 览 : unsafe_expr!default_expr 或 unsafe_expr! 或(unsafe_expr)!default_expr 或(unsafe_expr)!

这个操作符允许你为可能不存在的变量指定一个默认值。

例如,假设下面展示的代码中没有名为 mouse 的变量:

${mouse!"No mouse."}
<#assign mouse="Jerry">
${mouse!"No mouse."}

将会输出

No mouse.
Jerry

默认值可以是任何类型的表达式,也可以不必是字符串。你也可以这么写:hits!0或 colors!["red", "green", "blue"]。默认值表达式的复杂程度没有严格限制,你还可以这么来写:cargo.weight!(item.weight * itemCount + 10) 。

_2 检测不存在的值

使用形式概览:unsafe_expr??或(unsafe_expr)?? 这个操作符告诉我们一个值是否存在。基于这种情况,结果是 true 或 false。

示例如下,假设并没有名为 mouse 的变量:

<#if mouse??>
 Mouse found
<#else>
 No mouse found
</#if>
Creating mouse...
<#assign mouse = "Jerry">
<#if mouse??>
 Mouse found
<#else>
 No mouse found
</#if>
No mouse found
Creating mouse...
 Mouse found

14 括号

括号可以用来给表达式分组。示例如下:

 <#-- 输出是: -->
${3 * 2 + 2} <#-- 8 -->
${3 * (2 + 2)} <#-- 12 -->
${3 * ((2 + 2) * (1 / 2))} <#-- 6 -->
${"green " + "mouse"?upper_case} <#-- green MOUSE -->
${("green " + "mouse")?upper_case} <#-- GREEN MOUSE -->
<#if !( color = "red" || color = "green")>
 The color is nor red nor green
</#if>

15 表达式中的空格

FTL 忽略表达式中的多余空格

16 操作符的优先级

插值

插值的使用语法是:${expression},expression 可以是所有种类的表达式(比如${100 + x})。

插值是用来给插入具体值然后转换为文本(字符串)。插值仅仅可以在两种位置使用:

文本区(如<h1>Hello ${name}!</h1> )和字符串表达式(如<#include "/footer/${company}.html">)中。

如果插值在文本区(也就是说,不再字符串表达式中),如果 escapse 指令起作用了,即将被插入的字符串会被自动转义。

<#escape x as x?html>
 ...
 <p>Title: ${book.title}</p>
 <p>Description:
<#noescape>${book.description}</#noescape></p>
 <h2>Comments:</h2>
 <#list comments as comment>
 <div class="comment">
 ${comment}
 </div>
 </#list>
 ...
</#escape>

freemarker 模板

时间: 2025-01-06 04:23:15

freemarker 模板的相关文章

Spring Boot? 使用freemarker模板引擎渲染web视图

效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import java.util.Locale; import java.util.UUID; import javax.servlet.http.HttpSession; import com.sun.org.apache.regexp.internal.RE; import org.springframew

161213、Maven资源替换和Freemarker模板

先介绍一下本文的两位主角: Apache Maven - 正当红的项目管理工具 FreeMarker - 老牌的模板引擎 两者貌似互不相干,何来冲突呢? 原来Maven有一个内置的资源替换机制, 可以对由Maven管理的资源文件进行变量替换. 预定义的Maven属性变量包括${name},${project.version},${project.packaging}和${project.artifactId}等. 熟悉FreeMarker的同学就会发现Maven使用和FreeMarker相同的方

FreeMarker模板文件的组成(2)

1.FreeMarker模板文件主要由如下4个部分组成:       1.1文本:直接输出的部分       1.2注释:<#-- ... -->格式部分,不会输出       1.3插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出       1.4FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 2.概要介绍四部分 最简单的模板是普通  HTML  文件(或者是其他任何文本文件—FreeMarker  本身不属于HTML).

Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则.强大的功能.高效的渲染效率.详尽的帮助说明与不断的更新与维护.常见的前端模板引擎有: 常用的java后台模板引擎:jsp.FreeMarker.Velocity等. 请不要迷恋速度,为了推广的测试可能是片面的,好的模板引擎经得起时间考验,建议大家选择成熟的.常用的模板引擎.另外不管前后端的模板引擎

freemarker 模板中定义变量

在模板中可以定义三种类型的变量: 简单变量:它能从模板中的任何位置来访问,或者从使用 include 指令引入的模板访问.可以使用 assign 或 macro 指令来创建或替换这些变量. 局部变量:它们只能被设置在宏定义体内,而且只在宏内可见.一个局部变量的生存周期只是宏的调用过程.可以使用 local 指令在宏定义体内创建或替换局部变量. 循环变量:循环变量是由指令(如 list )自动创建的,而且它们只在指令的开始和结束标记内有效.宏的参数是局部变量而不是循环变量. 示例:使用 assig

freemarker 模板开发入门

数据模型 scalars标量:从根 root 开始指定它的路径,每级之间用点来分隔. 如:whatnot.fruits sequences 序列:使用数组的方括号方式来访问一个序列的子变量. 如:animals[0].name,whatnot.fruits[1] 总结: 数据模型可以被看做是树状结构的. 标量存储单一的值,这种类型的值可以是字符串,数字,日期/时间或者是布尔值. 哈希表是存储变量和与其相关且有唯一标识名称变量的容器. 序列是存储有序变量的容器.存储的变量可以通过数字索引来检索,索

Spring Boot 揭秘与实战(七) 实用技术篇 - FreeMarker 模板引擎

文章目录 1. FreeMaker 代替 JSP 作为页面渲染 2. 生成静态文件 3. 扩展阅读 4. 源代码 Spring Boot 提供了很多模板引擎的支持,例如 FreeMarker.Thymeleaf.这篇,我们看下 Spring Boot 如何集成和使用 FreeMarker. Spring Boot 中使用 FreeMarker 模板非常简单方便.如果想要使用FreeMarker 模板引擎,首先,修改 POM 文件,添加依赖. FreeMaker 代替 JSP 作为页面渲染 <de

FreeMarker模板文件

FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 下面是一个FreeMarker模板的例子,包含了以上所说的4个部分 <html><br>  <head

FreeMarker模板开发指南知识点梳理

freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件. 对于像我一样之前完全对freemarker没概念的来说,这种解释还是无法释疑解惑,需要说的再详尽点. freemarker有什么用? 模板编写