Spring與后端模板引擎的故事


更多內容,歡迎關注微信公眾號:全菜工程師小輝。公眾號回復關鍵詞,領取免費學習資料。

現在很多開發,都采用了前后端完全分離的模式,隨着近幾年前端工程化工具和MVC框架的完善,使得這種模式的維護成本逐漸降低。但是這種模式目前並不利於SEO(前后端分離的SEO問題會慢慢改善),而且某些場景使用模板引擎會更方便,比如說郵件模板以及數據變化不頻繁的后台系統。
Spring,確切來說是Spring MVC除了可以實現RESTful web服務之外,還可以使用它提供動態HTML內容。Spring MVC支持多種模板技術,包括Thymeleaf、FreeMarker和JSP等。

什么是模板引擎?

模板引擎(這里特指用於Web開發的模板引擎)是為了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用於網站的模板引擎就會生成一個標准的文檔。
模板引擎的基本機理就是替換(轉換),將指定的標簽轉換為需要的業務數據;將指定的偽語句按照某種流程來變換輸出。
什么是模板引擎?

SpringMVC和模板引擎的關系

SpringMVC處理請求的流程圖:
SpringMVC處理請求的流程圖
模板引擎發揮作用是在第8,9,10步驟。

更詳細的原理介紹,點我跳轉

版本支持

重點介紹Velocity,因為其2010年以后連續6年沒有更新,版本停留在1.7,直到最近兩年才有更新,最新版本是2019年3月更新的2.1,但是變化並不大。
Spring官網原文:
As of Spring Framework 4.3, Velocity support has been deprecated due to six years without active maintenance of the Apache Velocity project. We recommend Spring’s FreeMarker support instead, or Thymeleaf which comes with Spring support itself.

Spring Framework 4.3、SpringBoot 1.5刪除了對Velocity的支持, 所以想在后續版本使用,需要手動引入。

模板的繼承關系

JSP使用的視圖解析器:InternalResourceViewResovler繼承了UrlBasedViewResolver
JSP視圖解析器繼承關系


Freemarker和Velocity的視頻解析器:FreemarkerViewResolver和VelocityViewResolver,兩種解析器都繼承了AbstractTemplateViewResolver

FreeMarker視圖解析器繼承關系:
FreeMarker視圖解析器繼承關系
Velocity視圖解析器繼承關系:
Velocity視圖解析器繼承關系

JSP的局限

JSP只能運行在servlet容器中,其他模板引擎沒有限制,而且其他模板引擎並不是只用於web開發(由於提前編譯,JSP的速度也最快)

當SpringBoot啟用一個內嵌的servlet容器啟動時,對JSP的支持有一些限制:

  • 使用tomcat或者使用jetty時,需要使用war包。tomcat/jetty中由於硬編碼了文件模式,可執行jar不能運行JSP
  • Undertow不支持JSP
  • 創建的自定義error.jsp無法覆蓋默認的錯誤處理

在docker中使用JSP要注意:由於jsp渲染后會生成java文件和class文件存放在磁盤,如果使用docker需要指定環境變量中的temp目錄

后端模板引擎對比

  • 學習難度:
    Thymeleaf < Velocity < JSP

Thymeleaf更接近h5語法,現代模板語法

  • 移植性:
    Thymeleaf:移植性強,有Spring生態
    Velocity:移植性強,缺少周邊生態
    JSP:必須是Servlet或者JSP容器

  • 性能:
    Themeleaf:解釋執行,性能較差(后台用,前台最好別用)
    Velocity:解釋執行,性能良好(采用了大量反射)
    JSP:性能最好,因為先翻譯成源碼再編譯執行,性能優秀

哎呀,如果我的名片丟了。微信搜索“全菜工程師小輝”,依然可以找到我


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM