目錄
在線中文參考手冊:http://freeMarker.foofun.cn/toc.html
在線模板測試網站:https://try.freeMarker.apache.org
一、瞭解FreeMarker
模板引擎,基於模板和要改變的數據,用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼)的通用工具。是一個Java類庫,一款組件。
與JSP區別:FreeMarker是根據模板生成各種文件,而JSP是需要jsp的引擎,來解析成servlet,然後把servlet編譯成字節碼文件來執行。
FreeMarker的特點:
徹底分離表現層和業務邏輯
性能好,提高開發效率
使得開發過程中的人員分工更加明確
學習成本低
支持表達式、宏定義(類似jsp標籤)
二、FreeMarker基本語法
1、數據類型:
標量:基本數據類型。字符串、數字、布爾值、日期/時間
容器:哈希表(類似於HashMap)、序列(類似於List)、集合
子程序:方法和函數、用戶自定義指令
2、算術運算符
數字運算:+-*/%
字符串運算:${name}、${"hello,${name}"}、${"hello,"+name}、<#if isBig>Wow!</#if>、變量下標爲0和4的字符:${name[0]}${name[4]}、下標爲0到4的字符:${name[0..4]}
指令:以<#標識:錯誤:<#if ${isBig}>Wow!</#if> 正確:<#if isBig>Wow!</#if>,isBig變量不需要加表達式,可以直接寫
邏輯運算符:與&&、或||、非!
比較運算符:>(gt) <(lt) >=(gte) <=(lte) ==(或=) != (推薦使用英文符號)
只能比較數字和日期,不能比較字符串,返回爲布爾類型不能直接輸出
由於FreeMarker會將>解釋成FTL標記的結束字符,所以對於>和>=可以使用括號來避免這種情況,比如<#if (x>y)>
空值運算符:
??(判斷是否爲空):FreeMarker中沒有null的定義,需要判斷是否爲空。
檢查對象的屬性是否爲空:<#if object.attribute??></#if>,檢查對象或屬性是否爲空:<#if (object.attribute)??></#if>
!(指定缺少變量的默認值,如果不指定則默認值是空字符串、長度爲0的序列或長度爲0的Map對象)
${aaa!}:如果aaa變量沒定義,不報錯,默認沒有任何輸出
${aaa!'-'}:如果aaa變量沒定義,爲空,就默認設置該表達式輸出的值爲橫槓-,這裏不會爲aaa變量賦值
${(user.name)!"默認值"}:如果user或name爲空,就輸出默認值
${user.name!"默認值"}:如果user爲空會報錯,如果name爲空會輸出默認值
3、模板中的代碼片段
${...}:表達式,稱爲interpolation插值
註釋:<#-- --> 註釋的內容不會輸出
FTL標籤:FreeMarker的指令。這些標籤的名字以#開頭。用戶自定義的標籤則需要使用@來代替#。
4、基本指令
條件判斷指令:
if指令:<#if 條件>輸出</#if>
if-else指令:<#if 條件>輸出<#else>輸出</#if>
if-elseif-else指令:<#if 條件1>輸出<#elseif 條件2>輸出<#else>輸出</#if>
switch、case、break、default指令:參數可以爲數字、字符串。<#switch var><#case 條件1>輸出<#break><#case 條件2>輸出<#break><#default>輸出</#switch>
三、FreeMarker快速入門
靜態網頁、動態網頁
頁面靜態化:適用於高併發、要求響應速度快、大規模且數據變化不太頻繁的頁面場景
使用FreeMarker生成HTML文件
使用FreeMarker生成Java類
還寫什麼curl,通通搞個模板一鍵生成!!!
四、FreeMarker高級指令--list
1、list指令:兩種寫法
<#list users as user>
${user}
<#else>
"list爲空"
</#list>
或
<#list users>
<ul>
<#items as user>
<li>${user}</li>
</#items>
</ul>
<#else>
<p>"list爲空"
</#list>
2、sep指令:可在每一個迭代項中間放一些內容,不會把內容插入到第一項之前或最後一項之後。可結合迭代指令List使用
<#list users as user>
${user}<#sep>, </#sep>
</#list>
通過內建函數實現sep指令效果:
<#list users as user>
${user}<#if user?has_next>, </#if>
</#list>
3、break指令:配合if指令使用,滿足條件時跳出迭代
<#list 1..10 as x>
${x}
<#if x=3><#break></#if>
</#list>
1..10:代表1到10
4、list指令排序
升序:sort、sort_by()
對users升序排序:
<#list users?sort as user>
</#list>
根據年齡對用戶list升序排序:
<#list users?sort_by("age") as user>
</#list>
降序:sort_by()?reverse
<#list users?sort_by("age")?reverse as user>
</#list>
5、list遍歷Map
<#list dataMap?keys as key>
<option value="${key}">${dataMap[key]}</option>
${key}-${dataMap[key]}<#if key?has_next>, </#if>
</#list>
像else、items、break只能在指令體內部使用,而不能移出到宏或被包含的模板中
五、FreeMarker--內建函數
內建函數:由語法規定存在的內建函數。包含在編譯器的運行時庫中,直接調用即可,其實現由編譯器對應的廠商完成。
使用到的內建函數:sort、sort_by、reverse、keys、has_next
特點:都是寫在?後面,實現某個功能(函數)
編譯器提供了針對各種數據類型的內建函數、結點(xml)內建函數、循環變量內建函數、獨立類型內建函數、其他內建函數(很少使用或專家級的)
相關內建函數參考可見:http://freemarker.foofun.cn/ref_builtins.html
六、FreeMarker在web項目中的應用
1、添加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2、指定freemarker文件的後綴爲ftl,默認爲ftlh
spring.freemarker.suffix=.ftl
3、創建一個以.ftl爲後綴的文件 src\main\resources\templates\test.ftl
<html>
<body>
<div class="container">
<table class="table table-dark table-hover">
<thead>
<tr>
<th>name</th>
<th>age</th>
<th>sex</th>
</tr>
</thead>
<tbody>
<#list userlist?sort_by("age") as user>
<tr>
<td>
<#if (user.name)??>
${user.name}
<#else>
姓名不詳
</#if>
</td>
<td>${user.age!"年齡不詳"}</td>
<td>${user.sex!"性別不詳"}</td>
</tr>
</#list>
</tbody>
</table>
</div>
</body>
</html>
4、編寫Controller,跳轉到freemarker文件
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestUser {
private String name;
private String age;
private String sex;
}
@Controller
public class TestController {
@RequestMapping("/test")
public String test(HttpSession session){
TestUser user1 = new TestUser("zhangsan","23","男");
TestUser user2 = new TestUser("lisi","18",null);
TestUser user3 = new TestUser(null,"20","女");
List<TestUser> userlist = new ArrayList();
userlist.add(user1);
userlist.add(user2);
userlist.add(user3);
session.setAttribute("userlist",userlist);
return "test";
}
}
5、效果展示