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}