什么是模板引擎?常见的模板引擎有哪些?Thymeleaf的常用指令介绍。_模板引擎是什么-程序员宅基地

技术标签: 大数据  

1.模板引擎是什么?

模板引擎是以业务逻辑层和表现层分离为目的的,将规定格式的模板代码转换为业务数据的算法实现。

它可以是一个过程代码、一个类,甚至是一个类库。不同的模板引擎其功用也不尽相同,但其基本原理都差不多。

2.常见的模板引擎:

常见的模板引擎有:jsp、freemarker、velocity、themleaf

jsp

优点:

        1.功能强大,可以写Java代码

        2.支持jsp标签(jsp tag)

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

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

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

缺点:

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

velocity:

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

优点:

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

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

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

缺点:

1、不是官方标准

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

3、对jsp标签支持不够好

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

freemarker

优点:

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

2、性能非常不错

3、对jsp标签支持良好

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

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

6、使用表达式语言

缺点:

1、不是官方标准

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

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

• Spring官方支持的服务的渲染模板中,并不包含jsp。而是Thymeleaf和 Freemarker等,而Thymeleaf与SpringMVC的视图技术,及SpringBoot的 自动化配置集成非常完美,几乎没有任何成本,你只用关注Thymeleaf的语法 即可。

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

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

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

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

hymeleaf 模板引擎支持多种表达式:

  • 变量表达式:${...}

  • 选择变量表达式:*{...}

  • 链接表达式:@{...}

  • 国际化表达式:#{...}

  • 片段引用表达式:~{...}

 1.引入提示

 在html页面中引入thymeleaf命名空间,即,此时在html模板文件中动态的属性使用th:命名空间修饰 。

<html lang="en" xmlns:th="http://www.thymeleaf.org">

2.变量表达式(获取变量值)

<div th:text="'你是否读过,'+${session.book}+'!!'">
    同EL表达式有些相似的效果,如果有数据,被替换
    完成前后端分离效果(美工代码)
</div>
代码分析:
1.可以看出获取变量值用$符号,对于javaBean的话使用变量名.属性名方式获取,这点和EL表达式一样
2.它通过标签中的th:text属性来填充该标签的一段内容,意思是$表达式只能写在th标签内部,不然不会生效,上面例子就是使用th:text标签的值替换div标签里面的值,至于div里面的原有的值只是为了给前端开发时做展示用的.这样的话很好的做到了前后端分离.意味着div标签中的内容会被表达式${session.book}的值所替代,无论模板中它的内容是什么,之所以在模板中“多此一举“地填充它的内容,完全是为了它能够作为原型在浏览器中直接显示出来。
3.访问spring-mvc中model的属性,语法格式为“${}”,如${user.id}可以获取model里的user对象的id属性 
4.牛叉的循环<li th:each="book : ${books}" >

3.URL表达式(引入URL) 

引用静态资源文件(CSS使用th:href,js使用使用th:src)

href链接URL(使用th:href)

代码分析
1.最终解析的href为:    
  /seconddemo/    
  /seconddemo/usethymeleaf?name=Dear 相对路径,带一个参数   
  /seconddemo/usethymeleaf?name=Dear&alis=Dear 相对路径,带多个参数
  /seconddemo/usethymeleaf?name=Dear&alis=Dear 相对路径,带多个参数
  /seconddemo/usethymeleaf/Dear 相对路径,替换URL一个变量
  /seconddemo/usethymeleaf/Dear/Dear 相对路径,替换URL多个变量
2.URL最后的(name=${name})表示将括号内的内容作为URL参数处理,该语法避免使用字符串拼接,大大提高了可读性
3.@{/usethymeleaf}是Context相关的相对路径,在渲染时会自动添加上当前Web应用的Context名字,假设context名字为seconddemo,那么结果应该是/seconddemo/usethymeleaf,即URL中以”/“开头的路径(比如/usethymeleaf将会加上服务器地址和域名和应用cotextpath,形成完整的URL。
4.th:href属性修饰符:它将计算并替换使用href链接URL 值,并放入的href属性中。
5.th:href中可以直接使用静态地址

 4.选择或星号表达式

<div th:object="${session.user}">
    <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
    <p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
    <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
  </div>

//等价于
<div>
  <p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p>
  <p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
  <p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p>
</div>

5.文字国际化表达式

j简单看一下就可以,文字国际化表达式允许我们从一个外部文件获取区域文字信息(.properties),用Key索引Value,还可以提供一组参数(可选).

#{main.title}    
#{message.entrycreated(${entryId})} 可以在模板文件中找到这样的表达式代码:    
<table>
    <th th:text="#{header.address.city}">
    <th th:text="#{header.address.country}">
</table>

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/blanceage/article/details/125714796

智能推荐

Eclipse 插件精选介绍 -程序员宅基地

文章浏览阅读91次。Eclipse插件之EasyExplorer http://dev2dev.bea.com.cn/bbsdoc/20060124184.html&nbsp;能够在 Eclipse 里面打开资源管理器来浏览当前选中的文件.可以在选项里面输入命令:explorer.exe /n,/e,{0}来打开一个显示树和文件夹内容的浏览窗口. 通过对以上explorer.exe的参数分析,我们可能会有个希..._eclipse插件介绍

牛客真题(35)-青草游戏_给出m个草的点燃位置,在第c秒点燃,最后有几种食物烤熟-程序员宅基地

文章浏览阅读155次。今天继续刷牛客真题,青草游戏分析:找规律,通过规律,判断游戏的输赢。问题:1、Python中if else 的简写方式;方式C++代码:#include<iostream>using namespace std;int main(){ int n; cin>>n; int a[n]; for(int i=0;i<n;i..._给出m个草的点燃位置,在第c秒点燃,最后有几种食物烤熟

ASP.NET MVC Model验证(一)_asp.net viewmodel 验证-程序员宅基地

文章浏览阅读1.2k次。前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的。也会在后面的篇幅中讲解MVC框架中Model验证的机制,以及一些Model验证的方式讲解,本章只是一个简单的示例篇幅,对于有基础的朋友可以直接跳过了(不能耽误大家时间)。_asp.net viewmodel 验证

内核驱动 (五)看门狗_ida_simple_get-程序员宅基地

文章浏览阅读1.6k次。尽管在linux系统中,对于S3C2440开发板来说,默认是已经配置了看门狗定时器,如:Device Drivers ---&gt; [*] Watchdog Timer Support ---&gt; [*] Disable watchdog shutdown on close (NEW) //如果选中, 用户一旦 open 看门狗..._ida_simple_get

iPhone/iOS图片相关(读取、保存、绘制、其它相关)_ios cglayergetcontext-程序员宅基地

文章浏览阅读3.2w次,点赞3次,收藏26次。一.读取图片1.从资源(resource)读取UIImage* image=[UIImage imageNamed:@"1.jpg"];2.从网络读取NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"];UIImag_ios cglayergetcontext

某城市电话号码由三部分组成,分别是:      地区码—— 空白或三位数字;      前缀—— 非‘0’或‘1’开头的三位数字;      后缀—— 4位数字。_某城市电话号码由三部分组成,分别是: 地区码:空白或3位数字; 前缀:非0或1开头的3-程序员宅基地

文章浏览阅读1.3w次,点赞6次,收藏42次。软件测试技术(第二版)题目:某城市电话号码由三部分组成,分别是:地区码——空白或三位数字;前缀——非‘0’或‘1’开头的三位数字;后缀—— 4位数字。假定被测程序能接受一切符合上述规定的电话号码, 拒绝所有不符合规定的电话号码。要求:(1)请选择适当的黑盒测试方法,写出选择该方法的原因,并使用该方法的步骤,给出测试用例表。(2)如果所生成的测试用例不够全面,请考虑用别的测试方法生成一些补充的测试用例。..._某城市电话号码由三部分组成,分别是: 地区码:空白或3位数字; 前缀:非0或1开头的3

随便推点

【抽象代数概念速查】magic square-幻方_magic square线性代数-程序员宅基地

文章浏览阅读240次。如果对角线和反对角线的数加和也都等于magic number_magic square线性代数

CGLIB原理及实现机制学习_cglib methoddelegate-程序员宅基地

文章浏览阅读330次。什么是CGLIBCGLIB(Code Generator Library)是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。为什么使用CGLIBCGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问。我们知道Java中有一个动态代理也是做这个事情的,那我们为什么不直接使用Java动态_cglib methoddelegate

感恩过去,憧憬未来 | 数图2023年成长回顾-程序员宅基地

文章浏览阅读349次,点赞5次,收藏7次。龙腾千里,不忘初心,展望2024年,我们将继续秉持以客户为中心的服务理念,进一步提升产品质量,加大技术创新力度,以满足市场的不断变化和客户的需求,致力于为合作客户企业达成降本增效的良好成果。我们坚信,在全体员工的共同努力下,我们将在新的一年里取得更加丰硕的成果,为公司的未来发展奠定更加坚实的基础,也为我们在零售业和服务领域的广阔前景描绘更加美好的蓝图。数图在2023年取得了丰硕的成果,不仅在合作企业、荣誉奖项、员工规模等方面有了显著提升,还在质量管理、技术创新等方面展现了卓越的实力。岁月不居,时节如流。

JSON详解_json(json(appendix)->0)-程序员宅基地

文章浏览阅读294次。JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在_json(json(appendix)->0)

numpy 找到矩阵中值为nan的元素 numpy.isnan_numpy找出矩阵中nan值-程序员宅基地

文章浏览阅读4.4k次。numpy.isnan(a,axis=None,keepdims=no value)官方文档Test element-wise for NaN and return result as a boolean array.示例import numpy as npa = np.array([[1, 2], [3, np.nan]])print(np.isnan(a))结果[[False False] [False True]]_numpy找出矩阵中nan值

如何防止用一用户同时登陆-程序员宅基地

文章浏览阅读63次。记录用户登陆信息[登陆时间,用户ID]每隔一段时间(如5秒怎么样?)检查存储的登陆信息。如果发现多个,则比较各个的登陆时间,如果自己用的登陆时间比其他的早,则提示并注销。实现:1.把所有登陆用户存在这个全局Application中(建议把这个Application放在基类,方便调用):protected IList<IList> LoginInfo..._如何保证一个账号不允许同时登录