概述
Thymeleaf是一个服务器端的JAVA模板引擎,通过java获取数据,html构造视图,组装成html模板(由于jsp视图化的页面每次刷新都会重新调用数据,对服务器端造成压力,使用模板引擎就可以每隔一段时间刷新一次模板,减少了服务器的压力)
流行的Java引擎:Velocity,Freemarker,Thymeleaf(Spring官方推荐)
模板引擎的构建(Web应用)
- 定义引擎对象
- 创建解析器
- 封装数据
- 将模板解析发送到客户端,或目标文件
代码演示
//1.声明引擎对象
TemplateEngine engine = new TemplateEngine();
//2.创建servlet模板解析器(web应用)
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(req.getServletContext());
resolver.setPrefix("templates/");
resolver.setSuffix(".html");
resolver.setCharacterEncoding("UTF-8");
engine.setTemplateResolver(resolver);
//3.封装数据
WebContext context = new WebContext(req, resp, req.getServletContext());
//4.根据模板生成文件发送到客户端
engine.process(tplName, context, resp.getWriter());
标准表达式
简单表达式
- ${…}:变量表达式
${x}:来自Context或request当中的值
${session.x}:来自session中的值
${application.x}:来自application中的值
- *{…}:选择变量表达式(可以选定某一个元素)
- #{…}:消息表达式,从外部资源文件获取值(消息表达式用于从消息源中提取消息内容实现国际化)
- @{…}:url连接表达式,在th:href中使用,可以在连接中添加变量
- ~{…}:片段表达式,在th:fragment中可以将其他文件中的代码片段加入
文字
文本文字:‘text’
文本操作
|The name is ${name}|:文本替换,将文本和变量连接
指令
处理文本—th:text/th:utext
<p th:text="'hi'">hello</p>
th:text指令可以替换标签中间的内容,如上,生成到浏览器端的html代码为<p>hi</p>
<p th:utext="'<p></p>'"></p>
th:utext可以识别html标签,如上,如果用th:text则会在页面显示p标签的代码文本,而用th:utext会在标签中间嵌套一个p标签
循环迭代—th:each
<ol th:each="prod:${prods}">
<li th:text="${prod.name}"></li>
<li th:text="${prod.isStock}?${true}:${false}">yes</li>
</ol>
如上,th:each="prod:$ {prods}"表示遍历$ {prods},prod(迭代变量)相当于${prods}(迭代表达式)中的每一个元素
url连接—th:href
<a th:href="@{servlet/name={name}(${user.getName()})}"></a>
<a th:href="@{|servlet/name=${user.getName()}|}"></a>
<a th:href="@{servlet/name=+${user.getName()}}"></a>
与href属性的区别在于,th:href中可以依照上方语法在url中加上变量值,在传参时起作用,th:href会替换掉原有的href中的值,需要使用链接表达式
片段共用—th:fragment+th:replace/th:insert
<div th:fragment="片段名"></div>
<div th:replace="~{模板名::片段名}"></div>
<div th:insert="~{模板名::片段名}"></div>
- 页面的头部和尾部可能重复,可以使用th:fragment、th:replace、th:insert来进行片段共用,作用和html中的iframe类似
- th:fragment定义需要共用的片段
- th:replace为片段替换,在th:replace中使用片段表达式,大括号中使用模板名::片段名的形式来替换
- th:insert作用是插入片段,即将片段加在原片段内,结果
<div><div></div></div>
条件—th:if/th:unless/th:switch+th:case
th:if
<div th:if="条件"></div>
当条件满足时,标签生效,当条件不满足时,标签无效
th:unless
<div th:unless="条件"></div>
当条件满足时,标签无效;当条件不满足时,标签生效;th:unless与th:if相反
注意
th:if属性不仅只以布尔值作为判断条件。 它的功能有点超出这⼀点,它将按照这些规则判定指定的表达式值为true:、
- 表达式的值不为null
- 表达式的值为布尔值时,且为true
- 表达式的值为数字时,并且不为0
- 表达式的值为字符时,并且不为0
- 表达式的值式字符串时,并且不为"false"、“no”、“off”
- 如果值不是布尔值,数字,字符或字符串且不为空
th:switch
<div th:switch="判断标准">
<p th:case="待判断变量"></p>
</div>
与java中的switch相同,当待判断变量满足判断标准时,标签生效,否则标签无效,带有th:switch的标签是否生效与条件无关
代码块—th:block
<th:block></th:block>
th:block是当标签用的指令,它不会被转化为html标签,而是直接将文本代码加入
设置属性值—th:attr
<img th:src=""></img>
<a th:href=""></a>
可以通过th:attr的方式用thymeleaf来写入属性,属性中就可以用到变量表达式,对于链接需要用到链接表达式才能解析