现在很多开发,都采用了前后端完全分离的模式,随着近几年前端工程化工具和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继承了UrlBasedViewResolverFreemarker和Velocity的视讯解析器:FreemarkerViewResolver和VelocityViewResolver,两种解析器都继承了AbstractTemplateViewResolver
FreeMarker检视解析器继承关系:
Velocity检视解析器继承关系:
JSP的局限
JSP只能执行在servlet容器中,其他模板引擎没有限制,而且其他模板引擎并不是只用于web开发(由于提前编译,JSP的速度也最快)当SpringBoot启用一个内嵌的servlet容器启动时,对JSP的支援有一些限制:
使用tomcat或者使用jetty时,需要使用war包。tomcat/jetty中由于硬编码了档案模式,可执行jar不能执行JSPUndertow不支援JSP建立的自定义error.jsp无法覆盖预设的错误处理在docker中使用JSP要注意:由于jsp渲染后会生成java档案和class档案存放在磁盘,如果使用docker需要指定环境变数中的temp目录
后端模板引擎对比
学习难度:ThymeleafThymeleaf更接近h5语法,现代模板语法
移植性:Thymeleaf:移植性强,有Spring生态
Velocity:移植性强,缺少周边生态
JSP:必须是Servlet或者JSP容器
效能:Themeleaf:解释执行,效能较差(后台用,前台最好别用)
Velocity:解释执行,效能良好(采用了大量反射)
JSP:效能最好,因为先翻译成源代码再编译执行,效能优秀
更多内容,欢迎关注微信公众号:全菜工程师小辉~