溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Thymeleaf2遷移到Thymeleaf3的示例分析

發(fā)布時間:2021-03-01 11:16:55 來源:億速云 閱讀:184 作者:小新 欄目:web開發(fā)

這篇文章將為大家詳細講解有關(guān)Thymeleaf2遷移到Thymeleaf3的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

十分鐘遷移到Thymeleaf 3  

如果你是打算從Thymeleaf2遷移到Thymeleaf3的用戶。首先,一個好消息是你當前的Thymeleaf模板與Thymeleaf3完全兼容。所以,如果要進行遷移,你只要做一些配置上的修改。

Thymeleaf 3.0 BETA版本是穩(wěn)定且完全覆蓋2.1版本的特性,所以,推薦你進行升級。因為新版本的性能更好而且有許多新的特性。

唯一的問題是,不是所有的Thymeleaf方言(dialect)都遷移到了Thymeleaf 3中。因此,在遷移前要做好這方面的兼容性檢查。

下面來介紹一下Thymeleaf 3中的一些變化和特性。

1. 模板變化

唯一的變化是,推薦你去掉模板中的 th:inline=“text” 屬性。因為在HTML或XML模板中,不再需要該屬性去支持文本中內(nèi)聯(lián)表達式的特性。當然,只是推薦你去去掉該屬性,不去掉,你原來模板一樣可以工作。去掉的好處是會給你帶來執(zhí)行性能方面的提升。

詳細信息可參見下文的 內(nèi)聯(lián)機制 部分。

2. 配置變化

看一個thymeleaf-spring4集成的配置文件例子。

首先你需要更新Maven依賴

<dependency>  
<groupId>org.thymeleaf</groupId>  
<artifactId>thymeleaf</artifactId>  
<version>3.0.0.BETA02</version></dependency><dependency>  
<groupId>org.thymeleaf</groupId>  
<artifactId>thymeleaf-spring4</artifactId>  
<version>3.0.0.BETA02</version></dependency>

然后是spring 配置

@Configuration@EnableWebMvc@ComponentScan("com.thymeleafexamples")
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware
 {
   private ApplicationContext applicationContext;  
   public void setApplicationContext(ApplicationContext applicationContext) {
       this.applicationContext = applicationContext;  
       }  @Bean  
       public ViewResolver viewResolver()
        {    
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();    
        resolver.setTemplateEngine(templateEngine());    
        resolver.setCharacterEncoding("UTF-8");    
        return resolver;  
        }  
        private TemplateEngine templateEngine() {    
        SpringTemplateEngine engine = new SpringTemplateEngine();    
        engine.setTemplateResolver(templateResolver());    
        return engine; 
      } 
       private ITemplateResolver templateResolver() 
       {    
       SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();    
       resolver.setApplicationContext(applicationContext);    
       resolver.setPrefix("/WEB-INF/templates/");    
       resolver.setTemplateMode(TemplateMode.HTML);    
       return resolver; 
        }}

與Thymeleaf 2相比,第一個區(qū)別是,現(xiàn)在推薦的模板解析類是 SpringResourceTemplateResolver。該類依賴于 Spring的ApplicationContext 上下文。因此,你的配置類需要實現(xiàn) ApplicationContextAware 接口。

第二個區(qū)別是。提供了TemplateMode.HTML 枚舉常量。模板類型的方法參數(shù)不再是string類型的。

如果你需要添加其他方言,可以通過engine.addDialect(…)方法,當然你需要先確認Thymeleaf 3是否支持。

你可以到官方下載一些集成配置的例子。

  • Thymeleaf 3 + Spring 4 + Java config example

  • Thymeleaf 3 + Spring 4 + XML config example

  • Thymeleaf 3 + Servlet 3 example

3. 完整的HTML5 標記支持

Thymeleaf 3.0 不再是基于XML結(jié)構(gòu)的。由于引入新的解析引擎,模板的內(nèi)容格式不再需要嚴格遵守XML規(guī)范。即不在要求標簽閉合,屬性加引號等等。當然,出于易讀性考慮,還是推薦你按找XML的標準去編寫模板。

下面的代碼在Thymeleaf 3.0里是合法的:

<p><p th:text=${mytext} ng-app>Whatever

4. 模板類型

Thymeleaf 3 移除了之前版本的模板類型,新的模板類型為:

  • HTML

  • XML

  • TEXT

  • JAVASCRIPT

  • CSS

  • RAW

2個標記型模板(HTML和XML),3個文本型模板(TEXT, JAVASCRIPT和CSS) 一個無操作(no-op)模板 (RAW)。

HTML模板支持包括HTML5,HTML4和XHTML在內(nèi)的所有類型的HTML標記。且不會檢查標記是否完整閉合。此時,標記的作用范圍按可能的最大化處理。

4.1 文本型模板

文本型模板使得Thymeleaf可以支持輸出CSS、Javascript和文本文件。在你想要在CSS或Javascript文件中使用服務端的變量時;或者想要輸出純文本的內(nèi)容時,比如,在郵件中,該特性是否有用。

在文本模式中使用Thymeleaf的特性,你需要使用一種新的語法,例如:

[# th:each="item : ${items}"]  - [# th:utext="${item}" /][/]
4.2 增強的內(nèi)聯(lián)機制

現(xiàn)在可無需額外的標簽,直接在文本中輸出數(shù)據(jù):

This product is called [[${product.name}]] and it's great!

詳見:Inlined output expressions 關(guān)于內(nèi)聯(lián)機制的討論: Refactoring of the inlining mechanism

5. 片段(Fragment)表達式

Thymeleaf 3.0 引入了一個新的片段表達式。形如:~{commons::footer}。

該特性十分有用(真的是是否有用,直接解決了一直困擾我的定義通用的header和footer的問題)。直接看例子來理解一下該語法吧:

<head th:replace="base :: common_header(~{::title},~{::link})">  
<title>Awesome - Main</title>  
<link rel="stylesheet" th:href="@{/css/bootstrap.min.css}">  
<link rel="stylesheet" th:href="@{/themes/smoothness/jquery-ui.css}"></head>

這里,將兩外另個包含<title>和<link>標簽的片段作為參數(shù)傳遞給了common_header片段,在common_header中使用如下:

head th:fragment="common_header(title,links)">  
<title th:replace="${title}">The awesome application</title>  
<!-- Common styles and scripts -->  
<link rel="stylesheet" type="text/css" media="all" th:href="@{/css/awesomeapp.css}">  
<link rel="shortcut icon" th:href="@{/images/favicon.ico}">  
<script type="text/javascript" th:src="@{/sh/scripts/codebase.js}"></script>  
<!--/* Per-page placeholder for additional links */-->  
<th:block th:replace="${links}" /></head>

渲染出結(jié)果如下:

<head>  
<title>Awesome - Main</title>  
<!-- Common styles and scripts -->  
<link rel="stylesheet" type="text/css" media="all" href="/awe/css/awesomeapp.css">  
<link rel="shortcut icon" href="/awe/images/favicon.ico">  
<script type="text/javascript" src="/awe/sh/scripts/codebase.js"></script>  
<link rel="stylesheet" href="/awe/css/bootstrap.min.css">  
<link rel="stylesheet" href="/awe/themes/smoothness/jquery-ui.css"></head>

6. 無操作標記(token)

Thymeleaf 3.0 另一個新的特性就是無操作(NO-OP no-operation)標記,下劃線”_”,代表什么也不做。

例如:

<span th:text="${user.name} ?: _">no user authenticated</span>

當user.name 為空的時候,直接輸出標簽體中的內(nèi)容:no user authenticated。該特性讓我們可以直接使用原型模板中的值作為默認值。

該特性詳細資料參考: The NO-OP token

7 模板邏輯解耦

Thymeleaf 3.0 允許 HTML和XML模式下的模板內(nèi)容和控制邏輯完全解耦。

例如,在3.0版本里,一個“干凈”的home.html模板內(nèi)容如下:

<!DOCTYPE html><html> 
<body>    
<table id="usersTable">      
<tr>        
<td class="username">Jeremy Grapefruit</td>        
<td class="usertype">Normal User</td>      
</tr>      
<tr>        
<td class="username">Alice Watermelon</td>        
<td class="usertype">Administrator</td>      
</tr>    
</table>  
</body></html>

我們只需額外定義一個home.th.xml文件,就可以把之前的home.html文件當作Thymeleaf模板來使用,內(nèi)容如下:

<?xml version="1.0"?><thlogic>  
<attr sel="#usersTable" th:remove="all-but-first">    
<attr sel="/tr[0]" th:each="user : ${users}">      
<attr sel="td.username" th:text="${user.name}" />      
<attr sel="td.usertype" th:text="#{|user.type.${user.type}|}" />    
</attr>  
</attr></thlogic>

邏輯解耦時,指定的屬性會在模本解析的過程中插入指定的位置。通過sel屬性指定選擇器。

邏輯解耦,意味著可以使用純HTML文件作為設(shè)計模板,允許設(shè)計人員不再需要具備Thymeleaf的相關(guān)知識。 詳細介紹: Decoupled Template Logic

8. 性能提升

除了之前提到的特性之外,Thymeleaf 3.0 的另外一個重要突破就是有明顯的性能提升。

2.1版本之前采用的基于XML的模板引擎,雖然有助于實現(xiàn)很多的特性,但是在有些情況下也造成了性能的損失。在絕大多數(shù)的項目里Thymeleaf的渲染時間是幾乎可以忽略不計的,這也就凸顯出來了Thymeleaf在某些特定情景下的性能問題。(例如:在高負載的網(wǎng)站中處理成千上萬行的表格)。

Thymeleaf 3 重點關(guān)注性能問題并完全重寫了引擎。因此與之前版本相比性能有很大的提升。而且,這種提升不僅僅局限于渲染時間,也包括更低的內(nèi)存占用以及在高并發(fā)場景下的低延遲。

關(guān)于Thymeleaf 3 技術(shù)架構(gòu)的討論可參見: New event-based template processing engine

值得一提的是,性能提升不僅是架構(gòu)層面的事,也包括3.0 版本里的一些有助于性能提升的新特性。例如,在3.0版本里使用SpringEL表達式的編譯器(從Spring Framework4.2.4版本開始),在使用Spring的場景下,可進一步的提升性能。具體參見: Configuring the SpringEL compiler

即使沒有使用Spring而是使用OGNL表達式,在3.0版本里也有性能優(yōu)化。Thymeleaf甚至給OGNL代碼庫貢獻了很多源碼,這些代碼有助于提升Thymeleaf在新的MVC1.0(JSR371)標準環(huán)境下的性能。

9. 不依賴于Servlet API

其實Thymeleaf3.0 之前版本在離線執(zhí)行的情況下已經(jīng)做到了不依賴于Java Servlet API,就是說在執(zhí)行模板的過程中不依賴于Web容器。一個實用的場景就是用作郵件模板。

然而,在Thymeleaf3.0里做到了在Web環(huán)境下也完全不依賴Servlet API。這樣就使得與那些不依賴Java Servlet框架(如 vert.x, RatPack, Play Framework)的集成更加簡單方便。

更多參見: New extension point: Link Builders和 Generalisation of the IEngineContext mechanism.

10. 新的方言系統(tǒng)

Thymeleaf 3 提供了新的方言系統(tǒng)。如果你在早期版本上開發(fā)了Thymeleaf的方言,你需要使其與Thymeleaf 3 兼容。

新的方言接口十分簡單

public interface IDialect
 {  
    public String getName();
 }

可以通過實現(xiàn)IDialect的子類接口,實現(xiàn)更多不同的特性。

列舉一下新方言系統(tǒng)增強的點:

除了processors之外,還提供了pre-processors 和 post-processors,模板的內(nèi)容可以在處理之前和之后被修改。例如,我們可以使用pre-processors來緩存內(nèi)容或者用post-processors來壓縮輸出結(jié)果。

提出了方言優(yōu)先級的概念,可以對方言的處理器(processor)進行排序。處理器優(yōu)先級的排序是跨方言的。

對象表達式方言提供可以模本內(nèi)任意地方使用的新的表達式對象和工具對象。如:#strings, #numbers, #dates 等。

11 重構(gòu)了核心API

核心接口進行了深度重構(gòu),詳見:

Refactoring of the Template Resolution API

Refactoring of the Context API

Refactoring of the Message Resolution API

12 總結(jié)

Thymeleaf 3 是Thymeleaf 模板引擎經(jīng)過4年多不懈的努力和工作后的一個重要的里程碑式的成果。提供了許多令人興奮的新特性以及許多隱藏的改進。 所以,別再猶豫,趕緊來試試吧。

關(guān)于“Thymeleaf2遷移到Thymeleaf3的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI