freemarker 模板
1 總體結構
模板(FTL 編程)是由如下部分混合而成的:
Text 文本:文本會照著原樣來輸出。
Interpolation 插值:這部分的輸出會被計算的值來替換。插值由${和}所分隔(或者#{和},這種風格已經不建議再使用了)。
FTL tags 標簽:FTL 標簽和 HTML 標簽很相似,但是它們卻是給 FreeMarker 的指示,而且不會打印在輸出內容中。
Comments 注釋:FTL 的注釋和 HTML 的注釋也很相似,但它們是由<#--和-->來分隔的。注釋會被 FreeMarker 所忽略,更不會在輸出內容中顯示。
2 指令
使用 FTL 標簽來調用 directives 指令,比如調用 list 指令。
指令有兩種類型:預定義指令和用戶自定義指令。對于用戶自定義的指令使用@來代替#
更深的區別在于如果指令沒有嵌套內容,那么必須這么使用 <@mydirective parameters />而預定義指定則為<#directive something>
FreeMarker 可以不需要#來理解預定義指令(比如<if user == "Big Joe">...</if>)。而我們不建議這樣來使用。
3 表達式
當需要給插值或者指令參數提供值時,可以使用變量或其他復雜的表達式。例如,我們設 x 為 8,y 為 5,那么(x+y)/2 的值就會被處理成數字類型的值 6.5
當給插值提供值時:插值的使用方式為${expression}
當給指令參數提供值時:在入門章節我們已經看到 if 指令的使用了。這個指令的語法是:<#if expression>...</#if>。這里的表達式計算結果必須是布爾類型的。
快速瀏覽(備忘單)
直接確定值
_1 字符串
如果文本本身包含用于字符引用的引號(雙引號”或單引號’)或反斜杠時,應該在它們的前面再加一個反斜杠,這就是轉義。轉義允許你直接在文本中輸入任何字符,也包括反斜杠。
下面的表格是 FreeMarker 支持的所有轉義字符。
原生字符串:在原生字符串中,反斜杠和${沒有特殊的含義,它們被視為普通的字符。為了表明字符串是原生字符串,在開始的引號或單引號之前放置字母 r,例如:
${r"${foo}"}
${r"C:\foo\bar"}
將會打印:
${foo}
C:\foo\bar
_2 數字輸入不帶引號的數字就可以直接指定一個數字,必須使用點作為小數的分隔符而不能是
其他的分組分隔符。
_3 布爾值 直接寫 true 或 false 就表征一個布爾值了,不需使用引號。
_4 序列
指定一個文字的序列,使用逗號來分隔其中的每個子變量,然后把整個列表放到方括號中。例如:
<#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>
列表中的項目是表達式,那么也可以這樣做:[2 + 2, [1, 2, 3, 4], "whatnot"],其中第一個子變量是數字 4,第二個子變量是一個序列,第三個子變量是字符串”whatnot”。 也可以用 start..end 定義存儲數字范圍的序列,這里的 start 和 end 是處理數字值表達式,比如 2..5 和[2, 3, 4, 5]是相同的,但是使用前者會更有效率(內存占用少而且速度快)。可以看出前者也沒有使用方括號,這樣也可以用來定義遞減的數字范圍,比如 5..2。(此外,還可以省略 end,只需 5..即可,但這樣序列默認包含 5,6,7,8
等遞增量直到無窮大)
_5 哈希表
在模板中指定一個哈希表,就可以遍歷用逗號分隔開的“鍵/值”對,把列表放到花括號內。鍵和值成對出現并以冒號分隔。看這個例子:{"name":"green mouse", "price":150}。注意到名字和值都是表達式,但是用來檢索的名字就必須是字符串類型的。
4 檢索變量
_1 頂層變量
為了訪問頂層的變量,可以簡單地使用變量名。
_2 從哈希表中檢索數據
如果有一個表達式的結果是哈希表,那么我們可以使用點和子變量的名字得到它的值.
下面這些示例它們含義都是相等的:book.author.name, book["author"].name, book.author.["name"], book["author"]["name"]
如果我們想 指 定 同一個表達式 的 子變量,那么還有另外一種語法格式 :在方括號中可以給出任意長度字符串的表達式。在上面這個數據模型示例中你還可以這么來獲取 title:book[test] :這里的test是根元素test中的值.
_3 從序列中檢索數據
這和從哈希表中檢索是相同的,但是你只能使用方括號語法形式來進行,而且方括號內的表達式最終必須是一個數字而不是字符串。在第一章的數據模型示例中,為了獲取第一個動物的名字(記住第一項數字索引是 0 而不是 1)可以這么來寫:animals[0].name。
_4 特殊變量
特殊變量是由 FreeMarker 引擎本身定義的,為了使用它們,可以按照如下語法形式來
進行:.variable_name。
通常情況下是不需使用特殊變量,而對專業用戶來說可能用到。所有特殊變量的說明可
以參見參考手冊。
5 字符串操作
_1 插值(或連接)
可以在字符串的文字中使用${…}(#{…})。${...}的作用和在文本區的是相同的。
也可以使用+號來達到類似的效果,這是比較老的方法,也叫做字符串連接。
_2 獲取一個字符
user[0]
獲取一定范圍內的字符,比如${user[1..4]}和${user[4..]}。然而現在這種使用方法已經被廢棄了,作為它的替代,可以使用內建
函數 substring,
6 序列操作
_1 連接
序列的連接可以使用+號來進行,例如:
<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list>
- Joe
- Fred
- Julia
- Kate
_2 序列切分
使 用 [firstindex..lastindex] 可 以 獲 取 序 列 中的一部分 ,這里的firstindex 和lastindex 表達式的結果是數字。如果seq 存儲序列"a", "b", "c", "d", "e", "f",那么表達式 seq[1..4]將會是含有"b", "c", "d", "e"的序列(索引為 1 的項是"b",索引為 4 的項是"e")。 lastindex
可以被省略,那么這樣將會讀取到序列的末尾。如果 seq 存儲序列"a", "b", "c", "d", "e", "f",那么 seq[3..]將是含有"d", "e", "f"的序列。
7 哈希表操作
_1 連接
像連接字符串那樣,也可以使用+號的方式來連接哈希表。如果兩個哈希表含有鍵相同的項,那么在+號右側的哈希表中的項目優先。
<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia}
Joe is 30
- Fred is 25
- Julia is 18
8 算數運算
有時我們只想獲取計算結果的整數部分,這可以使用內建函數 int 來解決。
${(x/2)?int}
${1.1?int}
${1.999?int}
${-1.1?int}
${-1.999?int}
9 比較運算
測試兩個值相等使用=(或者采用 Java 和 C 語言中的==,二者是完全等同的。) 測試兩個值不等使用!=。
FreeMarker 解釋>的時候可以把它當作 FTL 標簽的結束符。為了避免這種問題,不得不將表達式放到括號內:<#if (x > y)>,或者可以在比較關系處使用>和<:<#if x > y>。可以使用 lt 代替<,lte代替<=,gt 代替>,gte 代替>=, 由于歷史遺留的原因,FTL 也支持\lt, \lte, \gt 和 \gte,使用他們和使用不帶反斜杠的效果一樣。
10 邏輯操作
11 內建函數
內建函數以?形式提供變量的不同形式或者其他信息。使用內建函數的語法和訪問哈希表子變量的語法很像,除了使用?號來代替
點,其他的都一樣。例如得到字符串的大寫形式:user?upper_case。

示例:
${test?html}
${test?upper_case?html}
假設字符串 test 存儲”Tom & Jerry”,那么輸出為: Tom & Jerry
TOM & JERRY
12 方法調用
${repeat("What", 3)}
將會打印出:WhatWhatWhat
13 處理不存在的值
_1 默認值
使用形式 概 覽 : unsafe_expr!default_expr 或 unsafe_expr! 或(unsafe_expr)!default_expr 或(unsafe_expr)!
這個操作符允許你為可能不存在的變量指定一個默認值。
例如,假設下面展示的代碼中沒有名為 mouse 的變量:
${mouse!"No mouse."}
<#assign mouse="Jerry">
${mouse!"No mouse."}
將會輸出 No mouse.
Jerry
默認值可以是任何類型的表達式,也可以不必是字符串。你也可以這么寫:hits!0或 colors!["red", "green", "blue"]。默認值表達式的復雜程度沒有嚴格限制,你還可以這么來寫:cargo.weight!(item.weight * itemCount + 10) 。_2 檢測不存在的值
使用形式概覽:unsafe_expr??或(unsafe_expr)?? 這個操作符告訴我們一個值是否存在。基于這種情況,結果是 true 或 false。
示例如下,假設并沒有名為 mouse 的變量:
<#if mouse??>
Mouse found
<#else>
No mouse found
</#if>
Creating mouse...
<#assign mouse = "Jerry">
<#if mouse??>
Mouse found
<#else>
No mouse found
</#if>
No mouse found
Creating mouse...
Mouse found
14 括號
括號可以用來給表達式分組。示例如下:
<#-- 輸出是: -->
${3 * 2 + 2} <#-- 8 -->
${3 * (2 + 2)} <#-- 12 -->
${3 * ((2 + 2) * (1 / 2))} <#-- 6 -->
${"green " + "mouse"?upper_case} <#-- green MOUSE -->
${("green " + "mouse")?upper_case} <#-- GREEN MOUSE -->
<#if !( color = "red" || color = "green")>
The color is nor red nor green
</#if>
15 表達式中的空格
FTL 忽略表達式中的多余空格
16 操作符的優先級
插值
插值的使用語法是:${expression},expression 可以是所有種類的表達式(比如${100 + x})。
插值是用來給插入具體值然后轉換為文本(字符串)。插值僅僅可以在兩種位置使用:
文本區(如<h1>Hello ${name}!</h1> )和字符串表達式(如<#include "/footer/${company}.html">)中。
如果插值在文本區(也就是說,不再字符串表達式中),如果 escapse 指令起作用了,即將被插入的字符串會被自動轉義。
<#escape x as x?html>
...
<p>Title: ${book.title}</p>
<p>Description:
<#noescape>${book.description}</#noescape></p>
<h2>Comments:</h2>
<#list comments as comment>
<div class="comment">
${comment}
</div>
</#list>
...
</#escape>
智能推薦
freemarker模板引擎
一。 freemarker簡介 在互聯網軟件內容網站中 一般首頁的訪問量大,為了提供首頁的訪問效率,一般 首頁的內容以及其中的新聞等信息都可以實現html靜態化 瀏覽器訪問時 設置瀏覽器的緩存策略和生成靜態頁面的周期一致 可以使訪問效率大大提升 同時配合cdn處理圖片 js css等資源 可以在首頁訪問時 理論完全脫離數據庫 降低應用壓力 原理...
FreeMarker模板引擎
課程介紹 了解模板引擎 掌握FreeMarker常用語法 在servlet中使用freeMarker 什么是模板引擎 數據 + 模板 = 結果 模板引擎將數據與展現有效的解耦 主流模板引擎 JSP FreeMarker Beetl : Beetl是Bee Template Language的縮寫,它絕不是簡單的另外一種模板引擎, 而是新一代的模板引擎,它功能強大,性能良好,超過當前流行的模板引擎。...
基于FreeMarker導出模板
今天,來簡單介紹一下基于freemarker來導出Excel 基于FreeMarker導出模板 引入maven依賴 構造freemarker模板 創建目標Excel 處理模板數據 構建數據實體 4、導出操作 總結 引入maven依賴 我這里是用的Spring-Boot項目,首先引入依賴 構造freemarker模板 創建目標Excel 首先,我們先手工創建一個我們需要的Excel文件 然后選擇文件...
Thymeleaf模板和Freemarker模板
Thymeleaf模板 關于Thymeleaf的優點,我只說一條:它就是html頁面。 導入pom依賴 pring Boot官方文檔建議在開發時將緩存關閉,那就在application.yml文件中加入下面這行 正式環境還是要將緩存開啟的 User ThymeleaController list.html head2 Freemarke FreeMarker 是一款模板引擎, 即一種基于模板和要改...
springboot模板(Thymeleaf模板,freemarker模板)
文章目錄 Thymeleaf模板 Freemarker模板 Thymeleaf模板 關于Thymeleaf的優點,我只說一條:它就是html頁面。thymeleaf模板和freemarker模板都一套可以替代JSP開發的一套引擎模板,它可以生成靜態頁面,可以讓美工在瀏覽器查看頁面的靜態效果,也可以讓程序員在服務器查看帶數據的動態頁面效果。這是由于它支持 html 原型,然后在 html 標簽里增加...
猜你喜歡
SpringBoot模板之thymeleaf模板,freemarker模板
1、springboot之thymeleaf模板 ①相關pom依賴(如果創建時勾選了,就不需要了) Spring Boot官方文檔建議在開發時將緩存關閉,那就在application.properties文件中加入下面這行 spring.thymeleaf.cache=false(可以避免緩存帶來問題,正式環境還是要將緩存開啟的) ②thymeleaf模板的話直接就是html頁面 要...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...