中觀基礎論,Spring Boot中使用FreeMarker及FreeMarker入門

 2023-11-18 阅读 31 评论 0

摘要:文章目錄一、FreeMarker簡介二、Spring Boot整合FreeMarker1.添加依賴2.相關配置3.FreeMarker文件模板三、簡單使用示例四、FreeMarker常用指令(一)assign指令(二)if指令(三)分支指令(四)list指令(五)

文章目錄

    • 一、FreeMarker簡介
    • 二、Spring Boot整合FreeMarker
      • 1.添加依賴
      • 2.相關配置
      • 3.FreeMarker文件模板
    • 三、簡單使用示例
    • 四、FreeMarker常用指令
      • (一)assign指令
      • (二)if指令
      • (三)分支指令
      • (四)list指令
      • (五)include指令
      • (六)import指令
      • (七)noparse指令

一、FreeMarker簡介

FreeMarker是一款模板引擎,Freemarker 模版后綴為 .ftl(FreeMarker Template Language)。FTL 是一種簡單的、專用的語言,它不是像 PHP那樣成熟的編程語言。在模板中,你可以專注于如何展現數據, 而在模板之外可以專注于要展示什么數據。
在這里插入圖片描述
這種方式通常被稱為 MVC (模型 視圖 控制器) 模式,對于動態網頁來說,是一種特別流行的模式。
特點:

  1. 輕量級模版引擎,不需要Servlet環境就可以很輕松的嵌入到應用程序中
  2. 能生成各種文本,如html,xml,java,等
  3. 入門簡單,它是用java編寫的,很多語法和java相似

二、Spring Boot整合FreeMarker

1.添加依賴

在IDEA中創建Spring Boot項目時,添加FreeMarker和web依賴。
在這里插入圖片描述
在這里插入圖片描述
在已創建好的項目可以直接在pom.xml中添加以下代碼,添加FreeMarker依賴

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>

2.相關配置

我們可以在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/

3.FreeMarker文件模板

因為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>

項目目錄如下:
在這里插入圖片描述
啟動項目,在瀏覽器中訪問:
在這里插入圖片描述

四、FreeMarker常用指令

(一)assign指令

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>

語法:

  • name:變量的名字。 它不是表達式。它可以寫作是字符串,如果變量名包含保留字符這是很有用的, 比如 <#assign “foo-bar” = 1>。 請注意這個字符串沒有展開插值(如"${foo}"); 如果需要賦值一個動態創建的名字,那么不得不使用 這個技巧。
  • =:賦值操作符。 它也可以是一個簡寫的賦值操作符(從 FreeMarker 2.3.23 版本開始): ++,–, +=,-=, *=,/= 或 %=。比如 <#assign x++> 和 <#assign x = x + 1> 是一樣的,并且 <#assign x += 2> 和 <#assign x = x + 2> 是相同的。 請注意, ++ 通常意味著算術加法 (對于非數字將會失敗),不像 + 或 += 可以進行字符連接等重載操作。
  • value: 存儲的值。是表達式。
  • namespacehash:(通過 import) 為命名空間創建的哈希表。是表達式。

例子:

<#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}!">

(二)if指令

這是一個典型的分支控制指令,該指令的作用類似Java語言中的if,if指令的語法格式如下:

<#if condition>...
<#elseif condition2>...
<#elseif condition3>...
...
<#else>...
</#if>

語法:

  • condition 必須計算成布爾值, 否則錯誤將會中止模板處理
  • elseif 和 else 必須出現在 if 內部 (也就是,在 if 的開始標簽和結束標簽之間)。
  • if 中可以包含任意數量的 elseif(包括0個) 而且結束時 else 是可選的

注意:如果編寫 <#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>

語法:

  • value, refValue1,等: 表達式將會計算成相同類型的標量。
  • break 和 default 是可選的。

例子:

<#assign gender=1>
<#switch gender><#case 0>女性<#break><#case 1>男性<#break><#default>未知
</#switch>

(四)list指令

list指令是一個迭代輸出指令,用于迭代輸出數據模型中的集合,list指令的語法格式如下:

<#list sequence as item>Part repeated for each item
<#else>Part executed when there are 0 items
</#list>

語法:

  • sequence:可以是一個集合對象或表達式(返回一個集合對象的表達式)
  • item:循環變量的名稱
  • 此外,迭代集合對象時還包含兩個特殊的循環變量:(出于向后兼容考慮,它們仍然能使用)
    item_index(已廢棄,由item?index代替):當前變量的索引值,從0開始的數字
    item_has_next(已廢棄,由item?has_next代替):辨別當前項是否是序列的最后一項的布爾值。
  • 可以使用<#break>指令跳出迭代

例子:

<#list ["星期一","星期二","星期三","星期四","星期五","星期六"] as x>
${x_index+1}.${x}<#if x_has_next>,</#if>
<#if x_index=4><#break></#if>
</#list>

(五)include指令

include指令的作用類似于JSP的包含指令,用于包含指定頁。其語法格式如下:

<#include path><#include path options>

語法:

  • path: 要包含文件的路徑;一個算作是字符串的表達式。(用其他話說, 它不用是一個固定的字符串,它也可以是像 profile.baseDir + "/menu.ftl"這樣的東西。)
  • options: 一個或多個這樣的選項: encoding=encoding, parse=parse

支持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 >

瀏覽器中訪問:
在這里插入圖片描述

(六)import指令

該指令用于導入FreeMarker模板中的所有變量,并將該變量放置到指定的Map對象中,import指令的語法格式如下:

<#import path as hash>

語法

  • path:模板的路徑。 這是一個算作是字符串的表達式。比如,profile.baseDir + “/menu.ftl”。
  • hash: 訪問命名空間的哈希表變量不帶引號的名字。不是表達式。

例如,使用了<#import /lib/menu.ftl as data>, /lib/menu.ftl模板文件中的所有變量將放置到一個名為data的Map對象中。

(七)noparse指令

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/179179.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息