为什么要用模板引擎:
因为模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这就大大提升了开发效率,良好的设计也使得代码重用变得更加容易。我们司空见惯的模板安装卸载等概念,基本上都和模板引擎有着千丝万缕的联系。模板引擎不只是可以让你实现代码分离(业务逻辑代码和用户界面代码),也可以实现数据分离(动态数据与静态数据),还可以实现代码单元共享(代码重用),甚至是多语言、动态页面与静态页面自动均衡(SDE)等等与用户界面可能没有关系的功能。
什么是模板引擎:
模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的。 他可以生成特定格式的文档,常用的如格式如HTML、xml以及其他格式的文本格式。其工作模式如下:
常见的的模板引擎:
jsp、freemarker、velocity、themleaf
JSP :
优点:
1、功能强大,可以写java代码
2、支持jsp标签(jsp tag)
3、支持表达式语言(el表达式,jstl语法)
4、官方标准,用户群广,丰富的第三方jsp标签库
5、性能良好。jsp编译成class文件执行,有很好的性能表现
缺点:
jsp没有明显缺点,由于可以编写java代码,如使用不当容易破坏结构。
velocity:
较早出现的用于代替jsp的模板语言
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能良好,据说比jsp性能还要好些
3、使用表达式语言,据说jsp的表达式语言就是学velocity的
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多。
3、对jsp标签支持不够好
4、已经很久很久没有维护了。
freemarker
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多
Thymeleaf:
Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎
• Spring官方支持的服务的渲染模板中,并不包含jsp。而是Thymeleaf和 Freemarker等,而Thymeleaf与SpringMVC的视图技术,及SpringBoot的 自动化配置集成非常完美,几乎没有任何成本,你只用关注Thymeleaf的语法 即可。
动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏 览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是 由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示 方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态 地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动 态显示。
开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展 和创建自定义的方言。
多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的 可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
与SpringBoot完美整合:SpringBoot提供了Thymeleaf的默认配置,并且 为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代 码几乎没有任何区别,就是在模板语法上有区别。
Thymeleaf 在页面的使用 – 声明
<html xmlns:th="http://www.thymeleaf.org" >
创建HTML 需要在HTML中的标签中加入:
在页面的需要动态数据的标签上使用th:xx 指令来进行动态 数据的加载
Thymeleaf 在页面的使用 – 使用WebContext中的变量
Thymeleaf通过${...}来获取model中的变量,这是一种ognl表达式。
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个开源项目。
在HTML中的标签上使用th:xx 指令来动态加载变量例如:
注意:如果不支持这种th:的命名空间写法,那么可以把th:text换成 data-th-text
Thymeleaf 在页面的使用 — 自动变量语法糖
当Servlet传递的是一个对象时,Ognl 提供了类似js的语法:
<h1 th:text="${stu.sname}">学生名</h1>
<h1 th:text="${stu.birthday}">学生生日</h1>
<h1 th:text="${stu.score}">成绩</h1>
<h1 th:text=“${stu.bj.classname}”>班级名</h1>
Thymeleaf 在页面的使用 – 对象语法糖
当数据量比较多的时候,频繁的写user.就会非常麻烦。
• 首先,在 父标签上用 th:object="${user}"获取user的值,并且保存
• 然后,在子标签任意元素上,可以通过 *{属性名}的方式,来获取user中的属性,这样 就省去了大量的user.前缀了
<!-- 语法糖 获取对象数据 1.父标签 -->
<div th:object="${stu1}">
<span th:text="*{sid}"></span>
<div th:text="*{sname}"></div>
<input th:value="*{ssex}">
<p th:text="*{birthday}"></p>
<span th:text="*{classid}"></span>
</div>
Thymeleaf 在页面的使用 -- 对象中方法的调用
Thymeleaf 在页面的使用 – 一些java中常用的方法也可以使用
学生的姓名中间有个空格: 可以使用java中的字符串的方法split来进行分割
Thymeleaf 在页面的使用 – 内置对象
Thymeleaf中提供了一些内置对象,并且在这些对象中提供了一些方法。 获取这些对象,需要使用#对象名来引用 或者 使用语法糖。
使用#对象名:
<h1 th:text="${#session.getAttribute('stu')['sname']}"></h1>
语法糖:
<h1 th:text="${session.stu.sname}"></h1>
Thymeleaf 在页面的使用 – 全局对象
Thymeleaf中提供一些便捷的对象来处理页面上的数据
一个日期,我们从数据库中拿出来的格式并不是我们想要的,此时就可以使用全局 对象进行处理。
今天是:<span th:text=“${#dates.format(数据,'yyyy-MM-dd')}">日期</span>
Thymeleaf 在页面的使用 – 算术运算符
支持的算术运算符:+ - * / %
<span th:text="${session.stu.score} + 10"> 分数加10 </span>
<span th:text="${session.stu.score} - 10"> 分数减10 </span>
<span th:text="${session.stu.score} * 10"> 分数乘10 </span>
<span th:text="${session.stu.score} / 10"> 分数除10 </span>
<span th:text="${session.stu.score} % 10"> 分数取余10 </span>
Thymeleaf 在页面的使用 – 比较运算符和逻辑运算符
支持的比较运算:>, = , <= ,==, !=
(但是>, <不建议直接使用,因为xml会解析为标签,要使用别名。)
注意: == 和 != 不仅可以比较数值,类似于equals的功能。
可以使用的别名:
比较:> , < , >= , <= ( gt , lt , ge , le )
等于:== , != ( eq , ne )
支持的逻辑运算 :and , or, not(!)
Thymeleaf 在页面的使用 – 三元运算符
Thymeleaf中的三元运算符跟java中的三元运算符是一样的:
<span th:text="${session.stu.ssex} == 1?'男':'女'"></span>
特殊的三元运算符 — 默认值: 值 ?: 默认值
有的时候,取一个值可能为空,这个时候需要做有一个默认值,可以使用 表达式 ?: 默认值简写
<span th:text="${session.stu.sname} ?: '没名字真可怜'"></span>
当前面的表达式值为null时,就会使用后面的默认值。 注意:?:之间没有空格。
Thymeleaf 在页面的使用 – 逻辑判断
Thymeleaf中使用th:if 或者 th:unless 进行逻辑判断
<!--
th:if="条件为真" 页面元素就渲染到网页上
th:if="条件为假" 页面元素就不会渲染到网页上
th:unless="条件为真" 页面元素就不会渲染到网页上
th:unless="条件为假" 页面元素就渲染到网页上
-->
<div th:if="${sex} == 1">
<input type="radio" name="sex" value="男" checked > 男
<input type="radio" name="sex" value="女" >女
</div>
<div th:if="${sex} == 0">
<input type="radio" name="sex" value="男" > 男
<input type="radio" name="sex" value="女" checked >女
</div>
<hr>
<div th:unless="${sex} == 1">
<input type="radio" name="sex" value="男" checked > 男
<input type="radio" name="sex" value="女" >女
</div>
<div th:unless="${sex} == 0">
<input type="radio" name="sex" value="男" > 男
<input type="radio" name="sex" value="女" checked >女
</div>
以下情况被认定为false:
• 表达式值为false
• 表达式值为0数值
• 表达式值为0字符
• 表达式值为字符串是"false","no","off"
• 其它情况包括null都被认定为false
th:if 和 th:unless 表达式相反的效果
Thymeleaf 在页面的使用 – 分支控制
Thymeleaf中使用两个指令:th:switch 和 th:case 与java中的switch是一样的
需要注意的是,一旦有一个th:case成立,其它的则不再判断。 另外th:case="*"表示默认,放最后。
Thymeleaf 在页面的使用 – 循环控制
Thymeleaf 在页面的使用 – 循环控制
th:each=“变量,状态 : 集合”
状态对象包含以下属性:
• index,从0开始的角标
• count,元素的个数,从1开始
• size,总元素个数
• current,当前遍历到的元素
• even/odd,返回是否为奇偶,boolean值 even偶数,odd奇数
• first/last,返回是否为第一或最后,boolean值
Thymeleaf 在页面的使用 – 字符串拼接
我们经常会用到普通字符串与表达式拼接的情况:
<span th:text=
"'欢迎您:' + ${session.stu.sname} + '!'"></span>
字符串字面值需要用'',拼接起来非常麻烦, Thymeleaf对此进行了简化,使用一对 | 即可:
<div th:text="|欢迎${username}|"></div>
Thymeleaf 在页面的使用 – 在超链接中使用动态数据
在之前做的数据表格中有对数据的删除或修改,需要用到超链接, 每个超链接中携带的参数的值是不同的。
语法:th:href=“@{xxxx(key=value,key2=value2,…)}”
Thymeleaf 在页面的使用 -- 在html内容中使用动态数据
<!-- 两队嵌套的中括号的方式进行页面的格式书写 -->
<div><span style="color:red">欢迎</span>[[${username}]]</div>
同理可以在js中嵌入动态数据:
<script type="text/javascript">
alert('[[${username}]]')
</script>