Thymeleaf一篇文章学会使用

简介: Thymeleaf一篇文章学会使用

Thymeleaf讲解

简介

简介:

Thymeleaf 是新一代 Java 模板引擎,与 Velocity、FreeMarker 等传统 Java 模板引擎不同,Thymeleaf 支持 HTML 原型,其文件后缀为“.html”,因此它可以直接被浏览器打开,此时浏览器会忽略未定义的 Thymeleaf 标签属性,展示 thymeleaf 模板的静态页面效果;当通过 Web 应用程序访问时,Thymeleaf 会动态地替换掉静态内容,使页面动态显示。

创建项目

再setting的Editor中的File and code Templates中创建,thymeleaf模板,方便以后的调用。

我们再点击新建的时候,就有了这个thymeleaf选项。

编码

基础使用

代码一(th:text)

第一个语法通过,运行结果进行讲解。

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${title}">默认的title</title>
</head>
</html>  

通过运行结果可以看出,当没有后端给前端发送数据的时候,这个前端显示的信息就是规定的默认信息。

现在加一个后端IndexController

package com.example.thymeleafdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class IndexController {
    @GetMapping("/index")
    public String index(Model model){
        model.addAttribute("title", "传递的Title");
        return "index";
    }
}

运行结果

通过运行的结果和观察源码,我们都可以发现,这个后端传递给前端的值,在前端生效了。

代码二(th:content)

index.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${title}">默认的title</title>
<!--    字符串拼接-->
    <meta th:content="|李华的-${description}|" name="description" content="默认的description">
    <meta th:content="${keywords}" name="keywords" content="默认的keywords">
</head>
</html>  

IndexController

package com.example.thymeleafdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class IndexController {
    @GetMapping("/index")
    public String index(Model model){
        model.addAttribute("title", "传递的Title");
        model.addAttribute("description", "传递的description");
        model.addAttribute("keywords", "传递的keywords");
        return "index"; // 对于html文件可以不写后缀名
    }
}

运行结果

通过这个运行结果,我们可以发现,这个content中的内容也更改了。

常用方法

这里会演示下面这几个的用法

  • th:text
  • th:if
  • th:object
  • th:each
  • th:switch

User

package com.example.thymeleafdemo.Bean;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class User {
    private String username;
    private String password;
    private Integer sex;
    private Boolean isVip;
    private Date birthday;
    private List<String> hobbys;
}

IndexController

package com.example.thymeleafdemo.controller;
import com.example.thymeleafdemo.Bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
@Controller
public class IndexController {
    @GetMapping("/index")
    public String index(Model model){
        model.addAttribute("title", "传递的Title");
        model.addAttribute("description", "传递的description");
        model.addAttribute("keywords", "传递的keywords");
        return "index"; // 对于html文件可以不写后缀名
    }
    @GetMapping("/UserDemo")
    public String UserDemo(Model model){
        User user = new User();
        user.setUsername("LIHUA");
        user.setUsername("123456");
        user.setSex(1);
        user.setIsVip(true);
        user.setBirthday(new Date());
        user.setHobbys(Arrays.asList("PHP", "Java", "C++"));
        model.addAttribute("user", user);
        return "UserDemo";
    }
}

UserDemo.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<!--    第一种写法-->
    <h2 th:text="${user.username}"></h2>
    <p th:text="${user.password}"></p>
    <p th:if="${user.isVip}">会员</p>
<!--    第二种写法-->
    <div th:object="${user}">
        <h2 th:text="*{username}"></h2>
        <p th:if="*{isVip}">男</p>
    </div>
<!--th:each-->
    <ul>
    <!--注意这tag变量的命名位置-->
        <li th:each="tag:${user.hobbys}" th:text="${tag}"></li>
    </ul>
<!--th:switch-->
    <div th:switch="${user.sex}">
        <p th:case="1">男</p>
        <p th:case="2">女</p>
        <p th:case="*">机器人</p>
    </div>
</html>  

运行结果

通过运行结果可以知道,这些用法的具体效果展示。

thymeleaf中js与css的使用

创建一个css文件

style.css

.box{
    height: 200px;
    width:200px;
    background-color: pink;
}

UserDemo.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<link rel="stylesheet" th:href="@{style.css}">
<div class="box"></div>
<script th:inline="javascript">
    // 后面的{}里面如果没有内容,就会填充注释里面的内容
    const user = /*[[${user}]]*/{};
    console.log(user)
</script>
</html>  

其他效果,让最后一个列表变成红色。

index.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<link rel="stylesheet" th:href="@{style.css}">
<style>
    .active{
        color:red;
    }
</style>
<div class="box"></div>
<!--th:each-->
<ul>
    <li th:each="tag:${user.hobbys}" th:text="${tag}"></li>
</ul>
<ul>
<!--    classappend是追加属性的意思-->
<!--    然后这是演示如何在把最后一个元素编程active-->
    <li th:each="tag, state:${user.hobbys}"
        th:text="${tag}"
        th:classappend="${state.last}?active"
        >
    </li>
</ul>
<script th:inline="javascript">
    // 后面的{}里面如果没有内容,就会填充注释里面的内容
    const user = /*[[${user}]]*/{};
    console.log(user)
</script>
</html>  

thymeleaf组件的使用

第一部分 replace insert id

这里演示了thymeleaf中组件的replace与insert的用法,还提到了另一种方式,就是用id替换fragment。

演示代码

component1.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<footer th:fragment="com1">
    我是第一个组件
</footer>
<div id="com2">
    我是第二个组件
</div>
</html>    

index.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${title}">默认的title</title>
<!--    字符串拼接-->
    <meta th:content="|李华的-${description}|" name="description" content="默认的description">
    <meta th:content="${keywords}" name="keywords" content="默认的keywords">
    <link rel="stylesheet" th:href="@{style.css}">
</head>
<!--这个是替换效果-->
<!--replace com1-->
<div th:replace="~{components/component1::com1}">
</div>
<!--这个是插入效果-->
<!--insert com1-->
<div th:insert="~{components/component1::com1}"></div>
<!--id形式插入-->
<div th:insert="~{components/component1::#com2}"></div>
</html>  

运行结果

从结果可以看出来,第一个是采取的replace的方式,这个方式之下,是直接用组件的内容,替换原来位子的内容的,然后另一个是insert的方式,在这个方式之下,是在原来的组件的前提之下,内部插入一个组件,然后还有一个id的方式,效果和第一个差不多。

传值
第一种

组件中也可以使用原来文本中数据对象。

代码演示

component1.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<footer th:fragment="com1">
    我是第一个组件
</footer>
<div id="com2">
    我是第二个组件
</div>
<div th:fragment="com3(message)">
    <p th:text="${message}"></p>
</div>
</html> 

index.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${title}">默认的title</title>
<!--    字符串拼接-->
    <meta th:content="|李华的-${description}|" name="description" content="默认的description">
    <meta th:content="${keywords}" name="keywords" content="默认的keywords">
    <link rel="stylesheet" th:href="@{style.css}">
</head>
<!--这个是替换效果-->
<!--replace com1-->
<div th:replace="~{components/component1::com1}">
</div>
<!--这个是插入效果-->
<!--insert com1-->
<div th:insert="~{components/component1::com1}"></div>
<!--id形式插入-->
<div th:insert="~{components/component1::#com2}"></div>
<div th:insert="~{components/component1::com3('传递过来的数据')}"></div>
</html>  

运行结果

第二种

index.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${title}">默认的title</title>
<!--    字符串拼接-->
    <meta th:content="|李华的-${description}|" name="description" content="默认的description">
    <meta th:content="${keywords}" name="keywords" content="默认的keywords">
    <link rel="stylesheet" th:href="@{style.css}">
</head>
<!--这个是替换效果-->
<!--replace com1-->
<div th:replace="~{components/component1::com1}">
</div>
<!--这个是插入效果-->
<!--insert com1-->
<div th:insert="~{components/component1::com1}"></div>
<!--id形式插入-->
<div th:insert="~{components/component1::#com2}"></div>
<div th:insert="~{components/component1::com3('传递过来的数据')}"></div>
<div th:insert="~{components/component1::com4(~{::#message})}">
    <p id="message">替换模块</p>
</div>
</html>  

component1.html

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<footer th:fragment="com1">
    我是第一个组件
</footer>
<div id="com2">
    我是第二个组件
</div>
<div th:fragment="com3(message)">
    <p th:text="${message}"></p>
</div>
<div th:fragment="com4(message)">
    <div th:replace="${message}"></div>
</div>
</html>  

运行结果

第三种

这种方式需要的是,写一行注释,不然的话会报错的

<!doctype html>
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<footer th:fragment="com1">
    <!--/*@thymesVar id="user" type="com.example.thymeleafdemo.Bean.User"*/-->
    <h2 th:text="${user.username}"></h2>
</footer>
<div id="com2">
    我是第二个组件
</div>
<div th:fragment="com3(message)">
    <p th:text="${message}"></p>
</div>
<div th:fragment="com4(message)">
    <div th:replace="${message}"></div>
</div>
</html>


相关文章
|
20天前
|
XML Java 数据格式
freemarker使用总结
freemarker使用总结
|
20天前
|
XML Java 数据格式
freemarker
freemarker
|
前端开发 Java 应用服务中间件
Thymeleaf
模板引擎 前端交给我们的页面,是html页面。如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示,及交互等。
Thymeleaf
|
前端开发 JavaScript Java
Spring Boot整合Thymeleaf模板引擎
Spring Boot整合Thymeleaf模板引擎
182 0
Spring Boot整合Thymeleaf模板引擎
|
XML 前端开发 JavaScript
Thymeleaf的使用
最近听说thymeleaf好像也挺流行的,还说是spring官方推荐使用,那thymeleaf究竟是什么呢?spring为什么推荐用它呢?怎么用呢?本文将为你揭秘!
Thymeleaf的使用
|
移动开发 Java HTML5
Thymeleaf 5 分钟教程
Thymeleaf 是一个用于 web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为开发工作流程带来优雅的自然模板ー HTML,它既可以在浏览器中正确显示,也可以作为静态原型工作,从而加强开发团队之间的协作。 有了 Spring Framework 的模块、大量与您最喜欢的工具集成的功能,以及插入您自己功能的能力,Thymeleaf 是现代 HTML5 JVM web 开发的理想选择ーー尽管它可以做的还有很多。 用 Thymeleaf 语言编写的 HTML 模板看起来和工作方式仍然类似于 HTML,使得在应用程序中运行的实际模板仍然可以作为有用的设计工件工
148 0
|
存储 移动开发 缓存
26、模板引擎thymeleaf
模板引擎根据一定的语义,将数据填充到模板中,产生最终的HTML页面。模板引擎主要分两种:客户端引擎和服务端引擎。
160 0
26、模板引擎thymeleaf
|
存储 Java Spring
Spring Boot整合Thymeleaf和FreeMarker
Spring Boot整合Thymeleaf和FreeMarker
296 0
|
XML Java Maven
Freemarker(上)
Freemarker(上)
135 0
Freemarker(上)
|
消息中间件 Java 应用服务中间件
Freemarker(下)
Freemarker(下)
146 0
Freemarker(下)