Freemarker 语法详解

Freemarker 在线中文官方参考手册

Freemarker是一款模板引擎,是一种基于模版生成静态文件的通用工具,它是使用纯java编写的,一般用来生成HTML页面。

Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达式, 标签或者自定义标签等等,然后后台读取这个模板页面,解析其中的标签完成相对应的操作, 然后采用键值对的方式传递参数替换模板中的的取值表达式,做完之后 根据配置的路径生成一个新的html页面, 以达到静态化访问的目的。

一、FreeMarker模板文件

主要有4个部分组成:

  (1)文本,直接输出的部分
  (2)注释,即<#--...-->格式不会输出
  (3)插值(Interpolation):即${..}或者#{..}格式的部分,将使用数据模型中的部分替代输出
  (4)FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。

<html> 
<body>  
<#-- 注释部分 -->
<br>  
<#-- 下面使用插值 -->  
<h1>Welcome ${user} !</h1>
<p>We have these animals:
<u1>
<#-- 使用FTL指令 -->  
<#list animals as being>
  <li>${being.name} </li>
<#list>
<u1>
</body>
</html>

1. 指令

(1)list 指令

<#list nameList as names>    
  ${names}   
</#list>

主要是进行迭代服务器端传递过来的List集合,name 是 list 循环的时候取的一个循环变量。相关指令:

item_index:当前变量的索引值 
item_has_next:是否存在下一个对象
break:跳出迭代

(2)if 指令

<#if name == "freemarker">
  freemarker 模板引擎
</#if>
<#assign number1 = 8>
<#assign number2 = 5>
<#if (number1 + number2 > 12 || number1 - number2 > 6)>
    "*" : ${number1 * number2}
<#else>
    "/" : ${number1 / number2}
</#if>
<#if users??>  <#--空判断-->
    <#list users as user >
        ${user.id} - ${user.name}
    </#list>
<#else>
    ${user!"变量为空则给一个默认值"}
</#if>

(3)include 指令

<#include filename>
<#include filename options>

该标签用于导入文件。option包含下面2种属性:

encoding="GBK" 编码格式 
parse=true 是否作为ftl语法解析,默认是 true,false 就是以文本方式引入。注意在ftl文件里布尔值都是直接赋值的如 parse=true,而不是 parse="true"

<#include "include.html"/>  
<#include "include.ftl" encoding="GBK"/>
<#include "/common/copyright.ftl" encoding="GBK" parse=false/>

(4)switch , case , default , break 指令

语法:

<#switch value>
    <#case refValue>语句1<#break>
    <#case refValue>语句2<#break>
    <#default>语句3
</#switch>

示例:

<#switch name>
    <#case "freemarker">This is a freemarker's template.<#break>
    <#case "velocity">This is a velocity's template.<#break>
    <#default>This is a jsp's template.
</#switch>

(5)macro 宏指令

定义宏:

<#macro mo>
    定义无参数的宏macro--${name}
</#macro>
<#macro moArgs a b c>
    定义带参数的宏macro--${a+b+c}
</#macro>

调用宏:

<@mo />
<@moArgs a=1 b=2 c=3 />

(6)import 指令

类似于java里的 import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件。

<#import path as hash>

path:文件路径

hash:为导入的文件定义命名空间

(7)assign 指令

assign指令用于为该模板页面创建或替换一个顶层变量。

<#assign a=1>
<#assign x=1 y=2>
<#assign arg1>
    hello freemarker
</#assign>

<#assign arg2>
    ${arg1} world
</#assign>

<#assign arg3="${arg1} world">

(8)noparse 指令

noparse指令指定FreeMarker不处理该指定里包含的内容。

<#assign a=1>
<#noparse>
    ${a}
</#noparse>

输出结果:
${a}

(9)setting 指令

<#setting name=value>

该指令用于设置FreeMarker的运行环境,name的取值范围包含如下几个:

locale:该选项指定该模板所用的国家/语言选项 

number_format:指定格式化输出数字的格式 

boolean_format:指定两个布尔值的语法格式,默认值是true,false 

date_format,time_format,datetime_format:指定格式化输出日期的格式 

time_zone:设置格式化输出日期时所使用的时区

二、示例

字符串输出:
${"Hello ${name} !"} / ${"Hello " + name + " !"}
<#assign cname=r"特殊字符完成输出(http:\www.baidu.com)">
${cname}

字符串截取 : 
通过下标直接获取下标对应的字母: ${name[2]}
起点下标..结尾下标截取字符串:${name[0..5]}

算数运算:
<#-- 支持"+"、"-"、"*"、"/"、"%"运算符 -->
<#assign number1 = 10>
<#assign number2 = 5>
"+" : ${number1 + number2}
"-" : ${number1 - number2}
"*" : ${number1 * number2}
"/" : ${number1 / number2}
"%" : ${number1 % number2}

比较运算符:
<#if number1 + number2 gte 12 || number1 - number2 lt 6>
"*" : ${number1 * number2}
<#else>
"/" : ${number1 / number2}
</#if>

内建函数:
<#assign data = "abcd1234">
第一个字母大写:${data?cap_first}
所有字母小写:${data?lower_case}
所有字母大写:${data?upper_case}
<#assign floatData = 12.34>
数值取整数:${floatData?int}
获取集合的长度:${users?size}
时间格式化:${dateTime?string("yyyy-MM-dd")}

空判断和对象集合:
<#if users??>
<#list users as user >
${user.id} - ${user.name}
</#list>
<#else>
${user!"变量为空则给一个默认值"}
</#if>

Map集合:
<#assign mapData={"name":"程序员", "salary":15000}>
直接通过Key获取 Value值:${mapData["name"]}
通过Key遍历Map:
<#list mapData?keys as key>
Key: ${key} - Value: ${mapData[key]}
</#list>
通过Value遍历Map:
<#list mapData?values as value>
Value: ${value}
</#list>

List集合:
<#assign listData=["ITDragon", "blog", "is", "cool"]>
<#list listData as value>${value} </#list>

include指令:
引入其他文件:<#include "otherFreeMarker.ftl" />

macro宏指令:
<#macro mo>
定义无参数的宏macro--${name}
</#macro>
使用宏macro: <@mo />
<#macro moArgs a b c>
定义带参数的宏macro-- ${a+b+c}
</#macro>
使用带参数的宏macro: <@moArgs a=1 b=2 c=3 />

命名空间:
<#import "otherFreeMarker.ftl" as otherFtl>
${otherFtl.otherName}
<@otherFtl.addMethod a=10 b=20 />
<#assign otherName="修改otherFreeMarker.ftl中的otherName变量值"/>
${otherFtl.otherName}
<#assign otherName="修改otherFreeMarker.ftl中的otherName变量值" in otherFtl />
${otherFtl.otherName}

 

posted @ 2018-10-15 16:01  寒爵  阅读(20739)  评论(0编辑  收藏  举报