深色模式
13.2 可扩展性
这种文本语法的一大优势是:它的可扩展性与标记型模板语法(HTML/XML 模式)完全一致。开发者仍可自定义方言(dialects),在其中定义专属的元素和属性(可选择性地为其添加前缀),并直接在文本模板模式中使用这些自定义内容:
text
[#myorg:dosomething myorg:importantattr="211"]some text[/myorg:dosomething]核心解析
1. 可扩展性的核心逻辑
文本模板的 [#元素名 ...] 语法并非仅支持 Thymeleaf 内置的 th:block,而是一套通用的扩展体系:
- 自定义元素:格式为
[#前缀:元素名] ... [/前缀:元素名](如上例的myorg:dosomething),其中myorg是自定义方言的前缀,dosomething是自定义元素名; - 自定义属性:可在元素中添加自定义属性(如上例的
myorg:importantattr="211"),属性也需带上方言前缀,保证命名空间隔离; - 与标记语法一致:扩展规则和开发方式与 HTML 模板中自定义
th:*属性完全相同,无需学习新的扩展逻辑。
2. 扩展价值与场景
- 业务逻辑封装:将通用的文本处理逻辑(如邮件模板中的订单详情渲染、JS 模板中的权限判断)封装为自定义元素,提升模板复用性;
- 命名空间隔离:通过前缀(如
myorg)区分内置语法和自定义语法,避免命名冲突; - 跨模式复用:自定义方言可同时在文本模板(TEXT/JS/CSS)和标记模板(HTML/XML)中使用,一套扩展适配所有模板模式。
3. 示例:自定义邮件模板元素
假设自定义了 myemail:orderitem 元素,用于渲染订单商品行,TEXT 模板中可这样使用:
text
Dear [(${customer.name})],
Your order items:
[#myemail:orderitem myemail:showPrice="true"]
- [(${item.name})] ([(${item.quantity})] pcs)
[/myemail:orderitem]
Total: [(${order.total})] EUR自定义元素 myemail:orderitem 可内置「是否显示价格」「格式化数量」等逻辑,让模板代码更简洁。
总结
- 文本模板语法的可扩展性与标记型语法完全一致,支持自定义方言、元素和属性;
- 自定义内容需通过「前缀:名称」的格式声明,保证命名空间隔离;
- 可扩展性让文本模板能适配复杂业务场景,实现逻辑封装与复用,且跨模板模式通用。
