0


什么是模板引擎?常见的模板引擎有哪些?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 标准⽅⾔还⽀持以下固定值布尔属性

标签: 大数据 html java

本文转载自: https://blog.csdn.net/m0_67942533/article/details/125671686
版权归原作者 崇令 所有, 如有侵权,请联系我们删除。

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

还没有评论