1.什么是模板引擎?
模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的。 它可以生成特定格式的文档,常用的如格式如HTML、xml以及其他格式的文本格式,可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这就大大提升了开发效率,良好的设计也使得代码重用变得更加容易。其工作模式如下:
2.常见的模板引擎有哪些?
jsp、freemarker、velocity、themleaf
2.1、Jsp 优点:
1、功能强大,可以写java代码
2、支持jsp标签(jsp tag)
3、支持表达式语言(el表达式,jstl语法)
4、官方标准,用户群广,丰富的第三方jsp标签库
5、性能良好。jsp编译成class文件执行,有很好的性能表现
缺点: jsp没有明显缺点,由于可以编写java代码,如使用不当容易破坏结构。
2.2、velocity是较早出现的用于代替jsp的模板语言
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能良好,据说比jsp性能还要好些
3、使用表达式语言,据说jsp的表达式语言就是学velocity的
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多。
3、对jsp标签支持不够好
4、已经很久很久没有维护了。
2.3、freemarker 优点:
1、不能编写java代码,可以实现严格的mvc分离 。
2、性能非常不错。
3、对jsp标签支持良好。
4、内置大量常用功能,使用非常方便。
5、宏定义(类似jsp标签)非常方便 。
6、使用表达式语言 。
缺点:
1、不是官方标准。
2、用户群体和第三方标签库没有jsp多。
3.Thymeleaf。
3.1、Thymeleaf的四个特点。
动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏 览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是 由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示 方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态 地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动 态显示。
开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展 和创建自定义的方言。
多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的 可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
与SpringBoot完美整合:SpringBoot提供了Thymeleaf的默认配置,并且 为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代 码几乎没有任何区别,就是在模板语法上有区别。
3.2、thymeleaf的常用指令介绍。
Thymeleaf 在页面的使用 – 声明
创建HTML
需要在HTML中的标签中加入:在页面的需要动态数据的标签上使用th:xx 指令来进行动态数据的加载
Thymeleaf 在页面的使用 – 使用WebContext中的变量
Thymeleaf通过${...}来获取model中的变量,这是一种ognl表达式。
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个开源项目。
注意:如果不支持这种th:的命名空间写法,那么可以把th:text换成 data-th-text。
例如:<h1 th:text="${username}">无名</h1>
Thymeleaf 在页面的使用 — 自动变量语法糖 如果Servlet传递是一个对象,我们要过去对象中的属性值,那 该怎么办呢?
Thymeleaf 在页面的使用 — 自动变量语法糖
如果Servlet传递是一个对象,我们要过去对象中的属性值,那该怎么办呢?
例如:<h1 th:text="${student.name}">学生姓名</h1>
Thymeleaf 在页面的使用 – 对象语法糖
当数据量比较多的时候,频繁的写user.就会非常麻烦。
• 首先,在 父标签上用 th:object="${user}"获取user的值,并且保存
• 然后,在子标签任意元素上,可以通过 *{属性名}的方式,来获取user中的属性,这样就省去了大量的user.前缀了
Thymeleaf 在页面的使用 -- 对象中方法的调用
如果实体类中有特殊的方法,在页面想要使用:
<h1 th:text="${student.show()}">方法名</h1>
Thymeleaf 在页面的使用 – 一些java中常用的方法也可以使用
学生的姓名中间有个空格: 可以使用java中的字符串的方法split来进行分割
<h1 th:text="${student.name.split('')[0]}"></h1>
Thymeleaf 在页面的使用 – 内置对象
Thymeleaf中提供了一些内置对象,并且在这些对象中提供了一些方法。 获取这些对象,需要使用#对象名来引用或者使用语法糖。
Thymeleaf 在页面的使用 – 常用内置对象
Thymeleaf 在页面的使用 – 全局对象
Thymeleaf中提供一些便捷的对象来处理页面上的数据
Thymeleaf 在页面的使用 – 运算符
运算符包括:算数运算符 , 比较运算符 ,逻辑运算符 ,三元运算符 ,三元运算符默认值式 。
支持的算术运算符:+ - * / %。
支持的比较运算:>, = , , , < , >= , <= ( gt , lt , ge , le ) 等于:== , != ( eq , ne )
>,<不建议使用。
比较:>,<,>=,<= (gt,lt,ge,le)
等于:==,!=(eq,ne)
支持的逻辑运算 :and , or, not(!)
Thymeleaf 在页面的使用 – 三元运算符
Thymeleaf中的三元运算符跟java中的三元运算符是一样的:
特殊的三元运算符 — 默认值: 值 ?: 默认值 有的时候,取一个值可能为空,这个时候需要做有一个默认值,可以使用表达式 ?: 默认值简写
当前面的表达式值为null时,就会使用后面的默认值。 注意:?:之间没有空格。
Thymeleaf 在页面的使用 – 逻辑判断
Thymeleaf中使用th:if 或者 th:unless 进行逻辑判断.
Thymeleaf 在页面的使用 – 分支控制
Thymeleaf中使用两个指令:th:switch 和 th:case 与java中的switch是一样的.
Thymeleaf 在页面的使用 – 循环控制
循环也是非常频繁使用的需求, Thymeleaf中使用th:each指令来完成 与java中的增强for循环类似。
Thymeleaf 在页面的使用 – 循环控制
th:each=“变量,状态 : 集合” 状态对象包含以下属性:
• index,从0开始的角标
• count,元素的个数,从1开始
• size,总元素个数
• current,当前遍历到的元素
• even/odd,返回是否为奇偶,boolean值 even偶数,odd奇数
• first/last,返回是否为第一或最后,boolean值
Thymeleaf 在页面的使用 – 字符串拼接
字符串字面值需要用'',拼接起来非常麻烦, Thymeleaf对此进行了简化,使用一对|即可。
Thymeleaf 在页面的使用 – 在超链接中使用动态数据
在之前做的数据表格中有对数据的删除或修改,需要用到超链接, 每个超链接中携带的参数的值是不同的。 语法: th:href=“@{xxxx(key=value,key2=value2,…)}”。
Thymeleaf 在页面的使用 -- 在html内容中使用动态数据
有的时候我们需要在标签的文本中嵌入一个动态数据, 可以使用[[${xxx}]],同理可以在js中嵌入动态数据。
Thymeleaf 在页面的使用 – 常用的指令