[关闭]
@brizer 2016-03-01T11:28:27.000000Z 字数 2653 阅读 1808

Freemarker模板学习笔记一


前言

工程要用到,需要先熟悉基本的用法,后期再深入了解。


模板

Freemarkder是一门模板语言,用来前后端分离的。
总体结构由文本,插值,FTL标签,注释组成。一个图来说明:


指令

说说内部指令。

if指令

  1. <html>
  2. <head>
  3. <title>Welcome!</title>
  4. </head>
  5. <body>
  6. <h1>
  7. Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
  8. </h1>
  9. <p>Our latest product:
  10. <a href="${latestProduct.url}">${latestProduct.name}</a>!
  11. </body>
  12. </html>

判断条件,当condition的判断结果为false(布尔值)时,在<#if condition></#if>标签之间的内容将会被略过。

  1. <#if animals.python.price != 0>
  2. Pythons are free today!
  3. </#if>

!=就是不等于。

else指令

有了if就不能没有else。

  1. <#if animals.python.price < animals.elephant.price>
  2. Pythons are cheaper than elephants today.
  3. <#else>
  4. Pythons are not cheaper than elephants today.
  5. </#if>

list指令

用来批量处理:

  1. <p>We have these animals:
  2. <table border=1>
  3. <tr><th>Name<th>Price
  4. <#list animals as being>
  5. <tr><td>${being.name}<td>${being.price} Euros
  6. </#list>
  7. </table>
  8. <p>We have these animals:
  9. <table border=1>
  10. <tr><th>Name<th>Price
  11. <tr><td>mouse<td>50 Euros
  12. <tr><td>elephant<td>5000 Euros
  13. <tr><td>python<td>4999 Euros
  14. </table>

include指令

在当前模板中插入其他文件的内容

  1. <html>
  2. <head>
  3. <title>Test page</title>
  4. </head>
  5. <body>
  6. <h1>Test page</h1>
  7. <p>Blah blah...
  8. <#include "/copyright_footer.html">
  9. </body>
  10. </html>

copyright_footer.html内容如下:

  1. <hr>
  2. <i>
  3. Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
  4. <br>
  5. All Rights Reserved.
  6. </i>

最后结果为:

  1. <html>
  2. <head>
  3. <title>Test page</title>
  4. </head>
  5. <body>
  6. <h1>Test page</h1>
  7. <p>Blah blah...
  8. <hr>
  9. <i>
  10. Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,
  11. <br>
  12. All Rights Reserved.
  13. </i>
  14. </body>
  15. </html>

默认值

  1. <h1>Welcome ${user!"Anonymous"}!</h1>

如果user不存在,则取Anonymous,看demo:

检查不存在值

利用??操作符。

Assign
看demo:


内建函数

内建函数以?形式提供变量的不同形式或者其他信息。
Html cap_first lower_case upper_case trim size int

使用方式如下:

  1. ${test?html}
  2. ${test?upper_case?html}


插值

使用场景分为文本区字符串表达式

  1. <h1>Hello ${name}!</h1>
  2. <#include "/footer/${company}.html">

所以说,不要在不能使用插值的地方使用它!!!比如

  1. <#if ${isBig}>WOW!</#if>

就是错误的,要改成:

  1. <#if isBig>WOW!</#if>

字符串插值转义

看下面的例子:

转换结果为:

可以看到在escape区域中而不属于noescape的区域的插值都从x变为了x?html。这样就可以转义这些插值中的特殊字符了。


自定义指令

macro指令来定义。
使用#来定义宏,使用@来使用宏:

参数

定义宏时可以带参数,使用时可以带参数。

如果是多参数,参数的顺序并不重要:

嵌套内容

通过#nested来嵌套内容。
看一个demo:

也可以多次使用:

嵌套的内容可以是宏,运用得好将非常灵活:

宏中的循环

前面说到用list指令可以实现循环,那么在宏中也可以有循环,也是利用nested:

一个宏可以使用多个循环变量:

输出:

好好体会..的用法。


定义变量

在模板中可以定义三种类型的变量:
简单变量,它能从模板中的任何位置来访问,或者从使用include指令引入的模板访问。可以使用assign和macro指令来创建或替换这些变量。
局部变量,它们只能被设置在宏定义体内,而且只在宏内可见。使用local指令。
循环变量,由指令自动创建的。

先看看简单变量assign:

再来说说局部变量和循环变量,局部变量会隐藏同名的简单变量,循环变量会隐藏同名的局部变量和简单变量

输出结果为:

如果都是循环变量,则内部循环变量会隐藏外部循环变量

如果想要跳出作用域,直接使用数据模型中的变量,使用globals关键字即可:


命名空间

定义

我们通过assign和macro创建的变量的集合就是命名空间。命名空间的作用在各种编程语言中都已见识,这里假设我们定义了自己的macro和assign位于lib/my_test.ftl中。

  1. <#macro copyright date>
  2. <p>Copyright (C) ${date} Julia Smith. All rights reserved.</p>
  3. </#macro>
  4. <#assign mail = "jsmith@acme.com">

通过import来引用:

  1. <#import "/lib/my_test.ftl" as my>
  2. <#-- 被称为"my"的哈希表就会是那个"大门" -->
  3. <@my.copyright date="1999-2002"/>
  4. ${my.mail}

最后得到效果:

覆盖变量

引入命名空间后替换变量需要在assign的基础上加上in关键字

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注