文章目录

  • 1 引入Thymeleaf
    • 1.1 Thymeleaf是什么?
    • 1.2 Thymeleaf可以处理什么样的模板?
    • 1.3 方言:标准方言
  • 2 一个很棒的虚拟杂货店设计
    • 2.1 一个杂货店的网站
    • 2.2 创建和配置模板引擎
      • 模板解析器
      • 模板引擎
  • 3 使用文本
    • 3.1 多语言的欢迎
      • 使用`th:text`和 externalizing text
      • 语境(上下文)
      • 执行模板引擎
    • 3.2 有关文本和变量的更多信息
      • 未转义的文本
      • 使用和显示变量
  • 4 标准表达式语法
    • 4.1 消息
    • 4.2 变量
      • 表达式基本对象
      • 表达工具对象
      • 在我们的主页中重新格式化日期
    • 4.3 选择表达式(星号语法)
    • 4.4 链接网址
      • 主页的菜单
      • 服务器根目录相对URL
    • 4.5 碎片
    • 4.6 文本
      • 文字文本
      • 数字文本
      • 布尔文本
      • 空文本
      • 文字代币
    • 4.7 附加文本
    • 4.8 文本替代
    • 4.9 算术运算
    • 4.10 比较器和平等
    • 4.11 条件表达式
    • 4.12 默认表达式(Elvis运算符)
    • 4.13 无操作令牌
    • 4.14 数据转换/格式化
    • 4.15 预处理
  • 5 设置属性值
    • 5.1 设置任何属性的值
    • 5.2 将值设置为特定属性
    • 5.3 一次设置多个值
    • 5.4 追加和前置
    • 5.5 固定值布尔属性
    • 5.6 设置任何属性的值(默认属性处理器)
    • 5.7 支持HTML5友好的属性和元素名称
  • 6 迭代
    • 6.1 迭代基础
      • 每个使用
      • 迭代值
    • 6.2 保持迭代状态
    • 6.3 通过延迟检索数据进行优化
  • 7 条件评估
    • 7.1 简单条件:“如果”和“除非”
    • 7.2 切换语句
  • 8 模板布局
    • 8.1 包括模板片段
      • 定义和引用片段
      • 片段规范语法
      • 引用片段不带 th:fragment
      • th:insert和th:replace(和th:include)之间的差异
    • 8.2 可参数化的片段签名
      • 片段局部变量,不带片段参数
      • 声明模板内断言
    • 8.3 灵活的布局:不仅仅是插入片段
      • 使用空片段
      • 使用无操作令牌
      • 片段的高级条件插入
    • 8.4 删除模板片段
    • 8.5 布局继承
  • 9 局部变量
  • 10 属性优先级
  • 11 注释和块(Comments and Blocks)
    • 11.1 标准HTML / XML注释
    • 11.2 Thymeleaf解析器级注释块
    • 11.3 Thymeleaf仅原型注释块
    • 11.4 合成th:block标签
  • 12 内联
    • 12.1 表达式内联
      • 内联与自然模板
      • 禁用内联
    • 12.2 文字内联
    • 12.3 JavaScript内联
      • JavaScript自然模板
      • 高级内联评估和JavaScript序列化
    • 12.4 CSS内联
      • 进阶功能:CSS自然模板等
  • 13 文字模板模式
    • 13.1 文字语法
      • 转义的元素属性
    • 13.2 可扩展性
    • 13.3 纯文本原型注释块:添加代码
    • 13.4 文本解析器级注释块:删除代码
    • 13.5 自然的JavaScript和CSS模板
  • 14 杂货店的更多页面
    • 14.1 订单清单
    • 14.2 订单明细
  • 15 有关配置的更多信息
    • 15.1 模板解析器
      • 链模板解析器
    • 15.2 邮件解析器
      • 标准消息解析器
      • 配置消息解析器
    • 15.3 转换服务
    • 15.4 记录
  • 16 模板缓存
  • 17 解耦模板逻辑
    • 17.1 解耦逻辑:概念
    • 17.2 配置解耦的模板
      • 启用解耦的模板
      • 混合耦合和解耦逻辑
    • 17.3 `th:ref`属性
    • 17.4 解耦模板的性能影响
    • 17.5 解耦逻辑的解析
  • 18 附录A:表达式基本对象
    • 基础对象
    • 请求/会话属性等的Web上下文名称空间
    • Web上下文对象
  • 19 附录B:Expression Utility对象
    • Execution Info
    • Messages
    • URI / URL
    • Conversions
    • Dates
    • Calendars
    • Numbers
    • Strings
    • Objects
    • Booleans
    • Arrays
    • Lists
    • Sets
    • Maps
    • Aggregates
    • IDs
  • 20 附录C:标记选择器语法
    • 多值类匹配

1 引入Thymeleaf

1.1 Thymeleaf是什么?

Thymeleaf是一个现代的服务器端Java模板引擎的web和独立的环境,能够处理HTML, XML, JavaScript, CSS,甚至纯文本。

Thymeleaf的主要目标是提供一种优雅的和高度可维护的方式来创建模板。为了实现这一点,它构建在自然模板的概念上,以不影响模板作为设计原型使用的方式将其逻辑注入模板文件。这改进了设计的交流,并在设计和开发团队之间架起了桥梁。

Thymeleaf的设计从一开始就考虑了Web标准——尤其是HTML5——允许你创建完全验证模板,如果你需要的话。

1.2 Thymeleaf可以处理什么样的模板?

开箱即用,Thymeleaf允许您处理六种模板,其中每一种被称为模板模式:

  • HTML
  • XML
  • TEXT
  • JAVASCRIPT
  • CSS
  • RAW

有两种标记模板模式(HTML和XML)、三种文本模板模式(文本、JAVASCRIPT和CSS)和一种无操作模板模式(RAW)。

HTML模板模式将允许任何类型的HTML输入,包括HTML5、HTML 4和XHTML。将不执行任何验证或格式良好性检查,并且将在输出中尽可能尊重模板代码/结构。

XML模板模式将允许XML输入。在这种情况下,代码应该是格式良好的—没有未关闭的标记,没有未引用的属性,等等—如果发现格式良好性违规,解析器将抛出异常。注意,将不执行任何验证(针对DTD或XML模式)。

文本模板模式将允许对非标记性质的模板使用特殊语法。此类模板的示例可能是文本电子邮件或模板化文档。注意,HTML或XML模板也可以作为文本处理,在这种情况下,它们不会被解析为标记,而每个标记、DOCTYPE、注释等都将被视为纯文本。

JAVASCRIPT模板模式将允许在Thymeleaf应用程序中处理JAVASCRIPT文件。这意味着能够像在HTML文件中一样在JavaScript文件中使用模型数据,但是要使用特定于JavaScript的集成,比如专门的转义或自然脚本。JAVASCRIPT模板模式被认为是文本模式,因此使用与文本模板模式相同的特殊语法。

CSS模板模式将允许处理Thymeleaf应用程序中涉及的CSS文件。与JAVASCRIPT模式类似,CSS模板模式也是一种文本模式,并使用来自文本模板模式的特殊处理语法。

原始模板模式根本不会处理模板。它用于将未触及的资源(文件、URL响应等)插入正在处理的模板中。例如,可以将HTML格式的外部非控制资源包含到应用程序模板中,但要确保这些资源可能包含的任何Thymeleaf代码都不会被执行。

1.3 方言:标准方言

Thymeleaf是一个非常可扩展的模板引擎(事实上它可以被称为模板引擎框架),它允许你定义和自定义的方式,你的模板将被处理到一个精细的细节级别。

将一些逻辑应用到标记工件(标记、一些文本、注释,如果模板不是标记,则仅仅是占位符)的对象称为处理程序,这些处理程序的集合—加上一些额外的工件—通常是方言的组成部分。Thymeleaf的核心库提供了一种称为标准方言的方言,这对大多数用户来说应该足够了。

注意,方言实际上可能没有处理器,并且完全由其他类型的工件组成,但是处理器绝对是最常见的用例。

本教程介绍标准方言。在下面的页面中,您将了解到的每个属性和语法特性都是由这种方言定义的,即使没有明确提到。

当然,如果希望在利用库的高级特性的同时定义自己的处理逻辑,用户可以创建自己的方言(甚至扩展标准的方言)。Thymeleaf也可以配置成同时使用几种方言。

官方thymeleaf-spring3和thymeleaf-spring4集成包都定义一个方言称为“SpringStandard方言”,大部分是一样的标准方言,但小适应更好地利用Spring框架的一些特性(例如,通过使用Spring表达式语言或图像代替OGNL展示出)。因此,如果您是Spring MVC用户,您就不会浪费时间,因为您在这里学到的几乎所有东西都将在您的Spring应用程序中使用。

标准方言的大多数处理器都是属性处理器。这允许浏览器在处理之前正确显示HTML模板文件,因为它们将直接忽略额外的属性。例如,一个使用标记库的JSP可能包含一段不能被浏览器直接显示的代码,比如:

<form:inputText name="userName" value="${user.name}" />

Thymeleaf标准方言将允许我们实现相同的功能与:

<input type="text" name="userName" value="James Carrot" th:value="${user.name}" />

这不仅可以被浏览器正确显示,但这也让我们(可选)指定一个值属性(“James Carrot”,在这种情况下),将显示静态原型时在浏览器中打开, 在处理模板期间,将取代 ${user.name}

这有助于设计人员和开发人员处理相同的模板文件,并减少将静态原型转换为工作模板文件所需的工作。这样做的能力称为自然模板。

2 一个很棒的虚拟杂货店设计

本文所示示例的源代码,以及本指南的后续章节,可以在 Good Thymes Virtual Grocery GitHub repository.

2.1 一个杂货店的网站

为了更好地解释使用Thymeleaf处理模板所涉及的概念,本教程将使用一个演示应用程序,您可以从项目的网站下载。

这个应用程序是一个虚拟杂货店的web站点,它将为我们提供许多场景来展示Thymeleaf的许多特性。

首先,我们的应用程序需要一组简单的模型实体:通过创建订单向客户销售的产品。我们还将管理这些产品的评论:

我们的应用程序还将有一个非常简单的服务层,由包含以下方法的服务对象组成:

public class ProductService {...public List<Product> findAll() {return ProductRepository.getInstance().findAll();}public Product findById(Integer id) {return ProductRepository.getInstance().findById(id);}}

在web层,我们的应用程序将有一个过滤器,根据请求URL将执行委托给thymeleaf启用的命令:

private boolean process(HttpServletRequest request, HttpServletResponse response)throws ServletException {try {// This prevents triggering engine executions for resource URLsif (request.getRequestURI().startsWith("/css") ||request.getRequestURI().startsWith("/images") ||request.getRequestURI().startsWith("/favicon")) {return false;}/** Query controller/URL mapping and obtain the controller* that will process the request. If no controller is available,* return false and let other filters/servlets process the request.*/IGTVGController controller = this.application.resolveControllerForRequest(request);if (controller == null) {return false;}/** Obtain the TemplateEngine instance.*/ITemplateEngine templateEngine = this.application.getTemplateEngine();/** Write the response headers*/response.setContentType("text/html;charset=UTF-8");response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);/** Execute the controller and process view template,* writing the results to the response writer. */controller.process(request, response, this.servletContext, templateEngine);return true;} catch (Exception e) {try {response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);} catch (final IOException ignored) {// Just ignore this}throw new ServletException(e);}}

这是我们的IGTVGController接口:

public interface IGTVGController {public void process(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext, ITemplateEngine templateEngine);    }

我们现在要做的就是创建IGTVGController接口的实现,从服务中检索数据,并使用ITemplateEngine对象处理模板。

最后,它看起来是这样的:

但首先让我们看看模板引擎是如何初始化的。

2.2 创建和配置模板引擎

我们的过滤器中的process(…)方法包含这一行:

ITemplateEngine templateEngine = this.application.getTemplateEngine();

这意味着GTVGApplication类负责创建和配置Thymeleaf应用程序中最重要的对象之一:TemplateEngine实例(ITemplateEngine接口的实现)。

我们的org.thymeleaf.TemplateEngine对象初始化如下:

public class GTVGApplication {...private final TemplateEngine templateEngine;...public GTVGApplication(final ServletContext servletContext) {super();ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);// HTML is the default mode, but we set it anyway for better understanding of codetemplateResolver.setTemplateMode(TemplateMode.HTML);// This will convert "home" to "/WEB-INF/templates/home.html"templateResolver.setPrefix("/WEB-INF/templates/");templateResolver.setSuffix(".html");// Template cache TTL=1h. If not set, entries would be cached until expelledtemplateResolver.setCacheTTLMs(Long.valueOf(3600000L));// Cache is set to true by default. Set to false if you want templates to// be automatically updated when modified.templateResolver.setCacheable(true);this.templateEngine = new TemplateEngine();this.templateEngine.setTemplateResolver(templateResolver);...}}

配置TemplateEngine对象的方法有很多,但是现在,这几行代码就足以告诉我们所需的步骤。

模板解析器

让我们从模板解析器开始:

ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);

模板解析器是实现来自调用的Thymeleaf API的接口的对象

org.thymeleaf.templateresolver.ITemplateResolver

public interface ITemplateResolver {.../** Templates are resolved by their name (or content) and also (optionally) their * owner template in case we are trying to resolve a fragment for another template.* Will return null if template cannot be handled by this template resolver.*/public TemplateResolution resolveTemplate(final IEngineConfiguration configuration,final String ownerTemplate, final String template,final Map<String, Object> templateResolutionAttributes);
}

这些对象负责决定如何访问模板,在这个GTVG应用程序中,org.thymeleaf.templateresolver.ServletContextTemplateResolver 意味着我们要从Servlet上下文中获取模板文件作为资源:应用程序范围的javax.servlet.ServletContext对象存在于每个Java web应用程序中,它从web应用程序根目录解析资源。

但这还不是我们对模板解析器所能说的全部,因为我们可以在它上面设置一些配置参数。

一、模板模式:

templateResolver.setTemplateMode(TemplateMode.HTML);

HTML是ServletContextTemplateResolver的默认模板模式,但是最好还是建立它,以便我们的代码清楚地记录正在发生的事情。

templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");

前缀和后缀修改我们将传递给引擎的模板名称,以获得要使用的实际资源名称。

使用此配置,模板名称“product/list”将对应于:

servletContext.getResourceAsStream("/WEB-INF/templates/product/list.html")

可选地,在模板解析器中通过cacheTTLMs属性配置一个解析后的模板在缓存中的生存时间:

templateResolver.setCacheTTLMs(3600000L);

如果达到了最大缓存大小,并且它是当前缓存中最老的条目,那么在到达TTL之前仍然可以从缓存中删除模板。

用户可以通过实现ICacheManager接口或修改StandardCacheManager对象来管理默认缓存来定义缓存行为和大小。

关于模板解析器还有很多要学习的,但是现在让我们来看看模板引擎对象的创建。

模板引擎

模板引擎对象是org.thymeleaf.ITemplateEngine接口的实现。其中一个实现是由Thymeleaf核心:org.thymeleaf.ITemplateEngine,我们创建了一个实例,它在这里:

templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);

很简单,不是吗?我们只需要创建一个实例并将模板解析器设置为它。

模板解析器是TemplateEngine惟一需要的参数,尽管后面还会介绍许多其他参数(消息解析器、缓存大小等)。现在,这就是我们所需要的。

我们的模板引擎现在已经准备好了,我们可以开始使用Thymeleaf创建我们的页面。

3 使用文本

3.1 多语言的欢迎

我们的第一个任务是为我们的杂货站点创建一个主页。

这个页面的第一个版本将非常简单:只有一个标题和一条欢迎信息。

这是我们的/WEB-INF/templates/home.html文件:

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head><title>Good Thymes Virtual Grocery</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><link rel="stylesheet" type="text/css" media="all" href="../../css/gtvg.css" th:href="@{/css/gtvg.css}" /></head><body><p th:text="#{home.welcome}">Welcome to our grocery store!</p></body></html>

首先你会注意到这个文件是HTML5,它可以被任何浏览器正确显示,因为它不包含任何非html标签(浏览器会忽略所有他们不理解的属性,比如th:text)。

但是你可能也注意到这个模板并不是一个真正有效的HTML5文档,因为我们在th:*表单中使用的这些非标准属性是HTML5规范所不允许的。事实上,我们甚至添加了一个xmlns:th属性到我们的<html>标签,一些绝对非html5的东西:

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

它在模板处理中没有任何影响,但是作为一个incantation,这就避免了我们的IDE抱怨th:*这些属性缺少命名空间定义。

那么,如果我们想让这个模板html5有效呢?简单:切换到Thymeleaf的数据属性语法,使用数据前缀的属性名称和连字符(-)分隔符,而不是分号(

Thymeleaf 中文文档----全译版相关推荐

  1. Thymeleaf中文文档

    文章目录 1 引入Thymeleaf 1.1 Thymeleaf是什么? 1.2 Thymeleaf可以处理什么样的模板? 1.3 方言:标准方言 2 一个很棒的虚拟杂货店设计 2.1 一个杂货店的网 ...

  2. SOCKS 4协议中文文档意译版

    SOCKS协议最初由David Koblas设计,后经Ying-Da Lee改进成SOCKS 4协议. SOCKS4协议主要是如下几个RFC http://ftp.icm.edu.pl/package ...

  3. thymeleaf 中文文档

    https://raledong.gitbooks.io/using-thymeleaf/content/

  4. Phoenix综述(史上最全Phoenix中文文档)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...

  5. perfect-scrollbar 一个全浏览器适用的自定义scrollbar,使用方法 中文文档

    在开发过程中为了保持界面样式的一致性,需要自定义scrollbar的样式,可是只有chrome可以定义样式,IE只能设置颜色,火狐是直接不可以设置,于是就找了这个库,它是github开源的,但没有中文 ...

  6. springboot中文文档_登顶 Github 的 Spring Boot 仓库!艿艿写的最肝系列

    源码精品专栏 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 My ...

  7. Spring Boot中文文档

    1.5.2.RELEASE Part I. Spring Boot 文档 本节简要介绍了Spring Boot文档,是整个文档的参考指南. 您可以完整阅读本参考指南,或者如果您不感兴趣的话可以跳过该部 ...

  8. Beetl2.7.13 中文文档

    ## Beetl2.7.13 中文文档 ### 1. 什么是Beetl Beetl目前版本是2.7.13,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使 ...

  9. Spring Security中文文档

    Spring Security中文文档 来源:https://www.springcloud.cc/spring-security.html#overall-architecture 作者 Ben A ...

最新文章

  1. Kali Linux网络扫描教程(内部资料)
  2. smtplib python教程_python使用smtplib模块发送邮件
  3. React技术栈——webpack
  4. tensorflow教程 开始——Premade Estimators(预制评估器)
  5. 20211006 线性变换
  6. Mysql数据字典导出
  7. office linux版本好用吗,Linux最好的最适合新手的版本是什么
  8. [转载]ASPNET MVC表格呈现利器:MvcContrib.UI.Grid
  9. Cknife与一句话木马提权
  10. What?!“天才黑客”竟是谣言,带你揭露阿里云守护神的秘密
  11. 内存管理API之get_unmapped_area
  12. 栈判断字符串是否为中心对称_数据结构 Stacks 栈
  13. 十一月组队学习报名啦!
  14. VisionPro斑点工具CogBlobTool
  15. 如何拍摄VR全景照片
  16. 股市筹码分布的实现效果
  17. ARP代理(善意的欺骗)
  18. 清博舆情系统_什么是舆情
  19. 算法笔记 (四)算法的逻辑结构和物理结构
  20. laravel门面模式

热门文章

  1. 4.20 视频面试字节_光大银行_神策
  2. Win10连接上了wifi,但显示Internet无网络访问权限的解决方法
  3. 内网安全学习(六)—域横向-内网漫游: Socks 代理
  4. JS前端数据多条件筛选
  5. http请求报错context deadline exceeded (Client.Timeout exceeded while awaiting headers)
  6. 十字路口通行优先权,十字路口通行规则图解
  7. 《深度学习100例》目录
  8. mye连接mysql数据库_MySQL_如何在Java程序中访问mysql数据库中的数据并进行简单的操作,在上篇文章给大家介绍了Myeclip - phpStudy...
  9. 如何降低自动化维护成本?
  10. 用python画漂亮的生日蛋糕_一步一步最简单的最漂亮的画蛋糕