1. 程式人生 > >Spring Boot 模板引擎FreeMarker整合

Spring Boot 模板引擎FreeMarker整合

Spring Boot 模板引擎FreeMarker整合

一、FreeMaker介紹

FreeMarker是一款免費的Java模板引擎,是一種基於模板和資料生成文字(HMLT、電子郵件、配置檔案、原始碼等)的工具,它不是面向終端使用者的,而是一款程式設計師使用的元件。
FreeMarker最初設計是用來在MVC模式的Web開發中生成HTML頁面的,所以沒有繫結Servlet或任意Web相關的東西上,所以它可以執行在非Web應用環境中。
發展史
FreeMarker第一版在1999年未就釋出了,2002年初使用JavaCC(Java Compiler Compiler是一個用Java開發的語法分析生成器)重寫了FreeMarker的核心程式碼,2015年FreeMarker程式碼遷移到了Apache下。
GitHub地址:

github.com/apache/free…
工作原理
FreeMarker模板儲存在伺服器上,當有使用者訪問的時候,FreeMarker會查詢出相應的資料,替換模板中的標籤,生成最終的HTML返回給使用者,如下圖:

在這裡插入圖片描述

二、FreeMarker基礎使用

基礎使用分為3部分,這3部分組成了FreeMarker:

  • 指令
  • 表示式

指令是FreeMarker用來識別轉換的特殊標籤,表示式是標籤裡具體的語法實現,其他部分是一些不好分類的模板。

2.1 指令

使用FTL(freemarker template language)標籤來呼叫指令。
指令速覽:

  • assign
  • attempt, recover
  • compress
  • escape, noescape
  • flush
  • ftl
  • function, return
  • global
  • if, else, elseif
  • import
  • include
  • list, else, items, sep, break
  • local
  • macro, nested, return
  • noparse
  • nt
  • setting
  • stop
  • switch, case, default, break
  • t, lt, rt
  • visit, recurse, fallback
  • 使用者自定義標籤

下來我們分別來看每個指令對應具體使用。

2.1.1 assign 程式碼宣告

assign 分為變數和程式碼片段宣告兩種。

2.1.1.1 變數宣告

可以是單變數宣告,或多變數宣告,下面是多變數宣告的示例:

<#assign name="adam" age=18 "sex"="man">
${name} - ${age} - ${"sex"}

效果如下:
在這裡插入圖片描述
單個變數的話,只寫一個就可以了。

2.1.1.2 程式碼片段宣告

<#assign code>
    <#list ["java","golang"] as c>
        ${c}
    </#list>
</#assign>
${code}

其中 ${code} 是用來執行方法的,如果不呼叫話,程式碼片段不會執行。
效果如下:

2.1.2 attempt, recover 異常指令

attempt(嘗試), recover(恢復)指令類似於程式的try catch,示例如下:

<#attempt>
   i am ${name}
   <#recover>
   error name
</#attempt>

如果有變數“name”就會正常顯示,顯示“i am xxx”,如果沒有變數就會顯示“error name”。

效果如下:
在這裡插入圖片描述

2.1.3 compress 壓縮程式碼移除空白行

<#compress>
  1 2  3   4    5

    
  test only

  I said, test only</#compress>

1 2  3   4    5


test only

I said, test only

效果如下:
在這裡插入圖片描述
對空白不敏感的格式,移除空白行還是挺有用的功能。

2.1.4 escape, noescape 轉義,不轉義

2.1.4.1 escape使用

<#escape x as x?html>
	${firstName}
	${lastName}
</#escape>

上面的程式碼,類似於:

${firstName?html}
${lastName?html}

Java程式碼:

@RequestMapping("/freemarker")
public ModelAndView freemarker(ModelAndView modelAndView) {
    modelAndView.addObject("firstName", "<span style='color:red'>firstName</span>");
    modelAndView.addObject("lastName", "lastName");
    modelAndView.setViewName("freemarker");
    return modelAndView;
}

2.1.4.2 “?html”語法解析

單問號後面跟的是操作函式,類似於Java中的方法名,html屬於內建函式的一個,表示字串會按照HTML標記輸出,字元替換規則如下:

  • < 替換為 &lt;
  • > 替換為 &gt;
  • & 替換為 &amp;
  • " 替換為 &quot;

2.1.4.3 noescape使用

HTML程式碼:

<#escape x as x?html>
    <#noescape>
        ${firstName}
    </#noescape>
${lastName}
</#escape>

Java程式碼:

@RequestMapping("/freemarker")
public ModelAndView freemarker(ModelAndView modelAndView) {
    modelAndView.addObject("firstName", "<span style='color:red'>firstName</span>");
    modelAndView.addObject("lastName", "lastName");
    modelAndView.setViewName("freemarker");
    return modelAndView;
}

最終效果:
在這裡插入圖片描述

2.1.5 function, return 方法宣告

程式碼格式:

<#function name param1 param2 ... paramN>
  ...
  <#return returnValue>
  ...
</#function>
  • name 為方法名稱
  • param1, param2,paramN 方法傳遞過來的引數,可以有無限個引數,或者沒有任何引數
  • return 方法返回的值,可以出現在function的任何位置和出現任意次數

示例程式碼如下:

<#function sum x y z>
<#return x+y+z>
</#function>

${sum(5,5,5)}

注意:function如果沒有return是沒有意義的,相當於返回null,而function之中資訊是不會列印到頁面的,示例如下:

<#function wantToPrint>

這裡的資訊是顯示不了的

</#function>
<#if wantToPrint()??>
Message:${wantToPrint()}
</#if>

“??”用於判斷值是否是null,如果為null是不執行的。如果不判null直接使用${}列印,會報模板錯誤(你可以自己試一下),
最終效果如下:
在這裡插入圖片描述

2.1.6 global 全域性程式碼宣告

語法如下:

<#global name=value>

<#global name1=value1 name2=value2 ... nameN=valueN>

<#global name>
  capture this
</#global>

global使用和assign用法類似,只不過global宣告是全域性的,所有的名稱空間都是可見的。
效果如下

2.1.7 if elseif else 條件判斷

語法如下:

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

示例如下:

<#assign x=1 >
<#if x==1>
	x is 1
<#elseif x==2>
	x is 2
<#else>
	x is not 1 or 2
</#if>

2.1.8 import 引入模板

語法:

<#import path as hash>

示例如下
freemarkerFooter.ftl 關鍵程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
this is footer.ftl<#assign copy="馮雪超的部落格">
</body>
</html>

freemarker.ftl 關鍵程式碼如下:

<#import "freemarkerFooter.ftl" as footer>
${footer.copy}

最終輸出內容:
在這裡插入圖片描述

2.1.9 include 嵌入模板

語法:

<#include path>

示例如下
freemarkerFooterooter.ftl 程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
this is footer.ftl<#assign copy="馮雪超的部落格">
</body>
</html>

freemarker.ftl 關鍵程式碼如下:

<#include "freemarkerFooter.ftl">

最終內容如下:

2.1.10 list, else, items, sep, break 迴圈

2.1.10.1 正常迴圈

輸出1-3的數字,如果等於2跳出迴圈,程式碼如下:

<#list 1..3 as n>
    ${n}
    <#if n==2>
        <#break>
</#if>
</#list>

注意:“1…3”等於[1,2,3]。
結果: 1 2

2.1.10.2 使用items輸出

示例如下:

<#list 1..3>
<ul>
<#items as n>
    <li>${n}</li>
</#items>
</ul>
</#list>

2.1.10.3 sep 使用

跳過最後一項

<#list 1..3 as n>
    ${n}
<#sep>,</#sep>
</#list>

最終結果:1 , 2 , 3

2.1.10.4 陣列最後一項

程式碼如下:

<#list 1..3 as n>
    ${n}
    <#if !n_has_next>
    最後一項
</#if>
</#list>

使用“變數_has_next”判斷是否還有下一個選項,來找到最後一項,最終的結果:
1 2 3 最後一項

2.1.11 macro 巨集

巨集:是一個變數名的程式碼片段,例如:

<#macro sayhi name>
Hello, ${name}
</#macro>
<@sayhi "Adam" />

相當於聲明瞭一個名稱為“sayhi”有一個引數“name”的巨集,使用自定義標籤“@”呼叫巨集。
輸出的結果: Hello, Adam

2.1.12 switch, case, defalut, break 多條件判斷

示例程式碼如下:

<#assign animal="dog" >
<#switch animal>
    <#case "pig">
        This is pig
        <#break>
    <#case "dog">
        This is dog
        <#break>
    <#default>
            This is Aaimal
</#switch>

2.1.13 擴充套件知識

指令自動忽略空格特性
FreeMarker會忽略FTL標籤中的空白標記,所以可以直接寫:

<#list ["老王","老李","老張"]
    as
            p>
    ${p}
</#list>

即使是這個格式也是沒有任何問題的,FreeMarker會正常解析。但不推薦

2.2 表示式

2.2.1 字串拼接

字元拼接程式碼:

<#assign name="ABCDEFG">
${"Hello, ${name}"}

結果:Hello, ABCDEFG

2.2.2 算術運算

2.2.2.1 算術符

算術符有五種:

  • +
  • -
  • *
  • /
  • %

示例程式碼:

${100 - 10 * 20}

輸出:
-100

2.2.2.2 數值轉換

${1.999?int}

輸出:
1
注意:數值轉換不會進行四捨五入,會捨棄小數點之後的。

2.2.3 內建函式(重點)

內建函式:相當於我們Java類裡面的內建方法,非常常用,常用的內建函式有:時間內建函式、字元內建函式、數字內建函式等。

2.2.3.1 單個問號和兩個問號的使用和區別

單問號:在FreeMarker中用單個問號,來呼叫內建函式,比如: ${“admin”?length} 檢視字串“admin”的字元長度,其中length就是字串的內建函式。
雙引號:表示用於判斷值是否為null,比如:

<#if admin??>Admin is not null</#if>

2.2.3.2 字串內建函式

2.2.3.2.1 是否包含判斷

使用contains判斷,程式碼示例:

<#if "admin"?contains("min")>
   Min
<#else >
not min
</#if>

輸出:
min

2.2.3.2.2 大小寫轉換

示例程式碼:

<#assign name="Adam">
${name?uncap_first} 
${name?upper_case}
${name?cap_first}
${name?lower_case}

輸出:
adam ADAM Adam adam
更多的字串內建函式:http://freemarker.foofun.cn/ref_builtins.html

2.2.3.3 數字內建函式

示例程式碼:

${1.23569?string.percent}${1.23569?string["0.##"]}${1.23569?string["0.###"]}

輸出:
124% 1.24 1.236
注意:

  • 使用string.percent計算百分比,會自動四捨五入。
  • 使用“?string[“0.##”]”可以自定義取小數點後幾位,會自動四捨五入。

2.2.3.4 時間內建函式

2.2.3.4.1 時間戳轉換為任何時間格式

程式碼:

<#assign timestamp=1534414202000>
${timestamp?number_to_datetime?string["yyyy/MM/dd HH:mm"]}

輸出:
2018/08/16 18:10 複製程式碼
2.2.3.4.2 時間格式化
示例程式碼:

<#assign nowTime = .now>${nowTime} <br />${nowTime?string["yyyy/MM/dd HH:mm"]} <br />

輸出:
2018-8-16 18:33:50
2018/08/16 18:33

三、Spring Boot 整合

3.2 整合步驟

3.2.1 pom.xml 新增FreeMaker依賴

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

3.2.2 application.properties 配置模板

主要配置,如下:

#Freemarker 配置
spring.freemarker.template-loader-path=classpath:/templates/

只需在開發時配置,其它屬性預設就行,不推薦自定義

spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.request-context-attribute=request
spring.freemarker.suffix=.ftl
配置項 型別 預設值 建議值 說明
spring.freemarker.template-loader-path String classpath:/templates/ 預設 模版存放路徑
spring.freemarker.cache bool true 預設 是否開啟快取,生成環境建議開啟
spring.freemarker.charset String - UTF-8 編碼
spring.freemarker.content-type String text/html text/html content-type型別
spring.freemarker.suffix String .ftl .ftl 模板字尾
spring.freemarker.expose-request-attributes bool false false 設定所有request的屬性在merge到模板的時候,是否要都新增到model中
spring.freemarker.expose-session-attributes bool false false 設定所有HttpSession的屬性在merge到模板的時候,是否要都新增到model中.
spring.freemarker.request-context-attribute String - request RequestContext屬性的名稱

3.2.3 編寫HTML程式碼

freemarker.ftl

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>馮雪超的部落格</title>
</head>
<body>


<div>
    <#assign name="adam" age=18 "sex"="man">
${name} - ${age} - ${"sex"}
</div>

<div>
    <#assign code>
        <#list ["java","golang"] as c>
            ${c}
        </#list>
    </#assign>
${code}
</div>

<div>
    <#attempt>
        i am ${name}
    <#recover>
    error name
    </#attempt>
</div>

<div>
    <#compress>
  1 2  3   4    5


  test only

  I said, test only</#compress>

    1 2  3   4    5


    test only

    I said, test only
</div>

<div>
    <div>
    <#escape x as x?html>
        <#noescape>
            ${firstName}
        </#noescape>
        ${lastName}
    </#escape>
    </div>

    <div>
    ${firstName?html}
    ${lastName?html}
    </div>
</div>

<div>
    <#function sum x y z>
        <#return x+y+z>
    </#function>

${sum(5,5,5)}

    <#function wantToPrint>
這裡的資訊是顯示不了的
    </#function>
<#if wantToPrint()??>
Message:${wantToPrint()}
</#if>
</div>

<div>
<#global name1="fxc1" name2="fxc2">
    <#global name3>
  capture this
    </#global>
    <br>
${name1}<br>
${name2}<br>
${name3}<br>
</div>

<div>
<#assign x=1 >
<#if x==1>
   x is 1
<#elseif x==2>
   x is 2
<#else>
   x is not 1 or 2
</#if>
</div>

<div>
    <#import "freemarkerFooter.ftl" as footer>
${footer.copy}
</div>

<div>
    <#include "freemarkerFooter.ftl">
</div>

<div>
    <#list 1..3 as n>
        ${n}
    <#if n==2>
        <#break>
    </#if>
    </#list>
</div>
<dvi>
    <#list 1..3 as n>
        ${n}
<#sep>,</#sep>
    </#list>
</dvi>
<div>
    <#list 1..3 as n>
        ${n}
    <#if !n_has_next>
    最後一項
    </#if>
    </#list>
</div>

<div>
    <#macro sayhi name>
Hello, ${name}
    </#macro>
<@sayhi "Adam" />
</div>

<div>
    <#assign animal="dog" >
    <#switch animal>
        <#case "pig">
        This is pig
            <#break>
        <#case "dog">
        This is dog
            <#break>
        <#default>
            This is Aaimal
    </#switch>
</div>

<div>
    <#list ["老王","老李","老張"]
    as
    p>
        ${p}
    </#list>
</div>

<div>
    <#if admin??>Admin is not null</#if>
</div>

<div>
    <#if "admin"?contains("min")>
        min
    <#else >
        not min
    </#if>
</div>

<div>
<#assign name
            
           

相關推薦

Spring Boot 模板引擎FreeMarker整合

Spring Boot 模板引擎FreeMarker整合 一、FreeMaker介紹 FreeMarker是一款免費的Java模板引擎,是一種基於模板和資料生成文字(HMLT、電子郵件、配置檔案、原始碼等)的工具,它不是面向終端使用者的,而是一款程式設計師使用的元件。 FreeM

Spring Boot 模板引擎Thymeleaf整合

Spring Boot 模板引擎Thymeleaf整合 一、Thymeleaf介紹 Thymeleaf是一種Java XML / XHTML / HTML5模板引擎,可以在Web和非Web環境中使用。它更適合在基於MVC的Web應用程式的檢視層提供XHTML / HTML5,但

Spring Boot 最佳實踐(三)模板引擎FreeMarker整合

一、FreeMaker介紹 FreeMarker是一款免費的Java模板引擎,是一種基於模板和資料生成文字(HMLT、電子郵件、配置檔案、原始碼等)的工具,它不是面向終端使用者的,而是一款程式設計師使用的元件。 FreeMarker最初設計是用來在MVC模式的Web

Spring Boot模板引擎 (三)

work 1.2 文件添加 ssa -- .html javax dem rabl 1、web應用開發之模板引擎 1.1、spring boot的web應用開發,是基於spring mvc 1.2、Spring boot 在spring默認基礎上,自動配置添加了以下

Spring Boot模板引擎實戰——Thymeleaf

一 點睛 1 靜態資源訪問 在我們開發Web應用的時候,需要引用大量的js、css、圖片等靜態資源。 2 預設配置 Spring Boot預設提供靜態資源目錄位置需置於classpath下,目錄名需符合如下規則: /static /public /

Spring Boot整合模板引擎freemarker以及servlet

上回分享了第一個spring boot程式之後,相信大家對spring boot已經有了初步的認識,這次分享下在springboot中使用servlet和模板引擎freemarker 一  依賴的引入 <dependency> <groupId>

SpringBoot系列:Spring Boot使用模板引擎FreeMarker

一、Java模板引擎 模板引擎(這裡特指用於Web開發的模板引擎)是為了使使用者介面與業務資料(內容)分離而產生的,它可以生成特定格式的文件,用於網站的模板引擎就會生成一個標準的HTML文件。 在java中,主要的模板引擎有JSP、Thymeleaf、FreeMarker、 Velocity等。 雖然隨著前後

SpringBoot第九集:整合JSP和模板引擎Freemarker/Thymeleaf(2020最新最易懂)

SpringBoot第九集:整合JSP和模板引擎(2020最新最易懂)   當客戶通過前端頁面提交請求後,我們以前是怎麼做的?後端接收請求資料,處理請求,把響應結果交給模板引擎JSP,最後將渲染後的JSP轉為HTML,響應給客戶端顯示。JSP的好處就是當我們查出一些資料轉發到JSP頁面以後,我們可以用JSP輕

一、spring boot入門(web+freemarker)

value mls mar 使用 blog doctype web app span 啟動 1.配置maven文件pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://

模板引擎 FreeMarker ,機密系統:jsp

執行 bat per 9.png log let servle web.xml cat 1.引依賴 pom.xml 2.分層 跟MyBatis步驟一樣 dao service entity servlet util 3.mybatis-config.xm

spring boot 1.5.4 整合rabbitMQ(十七)

rabbitmq springboot springboot1.5.4 springboot整合jsp springboot整合rabbitmq 上一篇:spring boot 1.5.4 整合redis、攔截器、過濾器、監聽器、靜態資源配置(十六) 關於rabbitMQ原理,請參閱博客:

spring boot與jdbcTemplate的整合案例2

database bean n) ret struct mapping rri ott mode 簡單入門了spring boot後,接下來寫寫跟數據庫打交道的案例。博文采用spring的jdbcTemplate工具類與數據庫打交道。 下面是搭建的springbo

springboot中添加模板引擎freemarker和thymeleaf

1.2 nco false spa Coding 目錄 templates -- -name freemarkder和thymeleaf都是java的模板引擎,這裏只介紹這兩種模板引擎如何在sprongboot中配置: 1. freemarkder 1.1 在pom.x

spring boot 項目 freemarker 無法加載static 中 js css 文件 原因(報錯404)

oot 相關 bsp mark enable 註解 圖片 tail sdn 去掉@EnableWebMvc 註解 ,相關原因請看原博文 https://blog.csdn.net/testcs_dn/article/details/80249894spring boot

史上最全面的Spring-Boot-Cache使用與整合

epo ring subscribe mar 容器 nal 使用方法 nds live 一:Spring緩存抽象 Spring從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheM

Apache Shiro(三)——Spring Boot 與 Shiro的 整合

在瞭解了Apache Shiro的架構、認證、授權之後,我們來看一下Shiro與Web的整合。下面以Spring Boot為例,介紹一下Spring Boot 與 Shiro的 整合。 一、建立一個Spring Boot專案 可以使用IDEA快速建立一個Spring Boot專

Spring Boot(三)整合MyBatis,MyBatis Generator

簡介 MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old J

spring boot 專案重新搭建----------整合Redis

1.匯入依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artif

Spring Boot 2.0.3整合Spring Batch

Batch用來做大資料處理,是一項不錯的選擇,由於公司的整體架構是Spring Boot,因此自己研究了一下兩者之間的關係。 1.在官網http://start.spring.io/,選擇MYSQL,BATCH,WEB 2.自定義MyBatchConfig類,添加註解@Configur

Spring Boot(六)整合 MyBatis 操作 MySQL 8

一、簡介 1.1 MyBatis介紹 MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC程式碼和手動設定引數以及獲取結果集。 1.2 MyBatis發展史 MyBatis 原本是apache