FreeMarker是一款模板引擎,Freemarker 模版后綴為 .ftl(FreeMarker Template Language)。FTL 是一種簡單的、專用的語言,它不是像 PHP那樣成熟的編程語言。在模板中,你可以專注于如何展現數據, 而在模板之外可以專注于要展示什么數據。
這種方式通常被稱為 MVC (模型 視圖 控制器) 模式,對于動態網頁來說,是一種特別流行的模式。
特點:
在IDEA中創建Spring Boot項目時,添加FreeMarker和web依賴。
在已創建好的項目可以直接在pom.xml中添加以下代碼,添加FreeMarker依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>
我們可以在application.properties中進行配置,沒有設置的屬性則按默認的使用,常見的配置如下:
#設置HttpServletRequest的屬性是否覆蓋controller中的mode的同名項
spring.freemarker.allow-request-override=false
#設置HttpSession的屬性是否覆蓋controller中的mode的同名項
spring.freemarker.allow-session-override=false
#是否開啟緩存
spring.freemarker.cache=false
#設置模板文件編碼
spring.freemarker.charset=UTF-8
#設置模板的位置
spring.freemarker.check-template-location=true
#設置模板文件的內容格式
spring.freemarker.content-type=text/html
#是否將HttpServletRequest中的屬性添加到Model中
spring.freemarker.expose-request-attributes=false
#是否將HttpServletRequest中的屬性添加到Model中
spring.freemarker.expose-session-attributes=false
#設置模板文件后綴
spring.freemarker.suffix=.ftl
#設置模板文件位置
spring.freemarker.template-loader-path=classpath:/templates/
因為IDEA沒有提供FreeMarker文件模板,所以我們可以創建一個以方便后續使用。
項目中任意地方右擊:New->File->Edit File Templates,進入如下頁面:
然后更改文件名和文件類型
點擊OK就完成了ftl的文件模板的創建。創建FTL File如下:
這樣就完成了在Spring Boot項目中整合FreeMarker。
在上面創建好的Spring Boot項目中創建一個User類
@Component
public class User {private long id;private String username;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}
創建一個UserController類:
@Controller
public class UserController {@GetMapping("/show")public String show(Model model){List<User> users=new ArrayList<User>();for (int i = 0; i < 10; i++) {User user=new User();user.setId(i);user.setUsername("用戶"+i);users.add(user);}model.addAttribute("users",users);return "show";}
}
在templates中創建一個show.ftl:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<table border="1"><tr><td>用戶編號</td><td>用戶名稱</td></tr><#list users as user><tr><td>${user.id}</td><td>${user.username}</td></tr></#list>
</table>
</body>
</html>
項目目錄如下:
啟動項目,在瀏覽器中訪問:
assign指令用于為該模板頁面創建變量或替換一個頂層變量,其語法格式下:
<#assign name1=value1 name2=value2 ... nameN=valueN>
或
<#assign same as above... in namespacehash>
或
<#assign name>capture this
</#assign>
或
<#assign name in namespacehash>capture this
</#assign>
語法:
例子:
<#assign week=["星期一","星期二","星期三","星期四","星期五"]>
<#list week as day>
${day}
</#list>
在命名空間 /mylib.ftl 中創建/替換了變量 bgColor:
<#import "/mylib.ftl" as my>
<#assign bgColor="red" in my>
注意我們不能使用assign指令在字符串中插入變量:
<#assign x>Hello ${user}!</#assign> <#-- BAD PRACTICE! -->
應該這么寫:
<#assign x="Hello ${user}!">
這是一個典型的分支控制指令,該指令的作用類似Java語言中的if,if指令的語法格式如下:
<#if condition>...
<#elseif condition2>...
<#elseif condition3>...
...
<#else>...
</#if>
語法:
注意:如果編寫 <#if x > 0> 和 <#if x >= 0> 是錯誤的, 因為第一個 > 會結束 #if 標簽。所以比較要寫在括號內,如<#if (x > 0))> 和 <#if (x >= 0)>
例子:
<#assign age=23>
<#if (age>60)>老年人
<#elseif (age>30)>中年人
<#elseif (age>20)>青少年
<#else>老年人
</#if>
分支指令包括:switch、case、default、break。作用類似java語法,分支指令的語法結構下:
<#switch value><#case refValue1>...<#break><#case refValue2>...<#break>...<#case refValueN>...<#break><#default>...
</#switch>
語法:
例子:
<#assign gender=1>
<#switch gender><#case 0>女性<#break><#case 1>男性<#break><#default>未知
</#switch>
list指令是一個迭代輸出指令,用于迭代輸出數據模型中的集合,list指令的語法格式如下:
<#list sequence as item>Part repeated for each item
<#else>Part executed when there are 0 items
</#list>
語法:
例子:
<#list ["星期一","星期二","星期三","星期四","星期五","星期六"] as x>
${x_index+1}.${x}<#if x_has_next>,</#if>
<#if x_index=4><#break></#if>
</#list>
include指令的作用類似于JSP的包含指令,用于包含指定頁。其語法格式如下:
<#include path>
或
<#include path options>
語法:
支持options選項有:
parse:如果它為 true, 那么被包含的文件將會當作FTL來解析,否則整個文件將被視為簡單文本 (也就是說不會在其中查找 FreeMarker 的結構)。如果你忽略了這個選項, 那么它默認是 true。
encoding:被包含文件從包含它的文件繼承的編碼方式 (實際就是字符集),除非你用這個選項來指定編碼方式。 合法的名字有:ISO-8859-2,UTF-8,Shift_JIS,Big5,EUC-KR,GB2312。 編碼名稱要和java.io.InputStreamReader 中支持的那些一致。
ignore_missing:當為 true,模板引用為空時壓制錯誤,而 <#include …> 不會輸出任何東西。當為 false 時,如果模板不存在, 那么模板處理就會發生錯誤并停止。如果忽略這個選項,那么它的默認值是 false。
注意:通常使用 /(斜杠)來分隔路徑成分, 而不是 (反斜杠)。如果你從你本地的文件系統加載模板, 而它使用反斜杠(像Windows操作系統),也要使用 /
例子:
在template目錄下創建一個header.ftl,內容為:
<h1>我是頭部欄!</h1>
然后在show.ftl的body標簽中使用此指令引入:
<#include "*/header.ftl" encoding="UTF-8" ignore_missing=true >
瀏覽器中訪問:
該指令用于導入FreeMarker模板中的所有變量,并將該變量放置到指定的Map對象中,import指令的語法格式如下:
<#import path as hash>
語法
例如,使用了<#import /lib/menu.ftl as data>, /lib/menu.ftl模板文件中的所有變量將放置到一個名為data的Map對象中。
noparse指令指定FreeMarker不會在這個指令體中間尋找FTL標簽,插值和其他特殊的字符序列,除了noparse的結束標記。語法格式如下:
<#noparse>...
</#noparse>
例子:
<#noparse><#將動物列為動物><tr> <td> $ {animal.name} <td> $ {animal.price}歐元</#list>
</#noparse>
輸出:
<#將動物列為動物><tr> <td> $ {animal.name} <td> $ {animal.price}歐元</#list>
如果要進一步地學習FreeMarker,可以看:
FreeMarker在線手冊
https://segmentfault.com/a/1190000008770449
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态