模板引擎概念:

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

场景使用理解:举个栗子---【开会】
在上高中的时候每次开会都要提前布置场地、拿小板凳。而你上了大学之后每次开会再也不去大操场了,每次开会都去学校的大会议室,桌子板凳音响设备齐全,来之即用……。

模板引擎的功能就类似我们的会议室开会一样拿来即用,将模板设计好之后直接填充数据即可而不需要重新设计整个页面。可以提高页面、代码的复用性。

常见模板引擎

1---【jsp】

Java Server Page,即--- Java服务器页面,根本是一个简化的servlet

优点:

1、功能强大,可以写java代码

2、支持jsp标签(jsp tag)

3、支持表达式语言(el表达式,jstl语法)

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

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

缺点: jsp没有明显缺点,由于可以编写java代码,如使用不当容易破坏mvc结构。


2---【velocity】

velocity是较早出现的用于代替jsp的模板语言

优点:

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

2、性能良好,据说比jsp性能还要好些

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

缺点:

1、不是官方标准

2、用户群体和第三方标签库没有jsp多。

3、对jsp标签支持不够好

4、已经很久很久没有维护了


3---【freemarker】

FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。

优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点: 
1、不是官方标准
2、用户群体和第三方标签库没有jsp多


4---【Thymeleaf】

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

优点:
静态html嵌入标签属性,浏览器可以直接打开模板文件,便于前后端联调

特点:

1、动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。

这是 由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示 方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态 地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。

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

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

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

Thymeleaf常用指令

 1---【在页面的使用 – 声明】

需要在HTML中的标签中加入:在页面的需要动态数据的标签上使用th:xx 指令来进行动态 数据的加载。

2---【在页面的使用 – 使用WebContext中的变量】

Thymeleaf通过${...}来获取model中的变量,这是一种ognl表达式。

小扩展:ognl表达式(以下内容来自于百度百科)

名称:全称是Object-Graph Navigation Language
用途:是一个用来获取和设置 java对象属性的表达式语言。
应用场合:通过使用表达式语法导航对象图,而不是直接调用对象的获取和设置方法可以提供许多应用。比如在XML文件 或者脚本文件中嵌入OGNL表达式语法,在JSP页面 使用OGNL表达式语法来获取javabean中属性值
操作对象:基于当前对象的上下文。

3---【在HTML中的标签上使用th:xx 指令来动态加载变量】

Servlet中的代码:

        //处理乱码response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//获取数据String name ="上山打老虎";//使用sessionHttpSession session = request.getSession();//创建页面容器WebContext contexts = new WebContext(request, response, getServletContext());contexts.setVariable("sname", name);//使用模板引擎解析模板并显示到浏览器templateEngine.process("hahaFile", contexts, response.getWriter());

hahaFile        html中的代码 :

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

穿过传递的是一个对象,需要传递过去对象的属性

//处理乱码response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//创建对象Student su = new Student();su.setSbirthday(new Date());su.setSclassid(0056);su.setSid(2);su.setSname("王老板");su.setSsex("女");//使用sessionHttpSession session = request.getSession();
//      session.setAttribute("stu11", su);//创建页面容器WebContext contexts = new WebContext(request, response, getServletContext());contexts.setVariable("su", su);//使用自建方法的操作//使用模板引擎解析模板并显示到浏览器templateEngine.process("hahaFile", contexts, response.getWriter());

hahaFile        html中的代码:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1 th:object="${su}"></h1>
<hr>
<span th:text="${su.sid}"></span>
<div th:text="${su.sname}"></div>
<p th:text="${su.sbirthday}"></p>
<div th:text="${su.ssex}"></div>
<div th:text="${su.sclassid}"></div>
<hr>
</body>
</html>

 4---【对象中方法的调用】

public String show() {return "我是一个学生,我叫"+this.sname+",我是一个"+this.ssex+"孩子";}

html中代码:

<!-- 调用方法 --><div th:text="${stu1.show()}"></div>

5---【java中的方法】

学生的姓名中间有个空格: 可以使用java中的字符串的方法split来进行分割
    <div th:text="${stu1.sname.split(' ')[0]}"></div>
    <div th:text="${stu1.sname.split(' ')[1]}"></div>

获取session 内置对象的数据 

 Student s2 = new Student();s2.setBirthday(new Date());s2.setClassid(200);s2.setSid(2);s2.setSname("王五");s2.setSsex("男");HttpSession session = request.getSession();session.setAttribute("stu2", s2);

使用方式1:语法糖

前端代码:<div th:text="${session.stu2.sname}"></div>

使用方式2:不使用语法糖

前端代码:<div th:text="${#session.getAttribute('stu2')['sname']}"></div>

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

Student s3 = new Student();s3.setBirthday(new Date());s3.setClassid(300);s3.setSid(3);s3.setSname("赵六");s3.setSsex("女");request.setAttribute("stu3", s3);

前端代码:<div th:text="${#request.getAttribute('stu3').sname}"></div>

6---【全局对象(工具对象)】

servlet中的代码

Student s2 = new Student();s2.setBirthday(new Date());s2.setClassid(200);s2.setSid(2);s2.setSname("王五");s2.setSsex("男");HttpSession session = request.getSession();session.setAttribute("stu2", s2);

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

7---【算术运算符 】

int num=20;
context.setVariable("nums", num)

<span th:text="${nums} +10">数量加10</span>

<span th:text="${nums} -10">数量减10</span>

<span th:text="${nums} *10">数量乘10</span>

<span th:text="${nums} /10">数量除10</span>

8---【比较运算符: >, = , <= ,==, !=】

<span th:text="${nums} >10">数量大于10</span>

9---【逻辑运算符:and , or, not(!)】

String name="上山打老虎";
context.setVariable("hahaname", name);

<div th:text="${hahaname}=='上山打老虎' and ${nums}>10"></div>

10---【三元运算符】

Thymeleaf中的三元运算符跟java中的三元运算符是一样的。

servlet代码:

int sex=1;
context.setVariable("sex", sex);

html代码:

<span th:text="${sex} == 1?'男':'女'"></span>

11---【Thymeleaf 在页面的使用 – 逻辑判断 】

Thymeleaf中使用th:if 或者 th:unless 进行逻辑判断 

<span th:if="${nums} < 20">数量不足</span>
<span th:if="${nums} >= 40">数量刚刚好</span>

12---【Thymeleaf 在页面的使用 – 分支控制 】

Thymeleaf中使用两个指令:th:switch 和 th:case 与java中的switch是一样的

//等级
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>

一旦有一个th:case成立,其它的则不再判断。另外th:case="*"表示默认,放最后。

13---【Thymeleaf 在页面的使用 – 循环控制 】

循环也是非常频繁使用的需求, Thymeleaf中使用th:each指令来完成 与java中的增强for循环类似

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

14---【Thymeleaf 在页面的使用 – 在超链接中使用动态数据 】

在之前做的数据表格中有对数据的删除或修改,需要用到超链接, 每个超链接中携带的参数的值是不同的。 语法: th:href=“@{xxxx(key=value,key2=value2,…)}”

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

简述模板引擎、常见模板引擎以及Thymeleaf常用指令相关推荐

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

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

  2. java调用js模板引擎_JavaScript模板引擎应用场景及实现原理详解

    本文实例讲述了JavaScript模板引擎应用场景及实现原理.分享给大家供大家参考,具体如下: 一.应用场景 以下应用场景可以使用模板引擎: 1.如果你有动态ajax请求数据并需要封装成视图展现给用户 ...

  3. java模板引擎 jade_Jade 模板引擎使用

    在 Express 中调用 jade 模板引擎 jade 变量调用 if 判断 循环 Case 选择 在模板中调用其他语言 可重用的 jade 块 (Mixins) 模板包含 (Includes) 模 ...

  4. java模板引擎 jade_Jade模板引擎使用详解

    在 Express 中调用 jade 模板引擎 jade 变量调用 if 判断 循环 Case 选择 在模板中调用其他语言 可重用的 jade 块 (Mixins) 模板包含 (Includes) 模 ...

  5. 19种最佳HTML5和JavaScript游戏引擎和模板

    您想编写在线游戏吗? 您很幸运,对于任何在线游戏开发人员和有志成为在线游戏开发人员的人来说,这都是一个美好的时光. Flash的时代已经过去,这为数十种(也许数百种!)不同的引擎,库和常见Web语言的 ...

  6. html模板引擎 字符串长度,Web前端模板引擎の字符串模板

    这是一个系列文章,将会介绍目前Web前端领域里用到的三种模板引擎技术,它们分别是: 基于字符串的模板 基于Dom操作的模板 基于虚拟Dom的模板 本文是这个系列的第一篇,着重介绍基于字符串的模板引擎的 ...

  7. ASP 模板引擎,ASP 模板类 (Taihom.Template.class)

    ASP 模板引擎 如想获取最新的这个类,可以写邮件给我 '//ASP 模板引擎 (Taihom.Template.class v2.0) '//Code By Taihom '//Taihom 原创 ...

  8. java 前端模板_前端模板引擎入门

    模板引擎 模板引擎 起到 数据和视图分离的作用, 模板对应视图, 关注如何展示数据, 在模板外头准备的数据, 关注那些数据可以被展示. 后端模板引擎 freemarker 如下介绍,  java后台的 ...

  9. php单独使用blade模板引擎,blade模板的使用

    blade模板简介 在之前的laravel的了解过程中,知道怎么去使用laravel中的blade模板,同时也了解到在laravel中blade模板引擎功能非常强大,在这里不限制开发人员使用原声php ...

最新文章

  1. Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
  2. Codeforces 454C - Little Pony and Expected Maximum
  3. pandas UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb1 in position 0: invalid start byte
  4. 表格字段居左居右规范_Excel之规范数据
  5. web项目404错误统一跳转
  6. thinkphp5多级控制器是什么?怎么使用?
  7. catia linux下载64位,CATIA V5 CATSysDemon.exe缓冲区溢出漏洞
  8. python博客项目评论_Python 爬虫入门——小项目实战(自动私信博客园某篇博客下的评论人,随机发送一条笑话,完整代码在博文最后)...
  9. python小型登录系统_python实现用户登录系统
  10. tcp 组播_深入了解TCP/IP协议
  11. Oracle redo解析之-1、oracle redo log结构计算
  12. LTE之3GPP_协议下载_协议命名
  13. chrome扩展程序_如何实施Chrome扩展程序
  14. 网络渗透测试实验二(网络扫描与网络侦察)
  15. 【Web基础】用户登录注册案例
  16. 挑战程序设计竞赛(算法和数据结构)——14.1互质的集合(并查集)的JAVA实现
  17. STM32L476rg 低功耗模式关系梳理以及stm32duino Lowpower库的调用关系梳理
  18. 2022年中职——网络搭建国赛2脚本写法(超详细解析)
  19. 360手机官方刷机教程(N6系列+N7系列通用)
  20. 使用jenkins去gitlab拉取代码并部署到服务器

热门文章

  1. 本机远程Windows服务器远程桌面不能相互复制粘贴的两种解决方案
  2. nginx启动、停止、重启命令
  3. 单源最短路和多源最短路
  4. 【机器学习】GMM模型的直观推导(含中间步骤)
  5. python组件有多少个_python-计算,排序和重新排列组件
  6. Olivetti PR2/PR2E 打印机故障分析与排除
  7. 版权领域的发展趋势对版权保护有哪些重要意义?
  8. PostgreSQL构建通用标签系统
  9. java程序员进阶必读书单
  10. 看泽塔云如何布局自己的超融合之路