Freemarker 操作指令

本贴最后更新于 2118 天前,其中的信息可能已经斗转星移
  • ${}: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_firstanimal.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.priceanimals.python.price!0 只有在 animals.python 永远不会丢失且只有最后一个子变量 price 可能丢失的情况下,写入 才是正确的 (在这种情况下,我们假设它是这样 0)。如果 animalspython 缺少,模板处理将以“未定义变量”错误停止。为了防止这种情况,你必须写 (animals.python.price)!0。在这种情况下,表达式将是 0 偶数 animalspython 缺失。同样的逻辑 ??; 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 指令

  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 463 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...