当使用thymeleaf拿域中的对象的属性的时候,如果对象为null会页面报错, 推荐拿取对象属性时给对象加上判断
th:text="${session?.user?.属性名}"简单说,Thymeleaf是一个跟Velocity,FreeMarker类似的模板引擎,它可以完全代替JSP.相比较与其他模板引擎,它有如下三个吸引人的特点:
Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。Thymeleaf 开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。操作步骤:
在pom.xml中引入thymeleaf的支持 <!-- 模板的依赖thymeleaf --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 关闭thymeleaf缓存在application.properties文件中进行如下配置: (开发阶段建议关闭) ################################## ###thymeleaf的默认配置 ################################## #spring.thymeleaf.prefix=classpath:/templates/ #spring.thymeleaf.suffix=.html #spring.thymeleaf.mode=HTML5 #spring.thymeleaf.encoding=UTF-8 #spring.thymeleaf.content-type=text/html #关闭缓存 在开发阶段建议关闭 spring.thymeleaf.cache=false 编写html文件,文件放于resource下的templates目录下,访问方式为/项目名/html文件名 html文件写法: <!DOCTYPE html> <html> <head> <!-- 注意,在Thymeleaf模板文件中,3.0版本之前 标签是需要闭合的, 在3.0之后是不需要的 --> <meta charset="UTF-8"></meta> <title>Insert title here</title> </head> <body> <h2 th:text="${name}"></h2> </body> </html>它们将以html的属性来表示:
<span th:text="${session.user.name}"></span> 选择(星号)表达式 选择表达式很像变量表达式,不过它们用一个预先选择的对象来代替变量容器(Map)来执行,如下: 注意:被指定的object由th:object属性来定义 <div th:object="${session.user}"> <p> <span th:text="*{id}"></span> </p> <p> <span th:utext="*{name}"></span> </p> <p> <span th:text="*{birthday}"></span> </p> </div> URL表达式 <a th:href="@{/find}">查找</a> url还可以设置参数 <a th:href="@{/findById(id=1,name='李四')}">查找</a>常用的th属性 | 关键字 | 功能介绍 | 案例 | | th:id | 替换id | <input th:id="'xxx' + ${collect.id}"/> | | th:text | 文本替换 | <p th:text="${collect.description}">description</p> | |th:utext | 支持html的文本替换 | <p th:utext="${htmlcontent}">conten</p> | | th:object | 替换对象 | <div th:object="${session.user}"> | | th:value | 属性赋值 | <input th:value="${user.name}" /> | | th:with | 变量赋值运算 | <div th:with="isEven=${prodStat.count}%2==0"></div> | |th:style | 设置样式 | th:style="'display:' + @{(${sitrue} ? 'none' : 'inline-block')} + ''" | | th:onclick | 点击事件 | <input th:id="'xxx' + ${collect.id}"/> | | th:each | 属性赋值 | th:each="user,userStat:${users}" | | th:if | 判断条件 | <a th:if="${userId == collect.userId}" > | | th:unless | 和th:if判断相反 | <a th:href="@{/login}" th:unless=${session.user != null}>Login</a> | | th:href | 链接地址 | <a th:href="@{/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'">User is an administrator</p> | | th:fragment | 布局标签,定义一个代码片段,方便其它地方引用 | <div th:fragment="alert"> | | th:include | 布局标签,替换内容到引入的文件 | <head th:include="layout :: htmlhead" th:with="title='xx'"></head> /> | | th:replace | 布局标签,替换整个标签到引入的文件 | <div th:replace="fragments/header :: title"></div> | |th:selected | selected选择框 选中 | th:selected="(${xxx.id} == ${configObj.dd})" | | th:src| 图片类地址引入 | <img class="img-responsive" alt="App Logo" th:src="@{/img/logo.png}" /> | | th:inline | 定义js脚本可以使用变量 | <script type="text/javascript" th:inline="javascript"> | | th:action | 表单提交的地址 | <form action="subscribe.html" th:action="@{/subscribe}"> | | th:th:remove | 删除某个属性 | <tr th:remove="all"> 1.all:删除包含标签和所有的孩子。2.body:不包含标记删除,但删除其所有的孩子。3.tag:包含标记的删除,但不删除它的孩子。4.all-but-first:删除所有包含标签的孩子,除了第一个。5.none:什么也不做。这个值是有用的动态评估。 | | th:attr| 设置标签属性,多个属性可以用逗号分隔 | 比如 th:attr="src=@{/image/aa.jpg},title=#{logo}",此标签不太优雅,一般用的比较少 |
字符串拼接 第一种方式:通过+连接字符串
<!-- 使用+连接字符串 --> <p th:text="'welcome'+${user?.name}"></p>第二种方式:通过|连接字符串
<!-- 使用|连接字符串 --> <p th:text="|welcome+${user?.name}|"></p>条件判断IF/Unless Thymeleaf中使用th:if和th:unless属性进行条件判断,下面的例子中,a标签只有在th:if中条件成立时才显示: th:unless于th:if恰好相反,只有表达式中的条件不成立,才会显示其内容 也可以使用三目元素符: 条件?值1:值2来表示:
for循环th:each 循环状态:
index:当前迭代对象的index(从0开始计算)
count: 当前迭代对象的index(从1开始计算)
size:被迭代对象的大小
current:当前迭代变量
even/odd:布尔值,当前循环是否是偶数/奇数(从0开始计算)
first:布尔值,当前循环是否是第一个
last:布尔值,当前循环是否是最后一个
注意:如果需要对日期进行格式化:使用dates的函数:如下