什么是Thymeleaf
- Thymeleaf 官网是这么解释的:Thymeleaf is a modern server-side Java template engine for both web and standalone environments.
- 译过来就是:Thymeleaf是适用于Web和独立环境的现代服务器端
Java模板引擎
常见的其它模板引擎
非前后端分离模板引擎: Thymeleaf 、Velocity、Freemarker
前后端分离基本上是vue、react的天下。
Thymeleaf有什么特点
- 动静分离: Thymeleaf选用html作为模板页,这是任何一款其他模板引擎做不到的!Thymeleaf使用html通过一些特定标签语法代表其含义,但并未破坏html结构,即使无网络、不通过后端渲染也能在浏览器成功打开,大大方便界面的测试和修改。
- 开箱即用: Thymeleaf提供标准和Spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、改JSTL、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
- Springboot官方推荐: Springboot官方做了很多默认配置,开发者只需编写对应html即可,大大减轻了上手难度和配置复杂度。
- 性能提升: 此外,Thymelaf3.0在方言、独立于Java Servlet API、重构核心API、片段表达等方面有着巨大提升和改善,具体可以参看Thymeleaf3十分钟参考指南。
什么是动静分离
看一个图就明白了。
表达式语法
它还带有一些称为标准方言(称为Standard和SpringStandard)的东西,它们定义了一组功能,这些功能应该足以满足大多数情况。可以识别这些标准方言在模板中的使用,因为它将包含以th
前缀开头的属性,如<span th:text="...">
。
请注意,Standard和SpringStandard方言几乎完全相同,只是SpringStandard包含了集成到Spring MVC应用程序中的特定功能(例如,使用Spring表达式语言进行表达式评估而不是OGNL)。
大多数Thymeleaf属性允许将它们的值设置为或包含表达式,由于它们使用的方言,我们将其称为标准表达式。这些表达式可以有五种类型:
${...}
: 变量表达式。*{...}
: 选择表达式。#{...}
: 消息 (i18n) 表达式。@{...}
: 链接 (URL) 表达式。~{...}
: 片段表达式。
更多语法参考:Thymeleaf标准方言 - Thymeleaf教程™ (yiibai.com)
Thymeleaf 模板原理
模板的诞生是为了将显示与数据分离,模板技术多种多样,但其本质是将模板文件和数据通过模板引擎生成最终的 HTML 代码。Thymeleaf 亦是如此。
- 没有模板
没有模板前,我们可以直接用后端语言输出HTML前端,并让浏览器渲染。
- 有了模板
在有了模板后,后端语言只要输出数据(例如 XML 格式、JSON 格式),把数据交给模板引擎,模板引擎根据模板文件和数据进行渲染成HTML文档。
所谓模板引擎,需要把模板文件、数据解析到前端HTML文档流展示给用户看。
目前 Thymeleaf 是面向 Web 和独立环境的现代服务器端 Java 模板引擎,能够处理 HTML,XML,JavaScript,CSS 设置纯文本。
Thymeleaf 工作流程
我们需要提出几个问题
- 当在控制层输出对象,这些对象是怎么被引擎识别
在 Controller 层我们输出了对象 user 和 users 两个对象。这两个对象则被模板引擎托管。
- 引擎加载模版文件的时候,如何识别需要替换的值
模板引擎根据 Controller 中的模板路径 /demo/simple 找到相应的模板文件,模板文件中使用正则表达式查找模板标签语言,Thymeleaf 模板引擎采用 th: 开头。例如 th:value, th:text 。
- 最后引擎是如何吧控制层对象转化成 html 等前段语言输出的
模板引擎找到了模板文件中的模板表达式,模板引擎根据模板表达式中的内容来执行模板处理器,算法把 Controller 输出的对象匹配到模板表达式中。
知识对比追踪
JSTL——JSP Standard Tag Library
JSP标准标签库,是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL1.0 由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器组成。出现在Struts、SpringMVC的框架中比较多,现在由于去JSP化、前后端分离架构基本已经被淘汰了。
EL——Expressiong Language
与JSP的容器上下文结合,获取相应容器范围内的变量内容,EL表达式的格式:用美元符号($)定界,内容包括在花括号({})中;
例如: ${loginInfoBean.suser}OGNL——Object Graph Notation Language
对象图导航语言。是一种可以方便地操作对象属性的开源表达式语言。Struts2中默认支持OGNL。OGNL有如下特点:
- 1、支持对象方法调用,形式如:objName.methodName();
- 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 | 值名],例如: @java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
- 3、支持赋值操作和表达式串联,例如: price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
- 4、访问OGNL上下文(OGNL context)和ActionContext;
- 5、操作集合对象。
标准方言
Thymeleaf称为Standard和SpringStandard的东西,它们定义了一组功能,这些功能应该足以满足大多数情况。可以识别这些标准方言在模板中的使用,因为它将包含以 th前缀开头的属性,如 。Standard和SpringStandard方言几乎完全相同,只是SpringStandard包含了集成到Spring MVC应用程序中的特定功能。