Spring与后端模板引擎的故事

30次阅读

共计 1583 个字符,预计需要花费 4 分钟才能阅读完成。

更多内容,欢迎关注微信公众号:全菜工程师小辉。公众号回复关键词,领取免费学习资料。

现在很多开发,都采用了前后端完全分离的模式,随着近几年前端工程化工具和 MVC 框架的完善,使得这种模式的维护成本逐渐降低。但是这种模式目前并不利于 SEO(前后端分离的 SEO 问题会慢慢改善),而且某些场景使用模板引擎会更方便,比如说邮件模板以及数据变化不频繁的后台系统。
Spring,确切来说是 Spring MVC 除了可以实现 RESTful web 服务之外,还可以使用它提供动态 HTML 内容。Spring MVC 支持多种模板技术,包括 Thymeleaf、FreeMarker 和 JSP 等。

什么是模板引擎?

模板引擎(这里特指用于 Web 开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档。
模板引擎的基本机理就是替换(转换),将指定的标签转换为需要的业务数据;将指定的伪语句按照某种流程来变换输出。

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


Freemarker 和 Velocity 的视频解析器:FreemarkerViewResolver 和 VelocityViewResolver,两种解析器都继承了 AbstractTemplateViewResolver

FreeMarker 视图解析器继承关系:

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: 性能最好,因为先翻译成源码再编译执行,性能优秀

正文完
 0