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}