目錄
Freemarker
1.1.什么是Freemarker
1.2.Freemarker模板組成部分
1.3.優(yōu)點
FreeMarker常見的方法:
2.2.2.數(shù)值
2.2.3.布爾值
2.2.4.日期
2.3.常見指令
2.3.1.處理不存在的值
assign
2.3.4.list
2.3.5.include
SpringBoot整合Freemarker
Freemarker
1.1.什么是Freemarker
FreeMarker 是一款 模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁,電子郵件,配置文件,源代碼等)的通用工具。 它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發(fā)產(chǎn)品的組件。
模板編寫為FreeMarker Template Language (FTL)。它是簡單的,專用的語言, 不是 像PHP那樣成熟的編程語言。 那就意味著要準備數(shù)據(jù)在真實編程語言中來顯示,比如數(shù)據(jù)庫查詢和業(yè)務(wù)運算, 之后模板顯示已經(jīng)準備好的數(shù)據(jù)。在模板中,你可以專注于如何展現(xiàn)數(shù)據(jù), 而在模板之外可以專注于要展示什么數(shù)據(jù)。
這種方式通常被稱為MVC (模型 視圖 控制器) 模式,對于動態(tài)網(wǎng)頁來說,是一種特別流行的模式。 它幫助從開發(fā)人員(Java 程序員)中分離出網(wǎng)頁設(shè)計師(HTML設(shè)計師)。設(shè)計師無需面對模板中的復雜邏輯, 在沒有程序員來修改或重新編譯代碼時,也可以修改頁面的樣式。
而FreeMarker最初的設(shè)計,是被用來在MVC模式的Web開發(fā)框架中生成HTML頁面的,它沒有被綁定到 Servlet或HTML或任意Web相關(guān)的東西上。它也可以用于非Web應(yīng)用環(huán)境中。
FreeMarker 是免費的, 基于Apache許可證2.0版本發(fā)布。
1.2.Freemarker模板組成部分
FreeMarker模板文件主要由如下4個部分組成:
文本:直接輸出的部分
注釋:使用<#-- ... -->格式做注釋,里面內(nèi)容不會輸出
插值:即${...}或#{...}格式的部分,類似于占位符,將使用數(shù)據(jù)模型中的部分替代輸出
FTL指令:即FreeMarker指令,全稱是:FreeMarker Template Language,和HTML標記類似,但名字前加#予以區(qū)分,不會輸出
FreeMarker與Web容器無關(guān)
FreeMarker與Web容器無關(guān),即在Web運行時,它并不知道Servlet或HTTP,故此FreeMarker不僅可以用作表現(xiàn)層的實現(xiàn)技術(shù),而且還可以用于生成XML,JSP或Java等各種文本文件。
在Java Web領(lǐng)域,F(xiàn)reeMarker是應(yīng)用廣泛的模板引擎,主要用于MVC中的view層,生成html展示數(shù)據(jù)給客戶端,可以完全替代JSP。
總之,F(xiàn)reeMarker是一個模板引擎,一個基于模板生成文本輸出的通用工具,使用純Java編寫,模板中沒有業(yè)務(wù)邏輯,外部Java程序通過數(shù)據(jù)庫操作等生成數(shù)據(jù)傳入模板(template)中,然后輸出頁面。它能夠生成各種文本:HTML、XML、RTF、Java源代碼等等,而且不需要Servlet環(huán)境,并且可以從任何源載入模板,如本地文件、數(shù)據(jù)庫等等。
1.3.優(yōu)點
FreeMarker的誕生是為了取代JSP。雖然JSP功能強大,可以寫Java代碼實現(xiàn)復雜的邏輯處理,但是頁面會有大量業(yè)務(wù)邏輯,不利于維護和閱讀,更不利于前后臺分工,容易破壞MVC結(jié)構(gòu),所以舍棄JSP,選擇使用FreeMarker是大勢所趨。當前很多企業(yè)使用FreeMarker取代JSP,F(xiàn)reeMarker有眾多的優(yōu)點,如下所示:
很好地分離表現(xiàn)層和業(yè)務(wù)邏輯
JSP功能很強大,它可以在前臺編寫業(yè)務(wù)邏輯代碼,但這也帶來了一個很大的弊端——頁面內(nèi)容雜亂,可讀性差,這將會大大增加后期的維護難度。而FreeMarker職責明確,功能專注,僅僅負責頁面的展示,從而去掉了繁瑣的邏輯代碼。FreeMarker的原理就是:模板+數(shù)據(jù)模型=輸出,模板只負責數(shù)據(jù)在頁面中的表現(xiàn),不涉及任何的邏輯代碼,而所有的邏輯都是由數(shù)據(jù)模型來處理的。用戶最終看到的輸出是模板和數(shù)據(jù)模型合并后創(chuàng)建的。
提高開發(fā)效率
眾所周知,JSP在第一次執(zhí)行的時候需要轉(zhuǎn)換成Servlet類,之后的每次修改都要編譯和轉(zhuǎn)換。這樣就造成了每次修改都需要等待編譯的時間,效率低下。而FreeMarker模板技術(shù)并不存在編譯和轉(zhuǎn)換的問題,所以就不會存在上述問題。相比而言,使用FreeMarker可以提高一定的開發(fā)效率。
明確分工
JSP頁面前后端的代碼寫到了一起,耦合度很高,前端開發(fā)需要熟悉后臺環(huán)境,需要去調(diào)試,而后臺開發(fā)人員需要去做不熟悉的前端界面設(shè)計。對兩者而言,交替性的工作需要花費一定的學習成本,效率低下。而使用FreeMarker后,前后端完全分離,大家各干各的,互不影響。
簡單易用,功能強大
FreeMarker支持JSP標簽,宏定義比JSP Tag方便,同時內(nèi)置了大量常用功能,比如html過濾,日期金額格式化等等。FreeMarker代碼十分簡潔,上手快,使用非常方便。
FreeMarker常見的方法:
字符串類型處理:
方法 | 含義 |
---|---|
?substring(start,end) | 截取字符串(左閉右開) |
?uncap_first | 首字母小寫輸出 |
?cap_first | 首字母大寫輸出 |
?lower_case | 字母轉(zhuǎn)小寫輸出 |
?upper_case | 字母轉(zhuǎn)大寫輸出 |
?length | 獲取字符串長度 |
?starts_with("xx")?string | 是否以指定字符開頭(boolean類型) |
?ends_with("xx")?string | 是否以指定字符結(jié)尾(boolean類型) |
?index_of("xx") | 獲取指定字符的索引 |
?trim | 去除字符串前后空格 |
?replace("xx","xx") | 替換指定字符串 |
字符串空值情況處理:
FreeMarker 的變量必須賦值,否則就會拋出異常。而對于 FreeMarker 來說,null 值和不存在的變量是完全一樣的,因為 FreeMarker 無法理解 null 值。
<#-- 如果值不存在,直接輸出會報錯 --> <#--${str}--> <#-- 使用!,當值不存在時,默認顯示空字符串 --> ${str!}<br> <#-- 使用!"xx",當值不存在時,默認顯示指定字符串 --> ${str!"這是一個默認值"}<br> <#-- 使用??,判斷字符串是否為空;返回布爾類型。如果想要輸出,需要將布爾類型轉(zhuǎn)換成字符串 --> ${(str??)?string}<br>
2.2.2.數(shù)值
輸入不帶引號的數(shù)字就可以直接指定一個數(shù)字, 必須使用點作為小數(shù)的分隔符而不能是其他的分組分隔符。
${0.45}<br> ${18}<br> <#-- 將數(shù)值轉(zhuǎn)換成字符串輸出 --> ${1000?c} <br> <#-- 將數(shù)值轉(zhuǎn)換成貨幣類型的字符串輸出 --> ${1000?string.currency} <br> <#-- 將數(shù)值轉(zhuǎn)換成百分比類型的字符串輸出 --> ${0.45?string.percent} <br> <#-- 將浮點型數(shù)值保留指定小數(shù)位輸出 (##表示保留兩位小數(shù)) --> ${0.45723123?string["0.##"]} <br>
2.2.3.布爾值
直接寫 true
或者 false
就表示一個布爾值了,不需使用引號。
在freemarker中布爾類型不能直接輸出;如果輸出要先轉(zhuǎn)成字符串
${flag?c}<br> ${flag?string}<br> ${flag?string("yes","no")}<br>
2.2.4.日期
日期變量可以存儲和日期/時間相關(guān)的數(shù)據(jù)。
在freemarker中日期類型不能直接輸出;如果輸出要先轉(zhuǎn)成日期型或字符串
日期格式輸出:
輸出方式 | 說明 |
---|---|
?date | 年月日 |
?time | 時分秒 |
?datetime | 年月日時分秒 |
?string("自定義格式") | 指定格式 |
<#-- 輸出日期格式 --> ${createDate?date} <br> <#-- 輸出時間格式 --> ${createDate?time} <br> <#-- 輸出日期時間格式 --> ${createDate?datetime} <br> <#-- 輸出格式化日期格式 --> ${createDate?string("yyyy年MM月dd日 HH時mm分ss秒")} <br>
2.3.常見指令
2.3.1.處理不存在的值
當試圖訪問一個不存在的變量時, FreeMarker 將會報錯而導致模板執(zhí)行中斷。 通常我們可以使用兩個特殊操作符來壓制這個錯誤,控制這種錯誤情況。被控制的變量可以是頂層變量,哈希表或序列的子變量。 此外這些操作符還能處理方法調(diào)用的返回值不存在的情況。
-
默認值操作符
使用形式: unsafe_expr!default_expr
或 unsafe_expr!
or (unsafe_expr)!default_expr
或 (unsafe_expr)!
這個操作符允許你為可能不存在的變量指定一個默認值。
${message!"default Value."} <#assign message="Zking"> ${message!"default Value."}
輸出結(jié)果如下:
default Value. Zking
如果默認值被省略了,那么結(jié)果將會是空串,空序列或空哈希表。(這是 FreeMarker 允許多類型值的體現(xiàn))請注意,如果想讓默認值為 0
或 false
,則不能省略它。
(${message!}) <#assign message = "Zking"> (${message!})
-
不存在值檢測操作符
使用形式: unsafe_expr??
或 (unsafe_expr)??
這個操作符告訴我們一個值是否存在?;谶@種情況, 結(jié)果是
true
或false
。
<#if name??> 存在 <#else> 不存在 </#if>
assign
使用該指令你可以創(chuàng)建一個新的變量, 或者替換一個已經(jīng)存在的變量。語法格式如下:
<#assign name1=value1 name2=value2 ... nameN=valueN> 或 <#assign name> capture this </#assign>案例演示:
<#-- 創(chuàng)建一個str的變量 --> <#assign str="hello"> <#-- 輸出str --> ${str} <br> <#-- 一次創(chuàng)建多個變量 --> <#assign num=1 names=["zhangsan","lisi","wangwu"] > ${num} -- ${names?join(",")}
如本次 使用的ctx:
獲取到了yml中的
2.3.4.list
list
指令執(zhí)行在 list
開始標簽和 list
結(jié)束標簽 ( list
中間的部分) 之間的代碼, 對于在序列(或集合)中每個值指定為它的第一個參數(shù)。 對于每次迭代,循環(huán)變量將會存儲當前項的值。
循環(huán)變量僅僅存在于 list
標簽體內(nèi)。 而且從循環(huán)中調(diào)用的宏/函數(shù)不會看到它(就像它只是局部變量一樣)。
<#list sequence as item> ? Part repeated for each item <#else> ? Part executed when there are 0 items </#list>
在
list
中的else
僅從 FreeMarker 2.3.23 版本開始支持。
注意:
-
else
部分是可選的, 而且僅僅從 FreeMarker 2.3.23 版本開始支持。 -
sequence
: 將我們想要迭代的項,算作是序列或集合的表達式 -
item
: 循環(huán)變量的名稱 (不是表達式)
<#list arrs as item> ? ${item} <#else> ? 集合是空的 </#list>
2.3.5.include
可以使用它在你的模板中插入另外一個 FreeMarker 模板文件 (由 path
參數(shù)指定)
<#include path> 或 <#include path options>
這里:
-
path
: 要包含文件的路徑; -
options
: 一個或多個這樣的選項:encoding=encoding
,parse=parse
-
encoding
: 算作是字符串的表達式 -
parse
: 算作是布爾值的表達式(為了向下兼容,也接受一部分字符串值) -
ignore_missing
: 算作是布爾值的表達式
-
<h1>Hello Freemarker</h1> <#include "/common/head.ftl">
SpringBoot整合Freemarker
?2.1.配置
配置pom.xml,引入依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
application.ym添加:
freemarker:
# 設(shè)置模板后綴名
suffix: .ftl
# 設(shè)置文檔類型
content-type: text/html
# 設(shè)置頁面編碼格式
charset: UTF-8
# 設(shè)置頁面緩存
cache: false
# 設(shè)置ftl文件路徑
template-loader-path: classpath:/templates
# 設(shè)置靜態(tài)文件路徑,js,css等
mvc:
static-path-pattern: /static/**
配置Springboot自帶的頁面:
建立一個templates專門存放ftl文件
index.ftl
<!doctype html> <html lang="zh"> <head> <title>Document</title> <style> td { padding: 20px; text-align: center; } tr{ margin-bottom: 30px; } </style> <#include "common.ftl"> </head> <body> <#if books??> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal"> 新增 </button> <table class="table table-striped"> <#list books as book> <tr> <td>${book.id}</td> <td>${book.bookname}</td> <td>${book.price}</td> <td>${book.booktype}</td> <td> <a href="${ctx}/del?id=${book.id}" class="btn btn-danger">刪除</a> </td> <td> <a href="${ctx}/edt?id=${book.id}" class="btn btn-outline-success">修改</a> </td> </tr> </#list> </table> <!-- 新增 --> <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">新增</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> ... </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary">Save changes</button> </div> </div> </div> </div> </#if> </body> </html>
common.ftl
<#assign ctx="${springMacroRequestContext.contextPath}">
<link rel="stylesheet" href="${ctx}/bootstrap-3.4.1-dist/css/bootstrap.css">
<script src="${ctx}/jquery-3.6.1.js"></script>
<script src="${ctx}/bootstrap-3.4.1-dist/js/bootstrap.js"></script>
這個文件定義了公共的資源
ctx代表/static/文章來源:http://www.zghlxwxcb.cn/news/detail-770620.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-770620.html
到了這里,關(guān)于Spring Boot--Freemarker渲染技術(shù)+實際案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!