哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。
文章目录
前言
开发网站的时候,通常会对前后端技术进行选型,前后端分离项目不用多说,正如字面意思,分离开发即可。
但是有些项目需要做SEO优化,这就要使网页静态化,优化速度,提高网站在搜索引擎中的权重,尤其在百度是不支持js加载的页面场景中,页面静态化尤为重要,在Spring开发中,就可以使用模板引擎技术来支撑。
下面主要介绍:FreeMarker与thymeleaf 。
1 整合FreeMarker模板
FreeMark 官网: https://freemarker.apache.org
官方文档:https://freemarker.apache.org/docs/dgui_template_overallstructure.html
Apache FreeMark是一个模板引擎,一个基于模板和变化的数据生成文本输出(HTML网页、电子邮件、配置文件、源代码等)的Java库,模板是用FreeMark模板语言(FTL)编写的,这是一种简单的专用语言。
其逻辑为:
由java计算并提供数据,然后由FreeMark程序结果数据。
并且采用了 MVC (模型、视图、控制器)模式。

1.1 pom依赖引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
1.2 yml配置
spring:
http:
encoding:
force: true
charset: UTF-8
freemarker:
allow-request-override: false
cache: false
check-template-location: true
charset: UTF-8
content-type: text/html; charset=utf-8
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: false
suffix: .ftl
template-loader-path: classpath:/templates
1.3 后端
FreemarkController.java
package com.couragesteak.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Map;
@Controller
public class FreemarkController {
@RequestMapping("/freemarkIndex")
public String freemarkIndex(Map<String, Object> result, HttpServletRequest request) {
System.out.println(666);
result.put("name", "有勇气的牛排");
result.put("sex", "0");
result.put("age", 20);
ArrayList<Object> tagList = new ArrayList<>();
tagList.add("全程");
tagList.add("解决方案");
result.put("tagList", tagList);
return "freemarkIndex";
}
}
1.4 前端
<div style="width: 200px;font-weight: 600;">
<div style="border: 1px solid red">
名字:${name}
</div>
<div style="border: 1px solid red;margin-top: 10px;">
性别:
<#if sex=="0">
男
<#elseif sex=="1">
女
<#else>
未知
</#if>
</div>
<div style="border: 1px solid red;margin-top: 10px;">
是否成年:
<#if (age>=18)>
成年
<#else>
未成年
</#if>
</div>
<div style="border: 1px solid red;margin-top: 10px;">
标签:
<#list tagList as tag>
${tag}
</#list>
</div>
</div>

1.5 模板语法
1.5.1 变量表达式
名字:${name}
1.5.2 list
后端
ArrayList<Object> tagList = new ArrayList<>();
tagList.add("全站");
tagList.add("解决方案");
result.put("tagList", tagList);
前端
<#break>
: 跳出循环
<#list tagList as tag>
<p>${tag}</p>
<#break>
</#list>
1.5.3 if判断
两种方法
1 用符号代替: > gt , >= gte ,< lt , <= lte
2 加括号 <#if(x>y)>
<#if (age >= 18)>
<p>成年</p>
<#else>
<p>未成年</p>
</#if>
1.5.4 include
<#include "include.html"/>
<#include "/common/copyright.ftl" encoding="GBK" parse=false/>
1.5.5 switch
<span>4、switch</span>
<div>
<#switch 1>
<#case 3>第3页<#break>
<#case 1>第1页<#break>
<#case 2>第2页<#break>
</#switch>
</div>
2 整合 thymeleaf 渲染web页面
thymeleaf是一款用于渲染 xml/xhtml/xhtml5内容的模板引擎,类似于jsp、Velocity、FreeMaker等,它可以轻易的与Spring MVC等web框架进行集成作为 Web应用的模板引擎。
2.1 pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2.2 yml配置
spring:
thymeleaf:
prefix: classpath:/templates/
check-template-location: true
cache: true
suffix: .html
encoding: UTF-8
mode: HTML5
2.3 java后端
package com.couragesteak.controller;
import com.couragesteak.entity.UserEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Map;
@Controller
public class ThymeleafController {
@RequestMapping("/myThymeleaf")
public String myThymeleafController(HttpServletRequest request, Map<String, Object> result) {
result.put("user", new UserEntity("cs", 17));
ArrayList<Object> userEntitys = new ArrayList<>();
userEntitys.add(new UserEntity("CS1", 16));
userEntitys.add(new UserEntity("CS2", 20));
result.put("userList", userEntitys);
return "myThymeleaf";
}
}
2.4 前端
位置:resources/templates
<div>
<table>
姓名:<span th:text="${user.userName}"></span>
年龄:<span th:text="${user.age}"></span>
</table>
<hr>
<div>
<ul th:each="user:${userList}">
<li>
<span th:if="${user.age>= 18}">成年</span>
<span th:if="${user.age< 18}">未成年</span>
</li>
</ul>
</div>
</div>

2.5 前端模板语法
th:text
: 设置当前元素的文本内容,相同功能的还有th:utext,两者的区别在于前者不会转义html标签,后者会。
th:value
: 设置当前元素的value值,类似修改指定html标签属性的还有th:src,th:href。
th:each
: 遍历循环元素,和th:text或th:value一起使用。注意该属性修饰的标签位置。
th:if
: 条件判断,类似的还有th:unless,th:switch,th:case。
th:insert
: 代码块引入,类似的还有th:replace,th:include,常用于公共代码块的提取复用。
th:fragment
: 定义代码块,方便被th:insert引用。
th:object
: 声明变量,一般和*{}一起配合使用。
th:attr : 修改任意属性,实际开发中用的较少,因为有丰富的其他th属性帮忙。
2.5.1 变量表达式 ${ }
<input type="text" th:value="${user.age}">
<span>三目运算</span>
<input type="text" th:value="${user.age>=18?user.age:'未成年'}">
1 内置方法
一、strings:字符串格式化方法,常用的Java方法它都有。比如:equals,equalsIgnoreCase,length,trim,toUpperCase,toLowerCase,indexOf,substring,replace,startsWith,endsWith,contains,containsIgnoreCase等
二、numbers:数值格式化方法,常用的方法有:formatDecimal等
三、bools:布尔方法,常用的方法有:isTrue,isFalse等
四、arrays:数组方法,常用的方法有:toArray,length,isEmpty,contains,containsAll等
五、lists,sets:集合方法,常用的方法有:toList,size,isEmpty,contains,containsAll,sort等
六、maps:对象方法,常用的方法有:size,isEmpty,containsKey,containsValue等
七、dates:日期方法,常用的方法有:format,year,month,hour,createNow等
2 Map
java
Map myMap = new HashMap();
myMap.put("k1", "大哥");
myMap.put("k2", "牛");
result.put("myMap", myMap);
html
<span>7、Map</span>
<div th:if="${not #maps.isEmpty(myMap)}">
<p th:text="${#maps.size(myMap)}"></p>
<p th:text="${#maps.containsKey(myMap,'k1')}"></p>
<p th:text="${#maps.containsValue(myMap,'K1')}"></p>
<p th:text="${myMap.k1}"></p>
<p></p>
</div>
3 迭代list
后端
ArrayList<Object> userEntitys = new ArrayList<>();
userEntitys.add(new UserEntity("CS1", 16));
userEntitys.add(new UserEntity("CS2", 20));
result.put("userList", userEntitys);
前端
<span>3、迭代list</span>
<div>
<ul th:each="user,i : ${userList}">
<li th:text="${'序号'+(i['index']+1)+', 名字'+user.userName}"></li>
</ul>
</div>

4 date
java
result.put("NowDate", new Date());
html
<span>6、date</span>
<div>
<p>format : <span th:text="${#dates.format(NowDate)}"></span></p>
<p>custom format : <span th:text="${#dates.format(NowDate,'yyyy-MM-dd HH:mm:ss')}"></span></p>
<p>day : <span th:text="${#dates.day(NowDate)}"></span></p>
<p>month : <span th:text="${#dates.month(NowDate)}"></span></p>
<p>monthName : <span th:text="${#dates.monthName(NowDate)}"></span></p>
<p>year : <span th:text="${#dates.year(NowDate)}"></span></p>
<p>dayOfWeek : <span th:text="${#dates.dayOfWeek(NowDate)}"></span></p>
<p>dayOfWeekName : <span th:text="${#dates.dayOfWeekName(NowDate)}"></span></p>
<p>hour : <span th:text="${#dates.hour(NowDate)}"></span></p>
<p>minute : <span th:text="${#dates.minute(NowDate)}"></span></p>
<p>second : <span th:text="${#dates.second(NowDate)}"></span></p>
<p>createNow : <span th:text="${#dates.createNow()}"></span></p>
</div>
2.5.2 链接表达式 @{ }
使用此表达式,可以动态获取项目路径,改名等操作不影响。
修改配置文件项目路径
server:
context-path=/emp
链接表达式
<div>
<script th:src="@{/js/login.js}"></script>
<script th:src="@{/js/login?k1=v1&k2=v2}"></script>
</div>
2.5.4 内容渲染标签
1 th:text 文本渲染
仅渲染文本
<span>1、文本渲染</span>
<p th:text="${user.userName}"></p>
2 dom渲染(代码常用)
<span>2、dom渲染</span>
<p th:utext="'<button>按钮</button>'+${user.userName}"></p>
2.5.5 script获取变量值
<span>5、script获取变量值</span>
<div>
<script th:inline="javascript">
let userName = [[${user.userName}]];
alert(userName);
</script>
</div>
2.5.6 封装通用代码块 insert、replace、include
th:insert
: 是在div中插入代码块。
th:replace
: 代替当前div,与原html结构一致。
th:include
: 直接引入代码,到当前。
路径:classpath:/templates/common
header.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<herder th:fragment="header">
<div>
<h1>网页头部</h1>
</div>
</herder>
</body>
</html>
主页引用
index.html
<div th:include="common/header::header"></div>
参考:
- 余胜军
- https://freemarker.apache.org/docs/dgui_template_overallstructure.html
- https://www.jianshu.com/p/5bbac20348ec
<p><font face="楷体,华文行楷,隶书,黑体" color="red" size="4"><strong>哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮</strong></font></p>
<p><font face="楷体,华文行楷,隶书,黑体" color="blue" size="4"><strong>有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。</strong></font></p>
<p><h3>文章目录</h3><ul><ul><li><a href="#_5">前言</a></li><li><a href="#1_FreeMarker_14">1 整合FreeMarker模板</a></li><ul><li><a href="#11_pom_29">1.1 pom依赖引入</a></li><li><a href="#12_yml_39">1.2 yml配置</a></li><li><a href="#13__65">1.3 后端</a></li><ul><li><a href="#14__111">1.4 前端</a></li></ul><li><a href="#15__152">1.5 模板语法</a></li><ul><li><a href="#151__154">1.5.1 变量表达式</a></li><li><a href="#152_list_160">1.5.2 list</a></li><li><a href="#153_if_185">1.5.3 if判断</a></li><li><a href="#154_include_201">1.5.4 include</a></li><li><a href="#155_switch_210">1.5.5 switch</a></li></ul></ul><li><a href="#2__thymeleaf_web_225">2 整合 thymeleaf 渲染web页面</a></li><ul><li><a href="#21_pom_229">2.1 pom依赖</a></li><li><a href="#22_yml_239">2.2 yml配置</a></li><li><a href="#23_java_256">2.3 java后端</a></li><li><a href="#24__295">2.4 前端</a></li><li><a href="#25__323">2.5 前端模板语法</a></li><ul><li><a href="#251____336">2.5.1 变量表达式 `${ }`</a></li><ul><li><a href="#1__345">1 内置方法</a></li><li><a href="#2_Map_355">2 Map</a></li><li><a href="#3__list_379">3 迭代list</a></li><li><a href="#4_date_403">4 date</a></li></ul><li><a href="#252_____431">2.5.2 链接表达式 `@{ }`</a></li><li><a href="#254__452">2.5.4 内容渲染标签</a></li><ul><li><a href="#1_thtext__454">1 th:text 文本渲染</a></li><li><a href="#2_dom_463">2 dom渲染(代码常用)</a></li></ul><li><a href="#255_script_470">2.5.5 script获取变量值</a></li><li><a href="#256__insertreplaceinclude_482">2.5.6 封装通用代码块 insert、replace、include</a></li></ul></ul></ul></ul></p>
<h2><a id="_5"></a>前言</h2>
<p>开发网站的时候,通常会对前后端技术进行选型,前后端分离项目不用多说,正如字面意思,分离开发即可。</p>
<p>但是有些项目需要做SEO优化,这就要使网页静态化,优化速度,提高网站在搜索引擎中的权重,尤其在百度是不支持js加载的页面场景中,页面静态化尤为重要,在Spring开发中,就可以使用模板引擎技术来支撑。</p>
<p>下面主要介绍:FreeMarker与thymeleaf 。</p>
<h2><a id="1_FreeMarker_14"></a>1 整合FreeMarker模板</h2>
<p>FreeMark 官网: <a href="https://freemarker.apache.org" target="_blank">https://freemarker.apache.org</a></p>
<p>官方文档:<a href="https://freemarker.apache.org/docs/dgui_template_overallstructure.html" target="_blank">https://freemarker.apache.org/docs/dgui_template_overallstructure.html</a></p>
<p>Apache FreeMark是一个模板引擎,一个基于模板和变化的数据生成文本输出(HTML网页、电子邮件、配置文件、源代码等)的Java库,模板是用FreeMark模板语言(FTL)编写的,这是一种简单的专用语言。</p>
<p>其逻辑为:<br />
由java计算并提供数据,然后由FreeMark程序结果数据。</p>
<p>并且采用了 MVC (模型、视图、控制器)模式。</p>
<p><img src="https://static.couragesteak.com/article/89fbf56a45a87f3ea2a9ca17cb4b87e3.png" alt="image.png" /></p>
<h3><a id="11_pom_29"></a>1.1 pom依赖引入</h3>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-comment"><!-- 模板引擎 引入freeMarker的依赖包. --></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-freemarker<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
</code></div></pre>
<h3><a id="12_yml_39"></a>1.2 yml配置</h3>
<pre><div class="hljs"><code class="lang-yaml"><span class="hljs-attr">spring:</span>
<span class="hljs-attr">http:</span>
<span class="hljs-attr">encoding:</span>
<span class="hljs-attr">force:</span> <span class="hljs-literal">true</span>
<span class="hljs-comment"># 模版引擎编码为UTF-8</span>
<span class="hljs-attr">charset:</span> <span class="hljs-string">UTF-8</span>
<span class="hljs-comment"># freemarker模板配置</span>
<span class="hljs-attr">freemarker:</span>
<span class="hljs-attr">allow-request-override:</span> <span class="hljs-literal">false</span>
<span class="hljs-attr">cache:</span> <span class="hljs-literal">false</span>
<span class="hljs-attr">check-template-location:</span> <span class="hljs-literal">true</span>
<span class="hljs-attr">charset:</span> <span class="hljs-string">UTF-8</span>
<span class="hljs-attr">content-type:</span> <span class="hljs-string">text/html;</span> <span class="hljs-string">charset=utf-8</span>
<span class="hljs-attr">expose-request-attributes:</span> <span class="hljs-literal">false</span>
<span class="hljs-attr">expose-session-attributes:</span> <span class="hljs-literal">false</span>
<span class="hljs-attr">expose-spring-macro-helpers:</span> <span class="hljs-literal">false</span>
<span class="hljs-comment">## 模版文件结尾.ftl</span>
<span class="hljs-attr">suffix:</span> <span class="hljs-string">.ftl</span>
<span class="hljs-comment">## 模版文件目录</span>
<span class="hljs-attr">template-loader-path:</span> <span class="hljs-string">classpath:/templates</span>
</code></div></pre>
<h3><a id="13__65"></a>1.3 后端</h3>
<p>FreemarkController.java</p>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排
* @FileName: FreemarkController.java
* desc : Freemark模板引擎
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.controller;
<span class="hljs-keyword">import</span> org.springframework.stereotype.Controller;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.Map;
<span class="hljs-meta">@Controller</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">FreemarkController</span> {
<span class="hljs-comment">// import java.util.Map;</span>
<span class="hljs-comment">// http://127.0.0.1:8080/freemarkIndex</span>
<span class="hljs-meta">@RequestMapping("/freemarkIndex")</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">freemarkIndex</span><span class="hljs-params">(Map<String, Object> result, HttpServletRequest request)</span> {
System.out.println(<span class="hljs-number">666</span>);
<span class="hljs-comment">// 传数据到页面</span>
result.put(<span class="hljs-string">"name"</span>, <span class="hljs-string">"有勇气的牛排"</span>);
result.put(<span class="hljs-string">"sex"</span>, <span class="hljs-string">"0"</span>);
result.put(<span class="hljs-string">"age"</span>, <span class="hljs-number">20</span>);
ArrayList<Object> tagList = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
tagList.add(<span class="hljs-string">"全程"</span>);
tagList.add(<span class="hljs-string">"解决方案"</span>);
result.put(<span class="hljs-string">"tagList"</span>, tagList);
<span class="hljs-keyword">return</span> <span class="hljs-string">"freemarkIndex"</span>;
}
}
</code></div></pre>
<h4><a id="14__111"></a>1.4 前端</h4>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"width: 200px;font-weight: 600;"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"border: 1px solid red"</span>></span>
名字:${name}
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"border: 1px solid red;margin-top: 10px;"</span>></span>
性别:
<#if sex=="0">
男
<#elseif sex=="1">
女
<#else>
未知
</#if>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"border: 1px solid red;margin-top: 10px;"</span>></span>
是否成年:
<#if (age>=18)>
成年
<#else>
未成年
</#if>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"border: 1px solid red;margin-top: 10px;"</span>></span>
标签:
<#list tagList as tag>
${tag}
</#list>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/35b2b6bad2e96bb1a5bf4b79d92dc9fe.png" alt="image.png" /></p>
<h3><a id="15__152"></a>1.5 模板语法</h3>
<h4><a id="151__154"></a>1.5.1 变量表达式</h4>
<pre><div class="hljs"><code class="lang-html">名字:${name}
</code></div></pre>
<h4><a id="152_list_160"></a>1.5.2 list</h4>
<p>后端</p>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">// list</span>
ArrayList<Object> tagList = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
tagList.add(<span class="hljs-string">"全站"</span>);
tagList.add(<span class="hljs-string">"解决方案"</span>);
result.put(<span class="hljs-string">"tagList"</span>, tagList);
</code></div></pre>
<p>前端</p>
<p><code><#break></code>: 跳出循环</p>
<pre><div class="hljs"><code class="lang-html"><#list tagList as tag>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>${tag}<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<#break>
</#list>
</code></div></pre>
<h4><a id="153_if_185"></a>1.5.3 if判断</h4>
<p>两种方法<br />
1 用符号代替: > gt , >= gte ,< lt , <= lte<br />
2 加括号 <#if(x>y)></p>
<pre><div class="hljs"><code class="lang-html"><#if (age >= 18)>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>成年<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<#else>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>未成年<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
</#if>
</code></div></pre>
<h4><a id="154_include_201"></a>1.5.4 include</h4>
<pre><div class="hljs"><code class="lang-html"><#include "include.html"/>
<#include "/common/copyright.ftl" encoding="GBK" parse=false/>
</code></div></pre>
<h4><a id="155_switch_210"></a>1.5.5 switch</h4>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">span</span>></span>4、switch<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<#switch 1>
<#case 3>第3页<#break>
<#case 1>第1页<#break>
<#case 2>第2页<#break>
</#switch>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<h2><a id="2__thymeleaf_web_225"></a>2 整合 thymeleaf 渲染web页面</h2>
<p>thymeleaf是一款用于渲染 xml/xhtml/xhtml5内容的模板引擎,类似于jsp、Velocity、FreeMaker等,它可以轻易的与Spring MVC等web框架进行集成作为 Web应用的模板引擎。</p>
<h3><a id="21_pom_229"></a>2.1 pom依赖</h3>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-comment"><!-- 模板引擎 引入thymeleaf的依赖--></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-thymeleaf<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
</code></div></pre>
<h3><a id="22_yml_239"></a>2.2 yml配置</h3>
<pre><div class="hljs"><code class="lang-yaml"><span class="hljs-attr">spring:</span>
<span class="hljs-comment"># ThymeLeaf配置</span>
<span class="hljs-attr">thymeleaf:</span>
<span class="hljs-comment">#prefix:指定模板所在的目录</span>
<span class="hljs-attr">prefix:</span> <span class="hljs-string">classpath:/templates/</span>
<span class="hljs-comment">#check-tempate-location: 检查模板路径是否存在</span>
<span class="hljs-attr">check-template-location:</span> <span class="hljs-literal">true</span>
<span class="hljs-comment">#cache: 是否缓存,开发模式下设置为false,避免改了模板还要重启服务器,线上设置为true,可以提高性能。</span>
<span class="hljs-attr">cache:</span> <span class="hljs-literal">true</span>
<span class="hljs-attr">suffix:</span> <span class="hljs-string">.html</span>
<span class="hljs-attr">encoding:</span> <span class="hljs-string">UTF-8</span>
<span class="hljs-attr">mode:</span> <span class="hljs-string">HTML5</span>
</code></div></pre>
<h3><a id="23_java_256"></a>2.3 java后端</h3>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排
* @FileName: ThymeleafController.java
* desc :
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.controller;
<span class="hljs-keyword">import</span> com.couragesteak.entity.UserEntity;
<span class="hljs-keyword">import</span> org.springframework.stereotype.Controller;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.Map;
<span class="hljs-meta">@Controller</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ThymeleafController</span> {
<span class="hljs-comment">// http://127.0.0.1:8080/myThymeleaf</span>
<span class="hljs-meta">@RequestMapping("/myThymeleaf")</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">myThymeleafController</span><span class="hljs-params">(HttpServletRequest request, Map<String, Object> result)</span> {
<span class="hljs-comment">// request.setAttribute("ruser", new UserEntity("cs", 20));</span>
result.put(<span class="hljs-string">"user"</span>, <span class="hljs-keyword">new</span> <span class="hljs-title class_">UserEntity</span>(<span class="hljs-string">"cs"</span>, <span class="hljs-number">17</span>));
ArrayList<Object> userEntitys = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
userEntitys.add(<span class="hljs-keyword">new</span> <span class="hljs-title class_">UserEntity</span>(<span class="hljs-string">"CS1"</span>, <span class="hljs-number">16</span>));
userEntitys.add(<span class="hljs-keyword">new</span> <span class="hljs-title class_">UserEntity</span>(<span class="hljs-string">"CS2"</span>, <span class="hljs-number">20</span>));
result.put(<span class="hljs-string">"userList"</span>, userEntitys);
<span class="hljs-keyword">return</span> <span class="hljs-string">"myThymeleaf"</span>;
}
}
</code></div></pre>
<h3><a id="24__295"></a>2.4 前端</h3>
<p>位置:<code>resources/templates</code></p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">table</span>></span>
姓名:<span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${user.userName}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span>
年龄:<span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${user.age}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"></<span class="hljs-name">table</span>></span>
<span class="hljs-tag"><<span class="hljs-name">hr</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">ul</span> <span class="hljs-attr">th:each</span>=<span class="hljs-string">"user:${userList}"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">li</span>></span>
<span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:if</span>=<span class="hljs-string">"${user.age>= 18}"</span>></span>成年<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:if</span>=<span class="hljs-string">"${user.age< 18}"</span>></span>未成年<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"></<span class="hljs-name">li</span>></span>
<span class="hljs-tag"></<span class="hljs-name">ul</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/1ad076bd00618561fc9ee0cbec7fa133.png" alt="image.png" /></p>
<h3><a id="25__323"></a>2.5 前端模板语法</h3>
<ol>
<li><code>th:text</code>: 设置当前元素的文本内容,相同功能的还有th:utext,两者的区别在于前者不会转义html标签,后者会。</li>
<li><code>th:value</code>: 设置当前元素的value值,类似修改指定html标签属性的还有th:src,th:href。</li>
<li><code>th:each</code>: 遍历循环元素,和th:text或th:value一起使用。注意该属性修饰的标签位置。</li>
<li><code>th:if</code>: 条件判断,类似的还有th:unless,th:switch,th:case。</li>
<li><code>th:insert</code>: 代码块引入,类似的还有th:replace,th:include,常用于公共代码块的提取复用。</li>
<li><code>th:fragment</code>: 定义代码块,方便被th:insert引用。</li>
<li><code>th:object</code>: 声明变量,一般和*{}一起配合使用。</li>
</ol>
<p>th:attr : 修改任意属性,实际开发中用的较少,因为有丰富的其他th属性帮忙。</p>
<h4><a id="251____336"></a>2.5.1 变量表达式 <code>${ }</code></h4>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">th:value</span>=<span class="hljs-string">"${user.age}"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">span</span>></span>三目运算<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">th:value</span>=<span class="hljs-string">"${user.age>=18?user.age:'未成年'}"</span>></span>
</code></div></pre>
<h5><a id="1__345"></a>1 内置方法</h5>
<p>一、<strong>strings</strong>:字符串格式化方法,常用的Java方法它都有。比如:equals,equalsIgnoreCase,length,trim,toUpperCase,toLowerCase,indexOf,substring,replace,startsWith,endsWith,contains,containsIgnoreCase等<br />
二、<strong>numbers</strong>:数值格式化方法,常用的方法有:formatDecimal等<br />
三、<strong>bools</strong>:布尔方法,常用的方法有:isTrue,isFalse等<br />
四、<strong>arrays</strong>:数组方法,常用的方法有:toArray,length,isEmpty,contains,containsAll等<br />
五、<strong>lists,sets</strong>:集合方法,常用的方法有:toList,size,isEmpty,contains,containsAll,sort等<br />
六、<strong>maps</strong>:对象方法,常用的方法有:size,isEmpty,containsKey,containsValue等<br />
七、<strong>dates</strong>:日期方法,常用的方法有:format,year,month,hour,createNow等</p>
<h5><a id="2_Map_355"></a>2 Map</h5>
<p>java</p>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-type">Map</span> <span class="hljs-variable">myMap</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashMap</span>();
myMap.put(<span class="hljs-string">"k1"</span>, <span class="hljs-string">"大哥"</span>);
myMap.put(<span class="hljs-string">"k2"</span>, <span class="hljs-string">"牛"</span>);
result.put(<span class="hljs-string">"myMap"</span>, myMap);
</code></div></pre>
<p>html</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">span</span>></span>7、Map<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">th:if</span>=<span class="hljs-string">"${not #maps.isEmpty(myMap)}"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#maps.size(myMap)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#maps.containsKey(myMap,'k1')}"</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#maps.containsValue(myMap,'K1')}"</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${myMap.k1}"</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<h5><a id="3__list_379"></a>3 迭代list</h5>
<p>后端</p>
<pre><div class="hljs"><code class="lang-java">ArrayList<Object> userEntitys = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
userEntitys.add(<span class="hljs-keyword">new</span> <span class="hljs-title class_">UserEntity</span>(<span class="hljs-string">"CS1"</span>, <span class="hljs-number">16</span>));
userEntitys.add(<span class="hljs-keyword">new</span> <span class="hljs-title class_">UserEntity</span>(<span class="hljs-string">"CS2"</span>, <span class="hljs-number">20</span>));
result.put(<span class="hljs-string">"userList"</span>, userEntitys);
</code></div></pre>
<p>前端</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">span</span>></span>3、迭代list<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">ul</span> <span class="hljs-attr">th:each</span>=<span class="hljs-string">"user,i : ${userList}"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">li</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${'序号'+(i['index']+1)+', 名字'+user.userName}"</span>></span><span class="hljs-tag"></<span class="hljs-name">li</span>></span>
<span class="hljs-tag"></<span class="hljs-name">ul</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/8a53d45a40676a940747b7762044062a.png" alt="image.png" /></p>
<h5><a id="4_date_403"></a>4 date</h5>
<p>java</p>
<pre><div class="hljs"><code class="lang-java">result.put(<span class="hljs-string">"NowDate"</span>, <span class="hljs-keyword">new</span> <span class="hljs-title class_">Date</span>());
</code></div></pre>
<p>html</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">span</span>></span>6、date<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>format : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.format(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>custom format : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.format(NowDate,'yyyy-MM-dd HH:mm:ss')}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>day : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.day(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>month : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.month(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>monthName : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.monthName(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>year : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.year(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>dayOfWeek : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.dayOfWeek(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>dayOfWeekName : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.dayOfWeekName(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>hour : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.hour(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>minute : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.minute(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>second : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.second(NowDate)}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>createNow : <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${#dates.createNow()}"</span>></span><span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<h4><a id="252_____431"></a>2.5.2 链接表达式 <code>@{ }</code></h4>
<p>使用此表达式,可以动态获取项目路径,改名等操作不影响。</p>
<p>修改配置文件项目路径</p>
<pre><div class="hljs"><code class="lang-yaml"><span class="hljs-comment">#修改项目名,链接表达式会自动修改路径,避免资源文件找不到</span>
<span class="hljs-attr">server:</span>
<span class="hljs-string">context-path=/emp</span>
</code></div></pre>
<p>链接表达式</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">th:src</span>=<span class="hljs-string">"@{/js/login.js}"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">th:src</span>=<span class="hljs-string">"@{/js/login?k1=v1&k2=v2}"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<h4><a id="254__452"></a>2.5.4 内容渲染标签</h4>
<h5><a id="1_thtext__454"></a>1 th:text 文本渲染</h5>
<p>仅渲染文本</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">span</span>></span>1、文本渲染<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">th:text</span>=<span class="hljs-string">"${user.userName}"</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
</code></div></pre>
<h5><a id="2_dom_463"></a>2 dom渲染(代码常用)</h5>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">span</span>></span>2、dom渲染<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">th:utext</span>=<span class="hljs-string">"'<button>按钮</button>'+${user.userName}"</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
</code></div></pre>
<h4><a id="255_script_470"></a>2.5.5 script获取变量值</h4>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">span</span>></span>5、script获取变量值<span class="hljs-tag"></<span class="hljs-name">span</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">th:inline</span>=<span class="hljs-string">"javascript"</span>></span><span class="language-javascript">
<span class="hljs-keyword">let</span> userName = [[${user.<span class="hljs-property">userName</span>}]];
<span class="hljs-title function_">alert</span>(userName);
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<h4><a id="256__insertreplaceinclude_482"></a>2.5.6 封装通用代码块 insert、replace、include</h4>
<p><code>th:insert</code>: 是在div中插入代码块。<br />
<code>th:replace</code>: 代替当前div,与原html结构一致。<br />
<code>th:include</code>: 直接引入代码,到当前。</p>
<p>路径:<code>classpath:/templates/common</code></p>
<p>header.html</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-meta"><!DOCTYPE <span class="hljs-keyword">html</span>></span>
<span class="hljs-tag"><<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">title</span>></span>Title<span class="hljs-tag"></<span class="hljs-name">title</span>></span>
<span class="hljs-tag"></<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">body</span>></span>
<span class="hljs-tag"><<span class="hljs-name">herder</span> <span class="hljs-attr">th:fragment</span>=<span class="hljs-string">"header"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h1</span>></span>网页头部<span class="hljs-tag"></<span class="hljs-name">h1</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">herder</span>></span>
<span class="hljs-tag"></<span class="hljs-name">body</span>></span>
<span class="hljs-tag"></<span class="hljs-name">html</span>></span>
</code></div></pre>
<p>主页引用</p>
<p>index.html</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-comment"><!-- 导入通用头部模板 --></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">th:include</span>=<span class="hljs-string">"common/header::header"</span>></span><span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<p>参考:</p>
<ul>
<li>余胜军</li>
<li>https://freemarker.apache.org/docs/dgui_template_overallstructure.html</li>
<li>https://www.jianshu.com/p/5bbac20348ec</li>
</ul>
留言