什么是模板引擎?常见的模板引擎有哪些?thymeleaf的常用指令介绍

一、模板引擎概念

模板引擎 是为了解决用户界面(显示)业务数据(内容)分离而产生的。
它可以生成特定格式的文档,常用的如格式如 HTML xml 以及其他格式的文本格式。其工作模式如下:

 

举个例子,我想买裙子,这时候我会打开某宝,直接在搜索框输入“裙子”,就会出现跟裙子相关的一系列商品,各种颜色,各种样式。那我们来想一下,这么多商品的各种信息是直接全部写死在页面上的嘛?那我们每次查找的商品都不一样,需要的内存就太大了

很显然,并不是,所以这里就体现了我们模板引擎的作用,它可以根据从数据库中实时提取出来的数据对html页面实时的渲染,这,就是模板引擎。

二、模板引擎分类

1.jsp

优点:

功能强大,可以写java代码;

②支持jsp标签(jsp tag);

③支持表达式语言(el表达式,jstl语法);

④官方标准,用户群广,丰富的第三方jsp标签库;

⑤性能良好。jsp编译成class文件执行,有很好的性能表现

缺点:

①虽然是一款功能比较强大的模板引擎,并被广大开发者熟悉,但它前后端耦合比较高。比如说前端的html页面还要手动修改成jsp页面,大大加重了工作量,而且动态和静态资源也是耦合性太高;

②JSP页面的效率没有HTML高,因为JSP是同步加载。而且JSP需要tomcat,但又不支持nginx等,已经跟不上时代的潮流;

PS:目前开发中已经很少用JSP了,只是我们很多时候会在碰到一些以前的框架里有用到JSP技术,但是技多不压身,推荐还是学一下(如果工作不需要,可以不学)。

2.freemarker

优点:

不能编写java代码,可以实现严格的mvc分离;

②性能非常不错;

③对jsp标签支持良好;

④内置大量常用功能,使用非常方便

宏定义(类似jsp标签)非常方便

使用表达式语言

缺点:

不是官方标准

用户群体和第三方标签库没有jsp多;

3.velocity

velocity是一个基于Java的模板引擎,是较早出现的用于代替jsp的模板语言。

优点:

不能编写java代码,可以实现严格的mvc分离;

②性能良好,据说比jsp性能还要好些;

③使用表达式语言,据说jsp的表达式语言就是学velocity的;

缺点:

不是官方标准;

②用户群体和第三方标签库没有jsp多;

③对jsp标签支持不够好;

④已经很久很久没有维护了

4.themleaf

thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎

优点:

语法简洁,功能强大。

特点:

动静结合:

Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。

开箱即用:

Thymeleaf 开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。

多方言支持:

Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

SpringBoot完美整合:

SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。

三、thymeleaf常用指令

Thymeleaf通过 ${...} 来获取model中的变量,这是一种 ognl 表达式。
OGNL Object Graphic Navigation Language( 对象图导航语言 ) 的缩写,他是一个开源项目。

1. 引入 Thymeleaf

修改 html 标签用于引入 thymeleaf 引擎,这样才可以在其他标签里使用 th:xxx 语法,这是下面语法的前提。

<!DOCTYPE html>
<html  xmlns:th="http://www.thymeleaf.org">

 2 .th:text 变量表达式

在HTML中的标签上使用th:xx 指令来动态加载变量例如:
Servlet中的代码
//处理乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
		
//动态数据
String name="易烊千玺";
		
//创建页面容器
WebContext context = new WebContext(request, response, getServletContext());
context.setVariable("username", name);
		
//使用模板引擎解析模板并显示到浏览器  模板名称 页面容器 响应流对象
templateEngine.process("hello", context,response.getWriter());

HTML中的代码 

<h1 th:text="${username}">张三</h1>

 如果Servlet传递是一个对象,我们要过去对象中的属性值:

Servlet中的代码

//创建一个对象
Student s = new Student();
s.setBirthday(new Date());
s.setClassid(1);
s.setSid(10);
s.setSname("李四");
s.setSsex("男");

//将对象存入页面容器中
context.setVariable("stu", s);

//使用模板引擎解析模板并显示到浏览器  模板名称 页面容器 响应流对象
templateEngine.process("hello", context,response.getWriter());

HTML中的代码 

<span th:text="${stu.sid}"></span>
<div th:text="${stu.sname}"></div>
<input th:value="${stu.ssex}">
<p th:text="${stu.birthday}"></p>
<span th:text="${stu.classid}"></span>

语法糖获取对象数据 :父标签  *{属性名}:

HTML中的代码 

<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>

对象中方法的调用:

实体类中的特殊方法

public String method(){
    return "我是一个学生" + this.sname;
}

HTML中的代码 

<h1 th:text="${stu.method()}"></h1>

Java中常用的方法:

HTML中的代码 

<h1 th:text="${stu.sname.split(' ')[0]}"></h1>
<h1 th:text="${stu.sname.split(' ')[1]}"></h1>

获取session内置对象的数据: 

①语法糖 

Servlet中的代码

//创建第二个对象
Student s2 = new Student();
s2.setBirthday(new Date());
s2.setClassid(2);
s2.setSid(8);
s2.setSname("孙悟空");
s2.setSsex("男");

//获取session对象
HttpSession session = request.getSession();
session.setAttribute("stu2", s2);

HTML中的代码 

<h1 th:text="${session.stu2.sname}"></h1>

②不使用语法糖

HTML中的代码 

<h1 th:text="${#session.getAttribute('stu2')['sname']}"></h1>

获取request内置对象的数据 没有语法糖:

Servlet中的代码

//创建第三个对象
Student s3 = new Student();
s3.setBirthday(new Date());
s3.setClassid(3);
s3.setSid(4);
s3.setSname("白骨精");
s3.setSsex("女");

//将对象存入request对象中
request.setAttribute("stu3", s3);

HTML中的代码 

<h1 th:text="${#request.getAttribute('stu3').sname}"></h1>

全局对象:

HTML中的代码 

<div th:text="${#dates.format(session.stu2.birthday,'yyyy-MM-dd')}"></div>

算术运算符:

int num=8;
context.setVariable("num1", num);
<div th:text="${num1} +10"></div>

比较运算符:

<div th:text="${num1} >20"></div>

逻辑运算符:

String name="易烊千玺";
context.setVariable("username", name);
<div th:text="${username}=='易大佬'  and ${num1}>2"></div>

 三元运算符:

//1表示男,0表示女
int sex=1;
context.setVariable("sex", sex);
<div th:text="${sex}==1?  '男' : '女' "></div>

 3 .th:if 逻辑判断

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>

4. th:switch/th:case分支控制:

Thymeleaf中使用两个指令:th:switch 和 th:case 与java中的switch是一样的
PS一旦有一个th:case成立,其它的则不再判断。另外th:case="*"表示默认,放最后。
//等级
int leval=5;
context.setVariable("leval", leval);
<div th:switch="${leval}">
	<img src="img/2.png"  th:case="1">
	<img src="img/3.png"  th:case="2">
	<img src="img/4.png"  th:case="3">
	<img src="img/5.png"  th:case="4">
	<img src="img/1.png"  th:case="*">
</div>

5. 字符串拼接:

<div th:text=" '欢迎' +${username}"></div>
<div th:text=" | 欢迎${username} |"></div>
<div><span style="color: blue;">欢迎</span>[[${username}]]</div>
	
<script type="text/javascript">
	alert("[[${username}]]");
</script>

6. th:each循环控制:

Thymeleaf中使用th:each指令来完成 与java中的增强for循环类似

<table border="1"> 
    <tr>
        <th>编号</th> 
        <th>姓名</th> 
        <th>生日</th> 
        <th>性别</th>
    </tr> 
    <tr th:each="s,stat:${stulist}"> 
        <td th:text="${stat.count}">1</td> 
        <td th:text="${s.sname}">张三</td> 
        <td th:text="${#dates.format(s.birthday,'yyyy-MM-dd')}">2222-2-22</td> 
        <td th:text="${s.ssex}==1?'男':'女'">2</td>
    </tr>
</table>

 7.th:href 在超链接中使用动态数据

<table border="1"> 
    <tr>
        <th>编号</th> 
        <th>姓名</th> 
        <th>生日</th> 
        <th>性别</th>
        <th>操作</th>
    </tr> 
    <tr th:each="s,stat:${stulist}"> 
        <td th:text="${stat.count}">1</td> 
        <td th:text="${s.sname}">张三</td> 
        <td th:text="${#dates.format(s.birthday,'yyyy-MM-dd')}">2222-2-22</td> 
        <td th:text="${s.ssex}==1?'男':'女'">2</td>
        <td><a th:href="@{delstu.do(sid=${s.sid})}">删除</a></td>
    </tr>
</table>

8. 其他常用的指令:

 9. Thymeleaf 标准⽅⾔持以下固定值布尔属性

 

  • 40
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值