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

===========================freemarker===================================css

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

freemarker starter:html5

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: web

一、可使用freemarker的starer來構建web MVC應用spring

二、spring MVC支持使用freemarkerchrome

三、FreeMarkerViewResolver的id是"freeMarkerViewResolver"數據庫

四、能夠經過外部配置改變資源的加載路徑,咱們可使用spring.freemarker.templateLoaderPath來自定義,可是默認的路徑是"classpath:/templates/"apache

五、freemarker文件的前綴和後綴一樣能夠經過外部配置來改變,咱們能夠用spring.freemarker.prefix和spring.freemarker.suffix來自定義,可是默認的前綴和後綴分別是空和「.ftl」。(4和5也能夠經過配置bean來覆蓋默認配置)瀏覽器

六、關注類org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration緩存

七、若是想經過不用重啓容器而達到從新加載模板,咱們能夠配置spring.freemarker.cache = false

八、freemaker能夠覆蓋spring boot的錯誤提示頁面,只要在「classpath:/templates/」下建立名爲「error.ftl」的ftl模板文件。

九、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/ #以逗號分隔的模板路徑列表。

十一、此版本的spring boot依賴的freemarker依賴

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

十二、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:

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

二、spring MVC支持使用 thymeleaf

三、ThymeleafViewResolver 的id是"thymeleafViewResolver"

四、freemarker文件的前綴和後綴一樣能夠經過外部配置來改變,咱們能夠用spring.thymeleaf.prefix和spring.thymeleaf.suffix來自定義,可是默認的前綴和後綴分別是「classpath:/templates/」和「.html」。

五、關注類org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration

六、若是想經過不用重啓容器而達到從新加載模板,咱們能夠配置spring.thymeleaf.cache = false

七、經過上面的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

八、thymeleaf能夠覆蓋spring boot的錯誤提示頁面,只要在「classpath:/templates/」下建立名爲「error.html」的html模板文件。

九、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= # 以逗號分隔的能夠解析的視圖名稱列表。

 十、此版本的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>

 十一、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,能夠訪問到

 

2018-12-08 15:34:51

spring boot,jdbc,thymeleaf整合

html5 模板,不用引入thymeleaf的DTD

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>hello</title>
</head>
<body>

</body>
</html>

 

jdbcTemplate.queryForObject() 查詢一個對象,當查出不存在時,程序拋出異常 org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

1   user = jdbcTemplate.queryForObject("select * from user where id = ?", new Object[]{id}, new BeanPropertyRowMapper<User>(User.class)); 

做異常處理 [參考博客:http://www.javashuo.com/article/p-vgxootrb-de.html]

 1 package com.rui.dao;
 2 
 3 import com.rui.pojo.User;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 6 import org.springframework.jdbc.core.JdbcTemplate;
 7 import org.springframework.stereotype.Repository;
 8 
 9 @Repository
10 public class UserDao {
11 
12     @Autowired
13     private JdbcTemplate jdbcTemplate;
14 
15     public User getUserById(Integer id) {
16 
17         User user = null;
18         try {
19             user = jdbcTemplate.queryForObject("select * from user where id = ?", new Object[]{id}, new BeanPropertyRowMapper<User>(User.class));
20 
21         } catch (Exception e) {
22             return null; // 異常處理
23         }
24 
25         System.out.println(user.toString());
26         return user;
27 
28     }
29 }

 

final note:

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

相關文章
相關標籤/搜索