1. 程式人生 > >spring boot ----> 常用模板freemarker和thymeleaf

spring boot ----> 常用模板freemarker和thymeleaf

ati include 上下文 tlist rpath num 源文件 添加 page

===========================freemarker===================================

freemarker 官網:https://freemarker.apache.org/

freemarker starter:

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-freemarker</artifactId>
4     <
version>1.5.15.RELEASE</version> 5 </dependency>

note:

1、可以使用freemarker的starer來構建web MVC應用

2、spring MVC支持使用freemarker

3、FreeMarkerViewResolver的id是"freeMarkerViewResolver"

4、可以通過外部配置改變資源的加載路徑,我們可以使用spring.freemarker.templateLoaderPath來自定義,但是默認的路徑是"classpath:/templates/"

5、freemarker文件的前綴和後綴同樣可以通過外部配置來改變,我們可以用spring.freemarker.prefix和spring.freemarker.suffix來自定義,但是默認的前綴和後綴分別是空和“.ftl”。(4和5也可以通過配置bean來覆蓋默認配置)

6、關註類org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration

7、如果想通過不用重啟容器而達到重新加載模板,我們可以配置spring.freemarker.cache = false

8、freemaker可以覆蓋spring boot的錯誤提示頁面,只要在“classpath:/templates/”下創建名為“error.ftl”的ftl模板文件。

9、spring boot中freemarker配置項

 1 spring.freemarker.cache=false # 啟用模板緩存。
2 3 spring.freemarker.charset=UTF-8 # 模板編碼。 4 5 spring.freemarker.content-type=text/html # Content-Type的值 6 7 spring.freemarker.enabled=true # 開啟MVC視圖解析 8 9 spring.freemarker.prefix= # 在構建URL時添加前綴到視圖名稱之前。 10 11 spring.freemarker.suffix=.ftl # 模板文件的後綴名稱。 12 13 spring.freemarker.template-loader-path=classpath:/templates/ #以逗號分隔的模板路徑列表。

11、此版本的spring boot依賴的freemarker依賴

1 <dependency>
2     <groupId>org.apache</groupId>
3     <artifactId>freemarker</artifactId>
4     <version>2.3.28</version>
5 </dependency>

12、freemarker常用語法

pojo屬性的獲取:定義了pojo,使用Map存儲pojo
${pojo.attribute}


循環中各個值的獲取:定義了List,使用Map存儲List
<#list targetList as littleList>
   ${littleList.attribute}
</#list>


循環下標的獲取:定義了List,使用Map存儲List
<#list targetList as littleList>
    ${littleList_index}
   ${littleList.attribute}
</#list>


if的使用:定義了List,使用Map存儲List
<#list targetList as littleList>
 <#if littleList_index%2 == 0>
1
<#else>
2
</#if>
   ${littleList.attribute}
</#list>


日期處理:定義了日期date,使用Map存儲日期
註意:日期在freemaker中顯示時需要轉換為String 
${date?date}  格式 xx-xx-xx
${date?time} 格式 xx:xx:xx
${date?datetime} 格式 xx-xx-xx xx:xx:xx
註意:我們可以自定格式
${date?string(‘yy/MM/dd HH:mm:ss‘)}


null值的處理:定義了變量var,使用Map存儲var
${var!”defaultValue”}
或者使用<#if>判斷
<#if var??>
var不是Null,var=${var}
<#else>
var是null
</#if>


添加頁眉頁腳:定義了另一個freemaker文件other.ftl
<#include “other.ftl”>

===========================Thymeleaf===================================

thymeleaf 官網:https://www.thymeleaf.org

thymeleaf starter:

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-thymeleaf</artifactId>
4     <version>1.5.15.RELEASE</version>
5 </dependency>

note:

1、可以使用 thymeleaf 的starer來構建web MVC應用

2、spring MVC支持使用 thymeleaf

3、ThymeleafViewResolver 的id是"thymeleafViewResolver"

4、freemarker文件的前綴和後綴同樣可以通過外部配置來改變,我們可以用spring.thymeleaf.prefix和spring.thymeleaf.suffix來自定義,但是默認的前綴和後綴分別是“classpath:/templates/”和“.html”。

5、關註類org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration

6、如果想通過不用重啟容器而達到重新加載模板,我們可以配置spring.thymeleaf.cache = false

7、通過上面的starter啟用的thymeleaf的版本是2.1,如果想要使用thymeleaf 3.0以上版本,需要做如下的配置:

前提是項目正在使用spring-boot-starter-parent,在pom.xml中的properties標簽中配置thymeleaf.version和thymeleaf-layout-dialect.version屬性覆蓋2.1版本

1 <properties>
2  <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
3  <thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
4 </properties>

為避免出現關於不推薦使用HTML 5模板模式的警告消息以及正在使用的HTML模板模式,我們可以在配置文件做一點配置來消除這些警告。配置文件application.properties的配置:

1 spring.thymeleaf.mode: HTML

8、thymeleaf可以覆蓋spring boot的錯誤提示頁面,只要在“classpath:/templates/”下創建名為“error.html”的html模板文件。

9、spring boot中thymeleaf配置項

 1 # THYMELEAF (ThymeleafAutoConfiguration)
 2 spring.thymeleaf.cache=true # 啟用模板緩存。
 3 
 4 spring.thymeleaf.content-type=text/html # Content-Type配置。
 5 
 6 spring.thymeleaf.enabled=true # 啟動MVC Thymeleaf 視圖解析。
 7 
 8 spring.thymeleaf.encoding=UTF-8 # 設置模板的編碼。
 9 
10 spring.thymeleaf.mode=HTML5 # 配置模板使用的模板模式。
11 
12 spring.thymeleaf.prefix=classpath:/templates/ # 在構建URL時添加前綴到視圖名稱之前。
13 
14 spring.thymeleaf.suffix=.html # 模板文件的後綴名稱。
15 
16 spring.thymeleaf.view-names= # 以逗號分隔的可以解析的視圖名稱列表。

10、此版本的spring boot依賴的thymeleaf依賴

1 <dependency>
2     <groupId>org.thymeleaf</groupId>
3     <artifactId>thymeleaf</artifactId>
4     <version>2.1.6.RELEASE</version>
5 </dependency>
6
7 <dependency>
8 <groupId>org.thymeleaf</groupId>
9 <artifactId>thymeleaf-spring4</artifactId>
10 <version>2.16.RELEASE</version>
11 </dependency>

11、thymeleaf的使用

1)引入thymeleaf的DTD和xmlns命名空間,否則thymeleaf的語法將不會在html模板文件上生效。html文件的配置:

 1 <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">  <!--very important!-->
 2 
 3 <html xmlns="http://www.w3.org/1999/xhtml"
 4       xmlns:th="http://www.thymeleaf.org">  <!--very important!-->
 5 
 6     <head></head>
 7 
 8     <body>
 9            <p text:th=#{blog.welcome}>welcome my blog!</p>
10      </body>
11 
12 </html>

2)、註釋

①標準的html/xml註釋

1 <!-- <p>我是註釋!</p> -->

②Thymeleaf 解析級別的註釋塊,可以放置標簽,直接用chrome瀏覽器打開時,可以看到註釋中的效果,但是當Thymeleaf在處理時,註釋塊會被移除。

 1 <!--/*-->
 2    <table>
 3       <tr>
 4        <td>1</td> <td>2</td>                 
 5       </tr>
 6              
 7       <tr>
 8        <td>3</td> <td>4</td>
 9       </tr>
10     </table>
11 <!--*/-->

③Thymeleaf 原型註釋塊,可以放置標簽,直接用chrome瀏覽器打開時,看不到標簽的效果,但是當Thymeleaf在處理時,註釋塊中的標簽會看成是正常的,<!--/*/ 和 /*/-->會被移除。

1 <span>start!</span>
2 <!--/*/
3   <div th:text="${pwd}">
4     銀行密碼:123456
5   </div>
6 /*/-->
7 <span>end!</span>

④th:block 標簽:<th:bllock></th:block>,直接用chrome瀏覽器打開時,會看到一個2x2表格,即一個默認user的信息,它不是從數據庫中取出的信息。當Thymeleaf處理時,會動態生成多個user的信息。

 1 <table border="1px solid red">
 2   <th:block th:each="user : ${users}"> 
 3     <tr>
 4         <td th:text="${user.name}">rui</td>
 5         <td th:text="${user.sex}">male</td>
 6     </tr>
 7     <tr>
 8         <td th:text="${user.age}">18</td>
<td th:text="${user.address}">China</td> 9 </tr> 10 </th:block> 11 </table>

chrome瀏覽器運行效果:

技術分享圖片

3)用到過的語法

下面四個搭配${}使用,需要用雙引號括起來

th:text = "${}" 文本,瀏覽器會忽略它

th:each = "item : ${Object}"  item === 叠代變量   ${Object} =====叠代表達式
th:each的更多內容參考 :https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#iteration

th:if = "${}" ==== 如果
th:unless = "${}" =====如果不
假設有個需求要判斷某個容器不為空,可以有兩種方式:
th:if="${not #lists.isEmpty(store)}" === th:unless="${#lists.isEmpty(store)}"


下面三個搭配使用
th:fragment="fragmentName" ==== 其他模板,並命名為"fragmentName"
th:include=" templateName :: fragmentName"  =====將片段的內容包含到主標簽中,主標簽還是原來的標簽
th:replace=" templateName :: fragmentName"  ====== 將片段標簽替換主標簽,主標簽變成片段的標簽
更多例子可參考:https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#template-layout


下面兩個搭配@{}使用,需要使用雙引號括起來
th:src = "@{}"    圖片路徑等
th:href = "@{}"  跳轉鏈接等
th:href用法小結
<a th:href="@{/find/page(pageNum=${pageInfo.pageNum},pageSize=${pageInfo.pageSize})}">
與jsp的寫法相比,簡短許多。
註意幾個地方:
1,上下文 =====> /
2,?符號 =====> ()
3,&符號 =====> , ${} 變量表達式 @{} URL表達式 #{} 消息表達式,可以作提取國際化信息用 內置對象 對象的方法 #lists isEmpty()

thymeleaf 和spring boot整合的幾個問題

①DTD引入的話,工程報錯??? dtd文件引錯,應該是:thymeleaf-spring4-4.dtd
②路徑的配置??? 圖片,css。瀏覽器無法訪問,報406,500狀態碼。
改造成不用th:src="@{}",th:href="@{}"配置路徑,直接配置src和href,瀏覽器無法訪問,報406,500狀態碼
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation.
原因是靜態資源文件命名的時候帶有error關鍵字,改成1.png和1.css,可以訪問到

final note:

參考資料:spring-boot-reference.pdf (spring boot 1.5.15)

spring boot ----> 常用模板freemarker和thymeleaf