spring boot ----> 常用模板freemarker和thymeleaf
===========================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