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}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM