前言

FreeMarker 是一款模板引擎:即一种基于模板、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。
FreeMarker 实际上是被设计用来生成 HTML 页面,尤其是通过实现了基于 MVC(Model View Controller, 模型-视图-控制器)模式的 Java Servlet 应用程序。

freemarker的常用指令

模板+数据模型(java)=输出

  • 插值
    ${variableName}
    ${obj.attr}
  • 逻辑运算符,逻辑运算符只能用于布尔值。
    &&:逻辑与;||:逻辑或; !:逻辑非
  • 内建函数
    FreeMarker提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来转换输出变量。
  1. 字符串相关常用的内建函数
    html:对字符串进行HTML编码;
    cap_first:使字符串第一个字母大写;
    lower_case:将字符串转成小写;
    upper_case:将字符串转成大写;
  2. 集合相关常用的内建函数

size:获得集合中元素的个数;

  1. 数字值相关常用的内建函数

int:取得数字的整数部分。

模板开发语句

  • if使用指令(常用必会)

    1. <#if x == 1>
    2. x is 1
    3. </#if>
    4. //else if ; else 用法
    5. <#assign age=23>
    6. <#if (age>60)>老年人
    7. <#elseif (age>40)>中年人
    8. <#elseif (age>20)>青年人
    9. <#else> 少年人
    10. </#if>
  • switch使用指令(常用必会)

    1. <#switch x>
    2. <#case 1>
    3. 1
    4. <#break>
    5. <#case 2>
    6. 2
    7. <#break>
    8. <#default>
    9. 0
    10. <#break>
    11. </#switch>
  • list循环格式(常用必会)

    1. <#list students as s>
    2. <tr>
    3. <td>${s.no}</td>
    4. <td>${s.name}</td>
    5. <td>${s.sex}</td>
    6. </tr>
    7. </#list>
  • assign指令使用示例,定义模板变量,可以使用模板变量(常用必会)

    1. <#-- 直接定义 -->
    2. <#assign x="Hello ${user}!">
    3. <#-- 定义 -->
    4. <#assign x>
    5. <#list ["星期一", "星期二", "星期三", "星期四", "星期五"] as n>
    6. ${n}
    7. </#list>
    8. </#assign>
    9. ${x}
  • 集合以及对象都可以做叠加(常用必会)

    1. <#list ["星期一","星期二","星期三"] + ["星期四","星期五"] as x>
    2. ${x}
    3. </#list>
    4. <#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>
  • import指令 (常用必会)
    该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下: <#import "/lib/common.ftl" as com>
    上面的代码将导入/lib/common.ftl模板文件中的所有变量,交将这些变量放置在一个名为com的Map对象中.

  • include语法(常用必会)
    可以包含页面:<#include filename [options]>,在上面的语法格式中,两个参数的解释如下:
    1.filename:该参数指定被包含的模板文件 ;
    2.options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true.
  • noparse指令
    noparse指令指定FreeMarker不处理该指定里包含的内容,该指令的语法格式如下:

    1. <#noparse>
    2. <#list books as book>
    3. <tr><td>${book.name}<td>作者:${book.author}
    4. </#list>
    5. </#noparse>
    6. 输出如下:
    7. <#list books as book>
    8. <tr><td>${book.name}<td>作者:${book.author}
    9. </#list>
  • escape , noescape指令
    escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值,使用escape指令的语法格式如下:

    1. <#escape identifier as expression>...
    2. <#noescape>...</#noescape>
    3. </#escape>
    4. //看如下的代码:
    5. <#escape x as x?html>
    6. First name:${firstName}
    7. Last name:${lastName}
    8. Maiden name:${maidenName}
    9. </#escape>
    10. //上面的代码等同于:
    11. First name:${firstName?html}
    12. Last name:${lastName?html}
    13. Maiden name:${maidenName?html}
  • setting指令
    该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:<#setting name=value>,在这个格式中,name的取值范围包含如下几个:
    locale:该选项指定该模板所用的国家/语言选项
    number_format:指定格式化输出数字的格式
    boolean_format:指定两个布尔值的语法格式,默认值是true,false
    date_format,time_format,datetime_format:指定格式化输出日期的格式
    time_zone:设置格式化输出日期时所使用的时区

  • layout(必会的)
  1. layout.ftl,模板布局页面

    1. <#macro layout>
    2. <html>
    3. <head>
    4. </head>
    5. <body>
    6. <div style="width: 700px; text-align:center; font-size:30px;">
    7. <#include "header.ftl">
    8. <#include "sidebar.ftl">
    9. <#-- 在这里嵌入main content -->
    10. <#nested>
    11. <#include "footer.ftl">
    12. </div>
    13. </body>
    14. </html>
    15. </#macro>
  2. page.ftl,具体内容页面 ``` <#— 引入布局指令的命名空间 —> <#import “../layout/defaultLayout.ftl” as defaultLayout> <#— 调用布局指令 —> <@defaultLayout.layout> <#— 将下面这个main content嵌入到layout指令的nested块中 —>

    main content

/@defaultLayout.layout ```

  • 注释部分
    <#-- 注释部分 -->