目錄
一、了解FreeMarker
二、FreeMarker基本文法
三、FreeMarker快速入門
四、FreeMarker進階指令--list
五、FreeMarker--内建函數
六、FreeMarker在web項目中的應用
線上中文參考手冊: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、效果展示
