- ${}:FreeMarker 将在输出中将其替换为大括号内表达式的实际值。它们被称为 插值。
- FTL 标签(用于 FreeMarker 模板语言标签):FTL 标签有点类似于 HTML 标签,但它们是 FreeMarker 的指令,不会打印到输出。这些标签的名称以
#
。(用户定义的 FTL 标签@
代替#
,但它们是一个高级主题。) - 注释:注释类似于 HTML 注释,但它们由
<#--
和分隔-->
。与 HTML 注释不同,FTL 注释不会进入输出(在访问者的页面源中不可见),因为 FreeMarker 会跳过它们。
注意:
任何不是 FTL 标签或插值或注释的东西都被认为是静态文本,FreeMarker 不会解释; 它只是按原样打印到输出。
您可以轻松地尝试在 http://freemarker-online.kenshoo.com/上编写模板.
if 指令
- 使用该
if
指令,您可以有条件地跳过模板的一部分。例如,假设在第一个例子中,你想要问候你的老板 Big Joe,与其他用户不同:
<html>
<head>
<title>欢迎您!</title>
<head>
<body>
<h1>欢迎John Doe! <#if user ==“Big Joe”> ,我们敬爱的领导者****! <h1>
<a href="我们的最新产品: products/greenmouse.html">绿色鼠标!<a>
<body>
<html>
- 在这里你告诉 FreeMarker,只有当变量的值
user
等于字符串时,“我们心爱的领导者”应该存在"Big Joe"
。通常,如果为 false(布尔值),则跳过之间和 标签 之间的内容。<#if _condition_>````_condition_
- 让我们
_condition_
更仔细地看一下 :
==
是一个运算符,它测试左侧和右侧的值是否相等,结果是一个布尔值,相应地为 true 或 false。在==
我的左侧 引用了一个应该已经熟悉的语法变量 ; 这将被替换为变量的值。通常,指令或插值中的未加引号的单词被视为对变量的引用。在右侧,我指定了一个文字字符串。模板中的文字字符串必须 _始终_放在引号内。
这将打印“蟒蛇今天免费!” 如果他们的价格是 0:
<#if animals.python.price == 0 > 今天蟒蛇免费!
正如你可能猜到的那样,!=
意思是“不等于”。
你也可以写这样的东西(使用用于演示哈希的数据模型):
<#if animals.python.price < animals.elephant.price > 蟒蛇比今天的大象便宜。
使用<#else>
标记,您可以指定条件为 false 时要执行的操作。例如:
<#if> animals.python.price < animals.elephant.price>
蟒蛇比今天的大象便宜。<#else>
蟒蛇今天并不比大象便宜。
</#if>
list 指令
当您想要列出某些内容时,需要这样做。例如,如果将此模板与先前用于演示序列的数据模型合并:
@GetMapping("/test")
public String test(Map, String> map, Model model) {
List userList = new ArrayList<>();
map.put("name", "Freemarker");
User user1 = new User();
User user2 = new User();
user1.setUsername("admin");
user1.setPassword("admin");
user2.setUsername("zhangsan");
user2.setPassword("zhangsan");
userList.add(user1);
userList.add(user2);
model.addAttribute("lists", userList);
System.out.println(userList);
return "test";
}
hello <#if name !='Freemarker'>,不是Freemarker<#else>,是Freemarker
list长度:${lists?size}
border="1">
<#list lists as user>
${user.username}
${user.password}
然后输出将是:
<p>我们有这些动物</p>:
<table borde = 1 >
<#list animals as animal>
<tr><td>小鼠</td>5元</tr>
<tr><td>小猫</td>6元</tr>
<tr><td>小狗</td>7元</tr>
Euros
</list>
</table>
include 指令
使用该 include
指令,您可以将另一个文件的内容插入到模板中。
假设您必须在多个页面上显示相同的版权声明。您可以创建仅包含版权声明的文件,并将该文件插入您需要该版权声明的任何位置。比如说,您将此版权声明存储在 copyright_footer.html
:
<#include“/copyright_footer.html”>
使用内置插件
所谓的内置函数就像子变量(或者更像是方法,如果你知道 Java 术语),它们不是来自数据模型,而是由 FreeMarker 添加到值中。为了明确子变量的来源,您必须使用 ?
(问号)而不是 .
(点)来访问它们。一些最常用的内置插件的示例:
-
user?upper_case
给出大写版本的值user
(如“JOHN DOE”而不是“John Doe”) -
animal.name?cap_first
给animal.name
它的第一个字母转换为大写字母(如“鼠标”而不是“鼠标”) -
user?length
给出的数量 _的字符_中的值user
(8 个用于“John Doe 的”) -
animals?size
给出的数量 _项目_中animals
(在我们的示例数据模型 3)序列 -
如果你在
<#list animals as animal>
和相应的 `` 标签之间:-
animal?index
给出基于 0 的animal
内部 索引animals
-
animal?counter
就像index
,但给出了基于 1 的索引 -
animal?item_parity
根据当前的计数器奇偶校验,给出字符串“奇数”或“偶数”。这通常用于着色具有交替颜色的行,例如 ``。
-
一些内置函数需要参数来指定更多的行为,例如:
-
animal.protected?string("Y", "N")
返回字符串“Y”或“N”,具体取决于布尔值animal.protected
。 -
animal?item_cycle('lightRow', 'darkRow')
是item_parity
早期更通用的变体 。 -
fruits?join(", ")
:通过连接项目将列表转换为字符串,并在每个项目之间插入参数分隔符(如“orange,banana”) -
user?starts_with("J")
给出 boolean true 为 false,具体取决于是否user
以字母“J”开头。
内置应用程序可以链接,就像 fruits?join(", ")?upper_case
首先将列表 a 转换为字符串,然后将其转换为大写。(这就像你可以链 .
-s(点)一样。)
您可以在 Reference 中找到完整的内置函数集。
处理缺失的变量
数据模型通常具有可选的变量(即,有时缺失)。为了发现一些典型的人为错误,FreeMarker 不会容忍对缺失变量的引用,除非你明确告诉如果缺少变量该怎么做。在这里,我们将展示两种最典型的方法。
程序员注意事项:null
FreeMarker 中不存在的变量和值的变量是相同的。这里使用的“缺失”术语涵盖了两种情况。
无论您何时引用变量,都可以通过使用 a !
和默认值跟随变量名称来为缺少变量的情况指定默认值。如下例所示,当 user
数据模型中缺少时,模板的行为就像 if user
的值是字符串一样 "visitor"
。(如果 user
没有丢失,此模板的行为与之完全相同 ${user}
):
欢迎 $ {user !“visitor” }!
您可以通过添加 ??
其名称来询问变量是否未丢失 。将此与已经引入的 if
指令相结合,如果 user
缺少该变量,您可以跳过整个问候语:
<#if 用户?> 欢迎 $ {user}!
关于具有多个步骤的变量访问,例如 animals.python.price
,animals.python.price!0
只有在 animals.python
永远不会丢失且只有最后一个子变量 price
可能丢失的情况下,写入 才是正确的 (在这种情况下,我们假设它是这样 0
)。如果 animals
或 python
缺少,模板处理将以“未定义变量”错误停止。为了防止这种情况,你必须写 (animals.python.price)!0
。在这种情况下,表达式将是 0
偶数 animals
或 python
缺失。同样的逻辑 ??
; animals.python.price??
对比 (animals.python.price)??
。
转义 HTML,XML 和其他标记
假设模板生成 HTML,并且您插入的值是纯文本(而不是 HTML),例如来自数据库的公司名称。在 HTML 中具有特殊含义的字符必须以这样的值进行 转义,例如 “Someone&Co。” 然后 应该打印“Someone &amp; Co.”。${_..._}``name``${name}
如果配置正确, FreeMarker 会自动转义所有打印的值 (这是程序员的责任; 请参见此处)。建议的做法是使用文件扩展名来激活 HTML 自动转义,使用文件扩展名来激活 XML 自动转义。${_..._}
ftlh``ftlx
如果启用了自动转义,则可以尝试 ${"<"}
检查原始输出(用于 HTML 或 XML 转义)。如果不是,并且配置不会被调整,请将其添加为模板的第一行:
<#ftl output_format =“HTML”>
(如果生成 XML,请使用 "XML"
而不是 "HTML"
上面的。)
如果要打印的字符串值故意包含标记,则必须防止自动转义 。${_value_?no_esc}
注意:
这里描述的自动转义类型至少需要 FreeMarker 2.3.24。如果必须使用早期版本,请改用 deprecated escape
指令。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于