一、模板引擎
模板引擎:为了解决用户界面(显示)与业务数据(内容)分离而产生的。
可以生成特定格式的文档,常用的格式例如:HTML、xml以及其他格式的文本格式。
具体的工作模式如下:
二、常见模板引擎
jsp、freemarker、velocity、themleaf
jsp
优点:
1.功能强大,可以写Java代码
2.支持jsp标签(jsp tag)
3.支持表达式语言(el表达式,jstl语法)
4.官方标准,用户群广泛,有丰富的第三方jsp标签库
5.性能良好。jsp编译成class文件执行,有很好的性能表现
缺点:
没有明显的缺点,由于可以编写java代码,如果使用不当容易破坏结构。
freemarker(目前主流的模板引擎之一)
优点:
1.不能编写java代码,实现严格的mvc分离
2.性能非常不错
3.对jsp标签支持良好
4.内置大量常用功能,使用非常方便
5.宏定义(类似jsp标签)非常方便
6.使用表达式语言
缺点:
1.不是官方的标准
2.用户群体和第三方标签库没有jsp多
velocity(较早代替jsp的模板语言)
一个基于Java的模板引擎。它允许任何人使用简单但功能强大的模板语言来引用Java代码中定义的对象。
优点:
1.不能编写java代码,可以实现严格的mvc分离
2.性能良好,执行速度明显优于jsp
3.使用表达式语言
缺点:
1.不是官方标准
2.用户群体和第三方标签库没有jsp多
3.对jsp标签支持不够好
4.很久已经没有进行维护
themleaf
Themleaf是用来开发Web和独立环境项目的服务器的Java模板引擎。
· Spring官方支持的服务的渲染模板中,并不包含jsp。而是Themleaf和Freemarker等,而Themleaf与SpringMVC的视图技术,及SpringBoot的自动化配置集成非常完美,成本较低,只需要关注Themleaf的语法就行了。
特点一:
动静结合:Themleaf在有无网络的环境下皆可运行,它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。由于它支持html原型,然后在html标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释html时会忽略未定义的标签属性,所以Themleaf的模板可以静态地运行;当有数据返回到页面时,Themleaf标签会动态地替换掉静态内容,使页面动态显示。
开箱即用:提供标准和spring标准两种方言,可以直接套用模板实现JSTL、OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时也可以方便开发人员扩展和创建自定义的方言。
特点二:
多方言支持:Themleaf提供spring标准方言和一个与SpringMVC完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
与SpringBoot完美整合:SpringBoot提供了Themleaf的默认配置,而且为Themleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Themleaf。代码几乎没有任何的区别,只是在模板语法上存在区别。
三、thymeleaf的常用指令
下面我们主要说一下Themleaf的常用指令:
1. th:xx
<html xmlns:th="http"//www.baidu.com">
2. ${}(使用WebContext中的变量,Themleaf通过${..}来获取model中的变量,这是一种ognl表达式)
<h1 th:text="${username}">静态内容</h1>
3. 自动变量语法糖
Student s = new Student();
s.setBirthday(new Date());
s.setScore(90.0);
s.setSname("张三三");
s.setBj(new Banji(1,"超越班"));
WebContext context = new WebContext(request, response, getServletContext());
context.setVariable("stu", s);
templateEngine.process("index", context, response.getWriter());
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>
4. 对象语法糖
我们发现频繁的写stu会比较麻烦所以我们可以进行以下操作:
首先:在父标签上用th:object="${student}"获取student的值,并保存
然后:之后我们就可以在子标签上通过*{属性名}的方式,获取student中的属性。
<form action="" method="post" th:object="${stu}">
<span th:text="*{sid}">100</span>
<input th:value="*{sname}" value="xxx"/><br>
<input th:value="*{birthday}" value="xxx"/><br>
<input th:value="*{score}" value="xxx"/><br>
<span th:text="*{bj.classname}">xxx班</span>
</form>
5. 全局对象
今天是:<span th:text=“${#dates.format(数据,'yyyy-MM-dd')}">日期</span>
6. 三元运算符
Thymeleaf中的三元运算符和java中的三元运算符是一样的:
<span th:text="${session.stu.ssex} == 1?'男':'女'"></span>
值 ?: 默认值
<span th:text="${session.stu.sname} ?: '没名字真可怜'"></span>
注意:当表达式的值为null时,会使用后面的默认值; ?: 之间没有空格
7. 逻辑判断
使用 th:if 或者 th:unless 进行逻辑判断(th:if 和 th:unless 表达相反的结果)
<span th:if="${session.stu.age} < 18">未成年</span>
<span th:if="${session.stu.age} >= 18">成年</span>
8..1 循环控制 (***)
Thymeleaf中使用 th:each 指令完成与java中的增强for循环类似
<table border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>生日</th>
<th>性别</th>
</tr>
<tr th:each="t,stat:${stulist}">
<td th:text="${stat.count}">1</td> -- 元素个数 (与数据库表中的主键无关)
<td th:text="${t.sname}">汤姆</td>
<td th:text="${#dates.format(t.birthday,'yyyy-MM-dd')}">2222-2-22</td>
<td th:text="${t.ssex}==1?'男':'女'">2</td>
</tr>
</table>
8.2 循环控制
th:each = "变量,状态 :集合"
状态对象包含以下属性:
• index,从0开始的角标
• count,元素的个数,从1开始
• size,总元素个数
• current,当前遍历到的元素
• even/odd,返回是否为奇偶,boolean值 even偶数,odd奇数
• first/last,返回是否为第一或最后,boolean值
9. 字符串拼接
普通字符串的拼接:
<span th:text="'欢迎您:' + ${session.stu.sname} + '!'"></span>
简化后:
<span th:text="|欢迎您:${session.stu.sname}|"></span>
10. 在超链接中使用动态数据
对表中的数据进行修改删除时,我们需要用到超链接,并且每个超链接中携带的参数值是不同的。
th:href = "@{xxx(key=value,key2=value2,...)}"
<table border="1">
<tr>
<th>学生编号</th>
<th>学生姓名</th>
<th>学生生日</th>
<th>学生性别</th>
<th>操作</th>
</tr>
<tr th:each="t,x : ${slist}">
<td th:text="${x.count}"></td> -- 学生个数
<td th:text="${t.sname}"></td>
<td th:text="${#dates.format(t.birthday,'yyyy-MM-dd')}">2222-2-22</td>
<td th:text="${t.ssex}==1 ? '男':'女'"></td>
<td><a th:href="@{delstu.do(sid=${t.sid},sname=${t.sname})}">删除</a></td>
</tr>
</table>
11. 在html内容中使用动态数据
语法:[[${xxx}]]
<h1>你好,我是[[${session.stu.sname}]]</h1>
以上我个人对引擎模板的了解和介绍,同时针对Thymeleaf中常用的指令进行的简单的介绍,希望对大家有所帮助。