Thymeleaf擴展
擴展Thymeleaf很容易:只需要創建一個方言並將其添加到模板引擎。 下面來看看,如何一步步地實現。
所有在這裏看到的代碼都來自一個工作應用程序。可以從GitHub倉庫查看或下載源代碼。
1. 方言
Thymeleaf方言(Dialects)是可以在模板中使用的一組功能。 這些功能包括:
- 處理邏輯 - 通過適用於標籤中的屬性的處理器(或標籤本身)指定處理邏輯。
- 預處理和後處理邏輯通過預處理器和後處理器指定,實際上在處理之前(之前)或之後(後處理)應用於模板。
- 表達式對象可用於Thymeleaf標準表達式(如
#array
,#dates
等),以執行可能需要的操作。
所有這些功能都是可選的,方言只能指定其中的一部分。 例如,一個方言可能不需要指定任何處理器,但是可以聲明幾個表達式對象。
如果已經看到用標準方言編寫的代碼片段,應該注意到,可處理的屬性以th:
開頭。 這個「th」
被稱爲方言前綴,這意味着由該方言處理的所有標籤和屬性將以這樣的前綴開頭。 每種方言都可以指定自己的前綴。
同樣重要的是要注意,一個模板引擎可以一次設置多個方言,從而允許處理包括來自所有指定方言的特徵的模板(將方言看作是一種JSP標籤庫)。 更重要的是,這些方言中的一些可以共享前綴,有效地作爲一種方言。
2. 最簡單的方言
這裏將在應用程序中創建一個方言。 這將是一個Spring MVC應用程序,所以將要已經使用SpringStandard方言(更多細節參見Thymeleaf + Spring教程)。 但是想添加一個新的屬性,向請求的客戶端顯示問候語,如下所示:
<p hello:sayto="World">Hi ya!</p>
2.1 處理器
首先,需要創建屬性處理器來處理顯問候語消息。
所有處理器都實現org.thymeleaf.processor.IProcessor
接口,特別是標記處理器實現org.thymeleaf.processor.element.IElementTagProcessor
接口,因爲它是一個處理器,它適用於元素(以XML/HTML術語),這種元素的開放標籤。
另外,這個處理器會被這個開放標籤(hello:sayto
)中的指定屬性觸發,所以將擴展一個有用的抽象類,它將給出大部分的類基礎結構:org.thymeleaf.processor.element.AbstractAttributeTagProcessor
。請參考下面代碼的實現 -
public class SayToAttributeTagProcessor extends AbstractAttributeTagProcessor {
private static final String ATTR_NAME = "sayto";
private static final int PRECEDENCE = 10000;
public SayToAttributeTagProcessor(final String dialectPrefix) {
super(
TemplateMode.HTML, // This processor will apply only to HTML mode
dialectPrefix, // Prefix to be applied to name for matching
null, // No tag name: match any tag name
false, // No prefix to be applied to tag name
ATTR_NAME, // Name of the attribute that will be matched
true, // Apply dialect prefix to attribute name
PRECEDENCE, // Precedence (inside dialect's precedence)
true); // Remove the matched attribute afterwards
}
protected void doProcess(
final ITemplateContext context, final IProcessableElementTag tag,
final AttributeName attributeName, final String attributeValue,
final IElementTagStructureHandler structureHandler) {
structureHandler.setBody(
"Hello, " + HtmlEscape.escapeHtml5(attributeValue) + "!", false);
}
}
2.2 方言類
創建處理器非常簡單,但現在還需要創建方言類,負責告訴Thymeleaf處理器是可用的。
最基本的方言接口:org.thymeleaf.dialect.IDialect
只告訴Thymeleaf一個特定的類是方言。 但是引擎需要知道那個創建的方言能夠提供什麼,並且聲明方言類,需要實現一組或幾組IDialect
子接口。
具體來說,out
方言將提供*
處理器,因此它將實現org.thymeleaf.dialect.IProcessorDialect
。 爲了更容易一些,這裏不是直接實現接口,而是擴展一個名爲org.thymeleaf.dialect.AbstractProcessorDialect
的抽象類,參考以下代碼:
public class HelloDialect extends AbstractProcessorDialect {
public HelloDialect() {
super(
"Hello Dialect", // Dialect name
"hello", // Dialect prefix (hello:*)
1000); // Dialect precedence
}
/*
* Initialize the dialect's processors.
*
* Note the dialect prefix is passed here because, although we set
* "hello" to be the dialect's prefix at the constructor, that only
* works as a default, and at engine configuration time the user
* might have chosen a different prefix to be used.
*/
public Set<IProcessor> getProcessors(final String dialectPrefix) {
final Set<IProcessor> processors = new HashSet<IProcessor>();
processors.add(new SayToAttributeTagProcessor(dialectPrefix));
return processors;
}
}
3. 使用Hello方言
使用上面創建這個新方言非常簡單。 這是一個Spring MVC應用程序,只需在配置期間將它添加到templateEngine
Bean。如下代碼所示 -
@Bean
public SpringTemplateEngine templateEngine(){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setEnableSpringELCompiler(true);
templateEngine.setTemplateResolver(templateResolver());
templateEngine.addDialect(new HelloDialect());
return templateEngine;
}
請注意,通過使用addDialect()
,而不是setDialect()
,告訴引擎除了默認的StandardDialect
之外,還想使用新的方言。 所以所有的標準th:*
屬性也將可用。
現在需要新屬性可以無縫工作,如下:
<p>Hello World!</p>