十、Spring Boot集成Thymeleaf模板引擎

前缀:啥是模板引擎?

模板引擎(这里特指用于Web开发的模板引擎),是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档;

  • 从字面上理解:模板引擎最重要的就是 模板 二字,相当于做好一个模板后并套入对应位置的数据,最终以html的格式展示出来;

  • 将模板设计好之后直接填充数据即可,而不需要重新设计整个页面,这样就提高了页面以及代码的复用性;

    其实,jsp就是一个模板引擎。市面上开源的第三方的模板引擎也比较多,有Thymeleaf、FreeMaker、Velocity等模板引擎受众较广。

5.6.1 Thymeleaf 概述

5.6.1.1 介绍

官方网站:Thymeleaf

Thymeleaf 官方网站对Thymeleaf 的介绍:

Thymeleaf 是适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用作静态原型,从而在开发团队中实现更强大的协作。

传统的 JSP+JSTL 组合是已经过去了,Thymeleaf 是现代服务端的模板引擎,与传统的 JSP 不同,Thymeleaf 支持 html 原型,可以使用浏览器直接打开,因为可以忽略掉拓展属性,相当于打开原生页面,给前端人员也带来一定的便利。

Spring官方支持的服务的渲染模板中,并不包含jsp。而是Thymeleaf和Freemarker等,而Thymeleaf与SpringMVC的视图技术,及SpringBoot的自动化配置集成非常完美,几乎没有任何成本,你只用关注Thymeleaf的语法即可。

5.6.1.2 使用缘由

使用jsp的弊端

  1. 项目目录结构繁琐

  2. 页面不简洁

  3. jsp内置错误页面不能覆盖springboot默认的错误页面

  4. 只能打成war不能打成jar

  5. 内置的jetty服务器不支持jsp

Thymeleaf的优点:

  1. 开箱即用,它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言;

  2. Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

  3. 有网无网的情况下模版页面都可以执行,美工的页面拿来就可以用,相对jsp减少了额外的标签,页面也更加简洁。

5.6.2 依赖导入

在 Spring Boot 中使用 thymeleaf 模板需要引入依赖,可以在创建项目工程时勾选 Thymeleaf,也可以创建之后再手动导入,如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

另外,在 html 页面上如果要使用 thymeleaf 模板,需要在页面标签中引入:  

<html xmlns:th="http://www.thymeleaf.org">

5.6.3. Thymeleaf相关配置

因为 Thymeleaf 中已经有默认的配置了,我们不需要再对其做过多的配置,有一个需要注意一下,Thymeleaf 默认是开启页面缓存的,所以在开发的时候,需要关闭这个页面缓存,配置如下。

spring:
  thymeleaf:
    cache: false #关闭缓存

否则会有缓存,导致页面没法及时看到更新后的效果。 比如你修改了一个文件,已经 update 到 tomcat 了,但刷新页面还是之前的页面,就是因为缓存引起的。

其次,也可以在配置文件中指定自己的模板,这里通过yml配置修改:

spring:
  thymeleaf:
    prefix: classpath:/templates/
    check-template-location: true
    suffix: .html
    encoding: UTF-8
    content-type: text/html
    mode: HTML5

说明:

prefix:指定模板所在的目录

check-tempate-location: 检查模板路径是否存在

encoding&content-type:与Servlet中设置输出对应属性效果一致。

5.6.4. Thymeleaf 的使用

前缀:Thymeleaf 源码

通过以下地址查看:

<!DOCTYPE html>
<html lang="en">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1><span th:text="${user1.username}"></span></h1>

</body>
</html>

我们再写一个 controller 来测试一下:

@Controller
@RequestMapping("/test")
public class TestControl {

    @Resource
    private UserRepository dao;

    @RequestMapping("/list")
    public String show(Model model){
        Optional<User> user = dao.findById(8l);
        //获得对象
        User user1 = user.get();
        model.addAttribute("user1",user1);
        return "index";
    }
}

5.6.4.2 th属性

html有的属性,Thymeleaf基本都有,而常用的属性大概有七八个。其中th属性执行的优先级从1~8,数字越低优先级越高。

th:text :设置当前元素的文本内容,相同功能的还有th:utext,两者的区别在于前者不会转 义html标签,后者会。优先级不高:order=7

th:value:设置当前元素的value值,类似修改指定属性的还有th:src,th:href。优先级不 高:order=6

th:each:遍历循环元素,和th:text或th:value一起使用。注意该属性修饰的标签位置,详 细往后看。优先级很高:order=2

th:if:条件判断,类似的还有th:unless,th:switch,th:case。优先级较高:order=3

th:insert:代码块引入,类似的还有th:replace,th:include,三者的区别较大,若使用不 恰当会破坏html结构,常用于公共代码块提取的场景。优先级最高:order=1

th:fragment:定义代码块,方便被th:insert引用。优先级最低:order=8

th:object:声明变量,一般和*{}一起配合使用,达到偷懒的效果。优先级一般:order=4

th:attr:修改任意属性,实际开发中用的较少,因为有丰富的其他th属性帮忙,类似的还有th:attrappend,th:attrprepend。优先级一般:order=5

5.6.4.3 属性需要注意点以下五点:

若要使用Thymeleaf语法,首先要声明名称空间: xmlns:th="http://www.thymeleaf.org"

设置文本内容 th:text,设置input的值 th:value,循环输出 th:each,条件判断 th:if,插入代码块 th:insert,定义代码块 th:fragment,声明变量 th:object

th:each 的用法需要格外注意,打个比方:如果你要循环一个div中的p标签,则th:each属性必须放在p标签上。若你将th:each属性放在div上,则循环的是将整个div。

变量表达式中提供了很多的内置方法,该内置方法是用#开头,请不要与#{}消息表达式弄混。

th:insert,th:replace,th:include 三种插入代码块的效果相似,但区别很大。

5.6.4.4 案例2:th:value用法-form标签
<form action="#" method="post">
    用户名:<input type="text" name="username" th:value="${user1.username}"><br>
    密码:<input type="text" name="pwd" th:value="${user1.pwd}"><br>
</form>
5.6.4.5 案例2:th:object用法和th:value="*{属性名}"用法

在 thymeleaf 模板中,使用 th:object="${}" 来获取对象信息,然后在表单里面可以有三种方式来获取对象属性。如下:

使用 th:value="*{属性名}" 使用 th:value="${对象.属性名}",对象指的是上面使用 th:object 获取的对象 使用 th:value="${对象.get方法}",对象指的是上面使用 th:object 获取的对象

<form action="#" method="post" th:object="${user1}">
    用户名:<input type="text" name="username" th:value="*{username}"><br>
    密码:<input type="text" name="pwd" th:value="*{pwd}"><br>
</form>

可以看出,在 Thymeleaf 中可以像写 java 一样写代码,很方便。

5.6.4.6 案例3: th:each用法-遍历数据

处理 List 的话,和处理上面介绍的对象差不多,但是需要在 thymeleaf 中进行遍历。我们先在 Controller 中模拟一个 List。

@Controller
@RequestMapping("/test")
public class TestControl {

    @Resource
    private UserRepository dao;

    @RequestMapping("/list")
    public String show(Model model){
        List<User> userList = dao.findAll();
        model.addAttribute("userList",userList);
        return "index";
    }
}

 接下来我们写一个 index.html 来获取该 list 信息,然后在 index.html 中遍历。如下:

<table border="1">
    <tr><th>编号</th><th>姓名</th><th>密码</th></tr>
    <tr th:each="user:${userList}">
        <td th:text="${user.id}"></td>
        <td th:text="${user.username}"></td>
        <td th:text="${user.pwd}"></td>
    </tr>
</table>

可以看出,其实和处理单个对象信息差不多,Thymeleaf 使用 th:each 进行遍历,${} 取 model 中传过来的参数,然后自定义 list 中取出来的每个对象,这里定义为 user。表单里面可以直接使用 ${对象.属性名} 来获取 list 中对象的属性值,也可以使用 ${对象.get方法} 来获取,这点和上面处理对象信息是一样的,但是不能使用 *{属性名} 来获取对象中的属性,thymeleaf 模板获取不到。

下标用法:

 

 

5.6.4.6 案例4:th:onclick事件用法

 

5.6.4.7 其他常用 thymeleaf 操作

我们来总结一下 thymeleaf 中的一些常用的标签操作,如下:

标签功能例子
th:value给属性赋值<input th:value="${blog.name}" />
th:style设置样式th:style="'display:'+@{(${sitrue}?'none':'inline-block')} + ''"
th:onclick点击事件th:onclick="'getInfo()'"
th:if条件判断<a th:if="${userId == collect.userId}" >
th:href超链接<a th:href="@{/blogger/login}">Login</a> />
th:unless条件判断和th:if相反<a th:href="@{/blogger/login}" th:unless=${session.user != null}>Login</a>
th:switch配合th:case<div th:switch="${user.role}">
th:case配合th:switch<p th:case="'admin'">administator</p>
th:src地址引入<img alt="csdn logo" th:src="@{/img/logo.png}" />
th:action表单提交的地址<form th:action="@{/blogger/update}">

Thymeleaf 还有很多其他用法,这里就不总结了,具体的可以参考Thymeleaf的官方文档(v3.0)。主要要学会如何在 Spring Boot 中去使用 thymeleaf,遇到对应的标签或者方法,查阅官方文档即可。

5.6.4.8 消除thymeleaf 表达式报红波浪线

如图:

缘由:

我们虽然在后端的model数据中添加了,但是对于前端文件是无法感知的。因为这个时候并没有程序运行,也没有如此的智能。所以这个时候就会有红色波浪线存在了!

解决方案:

结果:  

 

5.6.4.9 thymeleaf 总结

Thymeleaf 在 Spring Boot 中使用非常广泛,本节课主要分析了 thymeleaf 的优点,以及如何在 Spring Boot 中集成并使用 thymeleaf 模板,包括依赖、配置,相关数据的获取、以及一些注意事项等等。最后列举了一些 thymeleaf 中常用的标签,在实际项目中多使用,多查阅就能熟练掌握,thymeleaf 中的一些标签或者方法不用死记硬背,用到什么去查阅什么,关键是要会在 Spring Boot 中集成,用的多了就熟能生巧。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiRS2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值