Thymeleaf2遷移到Thymeleaf3的示例分析

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

專(zhuān)業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來(lái)客戶(hù)和效益!創(chuàng)新互聯(lián)為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)負(fù)責(zé)任的成都網(wǎng)站制作公司!

十分鐘遷移到Thymeleaf 3 

如果你是打算從Thymeleaf2遷移到Thymeleaf3的用戶(hù)。首先,一個(gè)好消息是你當(dāng)前的Thymeleaf模板與Thymeleaf3完全兼容。所以,如果要進(jìn)行遷移,你只要做一些配置上的修改。

Thymeleaf 3.0 BETA版本是穩(wěn)定且完全覆蓋2.1版本的特性,所以,推薦你進(jìn)行升級(jí)。因?yàn)樾掳姹镜男阅芨枚矣性S多新的特性。

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

下面來(lái)介紹一下Thymeleaf 3中的一些變化和特性。

1. 模板變化

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

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

2. 配置變化

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

首先你需要更新Maven依賴(lài)

<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相比,第一個(gè)區(qū)別是,現(xiàn)在推薦的模板解析類(lèi)是 SpringResourceTemplateResolver。該類(lèi)依賴(lài)于 Spring的ApplicationContext 上下文。因此,你的配置類(lèi)需要實(shí)現(xiàn) ApplicationContextAware 接口。

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

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

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

  • Thymeleaf 3 + Spring 4 + Java config example

  • Thymeleaf 3 + Spring 4 + XML config example

  • Thymeleaf 3 + Servlet 3 example

3. 完整的HTML5 標(biāo)記支持

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

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

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

4. 模板類(lèi)型

Thymeleaf 3 移除了之前版本的模板類(lèi)型,新的模板類(lèi)型為:

  • HTML

  • XML

  • TEXT

  • JAVASCRIPT

  • CSS

  • RAW

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

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

4.1 文本型模板

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

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

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

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

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

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

5. 片段(Fragment)表達(dá)式

Thymeleaf 3.0 引入了一個(gè)新的片段表達(dá)式。形如:~{commons::footer}。

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

<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>

這里,將兩外另個(gè)包含<title>和<link>標(biāo)簽的片段作為參數(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. 無(wú)操作標(biāo)記(token)

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

例如:

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

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

該特性詳細(xì)資料參考: The NO-OP token

7 模板邏輯解耦

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

例如,在3.0版本里,一個(gè)“干凈”的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>

我們只需額外定義一個(gè)home.th.xml文件,就可以把之前的home.html文件當(dāng)作Thymeleaf模板來(lái)使用,內(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>

邏輯解耦時(shí),指定的屬性會(huì)在模本解析的過(guò)程中插入指定的位置。通過(guò)sel屬性指定選擇器。

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

8. 性能提升

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

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

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

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

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

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

9. 不依賴(lài)于Servlet API

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

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

更多參見(jiàn): New extension point: Link Builders和 Generalisation of the IEngineContext mechanism.

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

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

新的方言接口十分簡(jiǎn)單

public interface IDialect
 {  
    public String getName();
 }

可以通過(guò)實(shí)現(xiàn)IDialect的子類(lèi)接口,實(shí)現(xiàn)更多不同的特性。

列舉一下新方言系統(tǒng)增強(qiáng)的點(diǎn):

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

提出了方言?xún)?yōu)先級(jí)的概念,可以對(duì)方言的處理器(processor)進(jìn)行排序。處理器優(yōu)先級(jí)的排序是跨方言的。

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

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

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

Refactoring of the Template Resolution API

Refactoring of the Context API

Refactoring of the Message Resolution API

12 總結(jié)

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

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

文章題目:Thymeleaf2遷移到Thymeleaf3的示例分析
網(wǎng)頁(yè)URL:http://bm7419.com/article26/igshcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、企業(yè)網(wǎng)站制作、建站公司、定制網(wǎng)站、標(biāo)簽優(yōu)化、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司